Получить ctags в vim, чтобы перейти к определению, а не к объявлению

У меня проблема, что ctags в vim / gvim приводит меня к переднему объявлению много раз, а не к фактическому определению функции.

любой способ обойти это?

9 ответов


Я думаю, что самый простой способ-использовать "G ctrl -] "вместо" ctrl -]". Если есть только одна спичка, она приведет вас туда. Если есть несколько совпадений, он перечислит их все, позволяя вам выбрать тот, который вы хотите, так же, как :tselect. Лучшее из обоих миров. :)


вы должны иметь возможность использовать tn и tp перейти к различным соответствующим тегам.

  • пресс ^], чтобы взять вас на первый матч.
  • если это не тот матч, который вы хотите, введите :tn перейти к следующему.
  • если вы набрали :tn слишком много раз вы можете ввести :tp чтобы вернуться к предыдущему.

Я считаю, что Vim переходит к первому тегу в файле тегов по умолчанию. Вы можете выбрать другой, если хотите: используйте :tj (аналогично: tselect, но автоматический прыжок, если есть только одно совпадение) или Ctrl-] следовал по :tn).

единственный способ изменить значение по умолчанию-изменить порядок файла тегов, но я не верю, что ctags предлагает опцию командной строки для этого.

Это не так сложно, как кажется, вам в основном нужен скрипт, который открывает теги файл, сортирует его по тегу " вид " и снова записывает его обратно. "Вид" в теге-это один символ, описывающий, является ли это функцией (f), прототипом функции (p), макросом, перечисленным именем и т. д. Если вы используете Linux, то можете в теории, будьте так же просто, как:

#!/bin/sh
ctags -R -f - . | tac > tags

С tac меняет порядок строк в файле, это автоматически поставит определение первым. Однако это становится немного сложнее, поскольку заголовок должен быть поддерживается и Vim предпочитает файл тегов для сортировки, поэтому лучше пройти через файл и Сортировать по первой записи (имя тега) в прямом порядке, а затем вид в обратном порядке. Поэтому что-то более сложное может быть лучше.

Я извиняюсь за бесстыдный плагин, но я написал плагин Vim, который (косвенно) делает то, что вам нужно. Он предназначен для добавления множества дополнительных групп подсветки для таких вещей, как имена функций, макросы, перечисления и т. д. Однако, один из другие вещи, которые это делает, - это повторно отсортировать файл тега, чтобы реализация функции предшествовала объявлению функции, тем самым достигая того, что вы хотите (у меня была такая же потребность, как и у вас). Если вы не хотите какой-либо из функций подсветки, вы, вероятно, можете легко удалить все это: это довольно простая программа python и еще более простой скрипт Vim и доступен из мой сайт.


:tselect my_little_function 

и вы получите список матчей. или если вы переходите к тегу, и вы им не довольны, введите

:tselect

и вы получаете список альтернатив для последнего активного тега.


добавьте следующее к вашему .файл vimrc:

noremap <c-]> 2<c-]>

эта строка заставляет vim автоматически переходить ко второму совпадению (вместо первого), которое обычно является определением функции.


этот вариант работал для меня лучше

добавьте следующую строку в ваш .vimrc и теперь вы можете использовать двойной щелчок мыши (на variable/entry в вашем файле), чтобы перейти к отмеченному местоположению. Если одно совпадение найдено, оно сразу же прыгнет. Если несколько записей совпадают, он запросит ввод пользователя..

:map <2-LeftMouse> g< c-]>

поздно на вечеринку, но для входящих Vim тегов гуглеров:

Я обнаружил, что использование cscope в дополнение к ctags-это путь, по крайней мере, для C/C++. Он более интеллектуальный о деревьях вызовов, и вы можете установить его в резервный режим ctags, если он потерпит неудачу. Просто запускайте "cscope-b" каждый раз, когда вы запускаете ctags-R. и ты будешь готов идти. Если вы используете настройки ниже, вы сможете использовать Ctrl-]/Ctrl-T, как всегда, но вы также можете добавить отличные новые прыжки, такие как прыжки в объявление функции и показывать списков переходов функции абонентов.

" setup
if has("cscope")
    set csto=0                                                                             
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
    cs add cscope.out
    " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
    cs add $CSCOPE_DB
    endif
    set csverb
endif

" jump to a function declaration
nmap <silent> <C-\> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR>
" show a list of where function is called
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR>

существует несколько способов заставить Vim перейти к тегу напрямую, если есть только одно совпадение тегов, в противном случае представьте список совпадений тегов.

вы можете использовать 'tjump ' ex команда. Например, команда ':tjump func1 ' перейдет к определению func1, если оно определено только один раз. Если func1 определяется несколько раз, будет представлен список соответствующих тегов.

вы можете расположить курсор над тегом и нажать g Ctrl-].

вы можете визуально выбрать текст и нажмите g Ctrl-] чтобы перейти или перечислить соответствующие теги.

вы можете использовать 'stjump' ex command. Откроется соответствующий или выбранный тег из списка тегов в новом окне.

вы можете нажать Ctrl-W g Ctrl-] чтобы сделать: stjump.

Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-]

вы можете нажать 2 затем CTRL+], это будет идти непосредственно ко второму матчу, в java, это обычно реализация некоторого интерфейса.