У меня возникла проблема, заключающаяся в том, что ctags в vim/gvim приводит меня к объявлению вперед много раз, а не к фактическому определению функции.
Как обойти это?
У меня возникла проблема, заключающаяся в том, что ctags в vim/gvim приводит меня к объявлению вперед много раз, а не к фактическому определению функции.
Как обойти это?
Я думаю, что самый простой способ - использовать "g ctrl-]" вместо "ctrl-]". Если будет только один матч, он доставит вас туда. Если есть несколько совпадений, он перечислит их все, позволяя выбрать тот, который вы хотите, так же, как: tselect. Лучшее из обоих миров.:)
Вы можете использовать tn
и tp
для перехода к различным совпадающим тегам.
^]
, чтобы перейти к первому совпадению.:tn
, чтобы перейти к следующему.:tn
слишком много раз, вы можете ввести :tp
, чтобы вернуться к предыдущему.Я считаю, что Vim по умолчанию использует первый тег в файле тегов. Вы можете выбрать другое, если хотите: используйте :tj
(аналогично: tselect, но автоматически скачайте, если есть только одно совпадение) или Ctrl-]
, за которым следует :tn
).
Единственный способ изменить значение по умолчанию - изменить порядок файлов тегов, но я не верю, что ctags предлагает вариант командной строки для этого.
Это не так сложно, как кажется, поскольку вам в основном нужен script, который открывает файл тегов, сортирует его по типу "kind" и снова записывает обратно. "Тип" в теге - это один символ, описывающий, является ли он функцией (f), прототипом функции (p), макросом, перечислимым именем и т.д. И т.д. И т.д. Если вы используете Linux, он может, в теории, будут такими же простыми, как:
#!/bin/sh
ctags -R -f - . | tac > tags
Так как tac
меняет порядок строк в файле, это автоматически поместит определение в первую очередь. Тем не менее, он становится немного сложнее, поскольку заголовок должен поддерживаться, и Vim предпочитает сортировать файл тега, поэтому лучше пройти через файл и отсортировать первую запись (имя тега) в прямом порядке, а затем вид в обратном порядке. Поэтому что-то более сложное может быть лучше.
Я прошу прощения за бесстыдный плагин, но я написал плагин Vim, который (косвенно) делает то, что вам нужно. Он предназначен для добавления большого количества дополнительных групп выделения для таких вещей, как имена функций, макросы, перечисления и т.д. Однако одна из других вещей, которые это делает, заключается в повторной сортировке файла тега, чтобы реализация функции приходилась перед объявлением функции, тем самым что вы хотите (у меня была такая же потребность, как и вы). Если вам не нужна какая-либо функция подсветки, вы, возможно, могли бы легко удалить все это: это довольно простая программа python и еще более простой Vim script и доступен из мой сайт.
:tselect my_little_function
и вы получите список совпадений. или если вы переходите к тегу, и вы недовольны им, введите
:tselect
И вы получите список альтернатив для последнего активного тега.
Эта опция работала для меня лучше
Поместите следующую строку в свой .vimrc, и теперь вы можете использовать двойной щелчок мыши (в variable/entry
в вашем файле), чтобы перейти к помеченному местоположению. Если будет найдено одно совпадение, он сразу же перепрыгнет. Если несколько записей совпадают, они будут запрашивать ввод пользователя.
:map <2-LeftMouse> g< c-]>
Добавьте в свой файл .vimrc следующее:
noremap <c-]> 2<c-]>
Эта строка заставляет vim автоматически переходить ко второму совпадению (вместо первого), что обычно является определением функции.
Позднее стороне, но для входящих гуглеров тегов 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>
Существует несколько способов заставить 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-]
Вы можете нажать 2, затем CTRL + ], это перейдет непосредственно ко второму совпадению, в java это обычно реализация некоторого интерфейса.