2017-02-08 16 views
0

Как и вопрос this, я хотел бы знать, есть ли способ, чтобы ctags распознал указатель на процедуру, и, конечно, там, где он указывает.ctags с указателями процедур в Fortran

Пример:

if(code_is_2D) then 
    get_convective => get_convective_2D 
else 
    get_convective => get_convective_3D 
end if 

При нажатии на CTRL-]get_convective, Я хотел бы быть приняты в зависимости от того, процедура он указывает. Я попытался добавить --fortran-kinds=+i, но это не сработало.

Edit:

я не знаю, что было несколько версий Ctags (exhuberant/универсальный) до комментария LucHermitte в. Я использовал первый. Я удалил его и установил universal-ctags. Теперь, когда вы используете флаги --fortran-kinds=+i, меня переносят в определение указателя процедуры и НЕ фактическую процедуру, на которую он указывает.

+0

Вы используете заброшенные exhuberant-ctags или его поддерживаемые вилки, то есть универсальные-ctags? –

+0

@LucHermitte Смотрите править – solalito

ответ

0

Единственные поля в файле tags, которые важны для Vim, когда вы делаете <C-]> являются:

  • тег,
  • имя файла,
  • команда Ex используется для поиска метки.

Другие поля не используются вообще.

Когда вы делаете <C-]>, Vim ищет слово под вашим курсором в начале каждой строки вашего tags файла. Что-то вроде:

/^\<get_convective\> 

Затем он открывает связанное имя файла и выполняет связанную команду Ex. Что-то вроде:

:e path/to/filename 
:/^\ \ \ \ get_convective 

Но вы не хотите, сама get_convective тег, вы хотите все, что указывает на в коде. Проблема здесь, является то, что Vim:

  • не понимает код,
  • никогда не будет смотреть на то, что указывает на то, что в контексте поиска тегов.

Кроме того, Ctags себя:

  • не понимает код либо,
  • не записывает, что отношения в любом случае.

Таким образом, вы почти наверняка нужны пользовательские функции, как этот:

function! JumpToTagOrInterface() 
    let this_line = getline('.') 
    if this_line =~ '=>' && col('.') < stridx(this_line, '=>') 
     execute 'tag' matchstr(this_line, '\S\{-}$') 
    else 
     tag <cword> 
    endif 
endfunction 
nnoremap <key> :call JumpToTagOrInterface()<CR> 

Обратите внимание, что эта функция предполагает, что ваши интерфейсы индексируются Ctags.