Получить 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, это обычно реализация некоторого интерфейса.