Подтвердить что ты не робот

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

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

Как обойти это?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

:tselect my_little_function 

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

:tselect

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

Ответ 5

Эта опция работала для меня лучше

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

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

Ответ 6

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

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

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

Ответ 7

Позднее стороне, но для входящих гуглеров тегов vim:

Я обнаружил, что использование cscope в дополнение к ctags - путь, по крайней мере, для 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>

Ответ 8

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

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

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

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

Вы можете использовать команду 'stjump' ex. Это откроет соответствующий или выделенный тег из списка тегов в новом окне.

Вы можете нажать Ctrl-W g Ctrl-], чтобы выполнить: stjump.

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

Ответ 9

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