Как перейти к вызову функции?

14

После создания файла тегов с помощью exuberant-ctagsя могу перейти от вызова функции к ее объявлению, <C-]>что довольно удобно.

У меня вопрос, как это сделать по-другому? Когда мой курсор находится на определении функции, как я могу перейти к строкам, где вызывается функция?

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

statox
источник
Ack или Ag также будут работать, и вы можете легко найти оболочки для этих инструментов командной строки. Например, github.com/mileszs/ack.vim и github.com/rking/ag.vim
dash-tom-bang

Ответы:

11

Вы не можете перейти к вызовам функций с помощью ctags. Для C / C ++ и Java есть cscope, и он прекрасно интегрируется с Vim (см. :help cscope). Для других языков вы можете найти инструмент, который генерирует / экспортирует cscopeсовместимые базы данных (например, hscopeдля Haskell, а также starscopeдля Ruby, Go и JavaScript). Вы также можете использовать cscopeс GNU глобальных баз данных, указывая cscopeprgна gtags-cscope.

С другой стороны: если вы не откладываете время от времени озадачивающее использование Engrish,; ) вы, вероятно, также захотите использовать universal-ctags вместо exuberant-ctags. Последний не обновлялся годами. Первый - активно поддерживаемая вилка.

Сато Кацура
источник
Поддерживает ли cscope другие языки, кроме C / C ++ и Java?
edi9999
@ edi9999 cscopeсам поддерживает C / C ++, Lex и Yacc. Поддержка Java немного полезна. Вы можете получить поддержку (в старом стиле) PHP и JavaScript из GNU globalчерез gtags-cscopeутилиту. И, как я сказал выше, существуют другие индексаторы, которые могут экспортировать cscopeбазы данных, совместимые с.
Сато Кацура
8

Вы не можете сделать это с помощью ctags.

Попробуйте более подходящую альтернативу, такую ​​как cscope (которая даже имеет собственный раздел справки :):help cscope или global .

romainl
источник
Поддерживает ли cscope другие языки, кроме C / C ++ и Java?
edi9999
Да, хотя бы PHP и JavaScript.
Romainl
1
@romainl Нет, cscopeсама не поддерживает ни PHP, ни JavaScript. Однако вы можете индексировать файлы PHP и JavaScript с помощью GNU global, а затем запускать, gtags-cscopeчтобы использовать полученный gtagsфайл с cscope.
Сато Кацура
@SatoKatsura, да, cscope поддерживает JavaScript (и, очевидно, CSS).
Romainl
2
@romainl Вы должны рассмотреть глядя на cscope«S источников , а не спекулировать на основе быстрых экспериментов. cscopeимеет довольно расслабленный синтаксический анализатор C. Это все, что у него есть, и все, что он делает. С этим синтаксическим анализатором он «поддерживает» множество языков, для подходящих значений «поддержка». Конструкции распознаются, если они более или менее похожи на C. Именно поэтому классы Java и более новые конструкции PHP не распознаются. Сравните fi с starcope , который фактически позволяет добавлять новые языки.
Сато Кацура
8

Вы можете использовать команду Vim grep для поиска всех файлов в вашем проекте:

:grep! "\<<cword>\>" . -r
:copen

Давайте поместим это в связку ключей:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Я нахожу этот поиск по всему проекту одним ключом неоценимым, когда исследую большую незнакомую кодовую базу.

\<и \>являются регулярными выражениями, которые указывают начало и конец слова, поэтому вы не получите частичных совпадений. ( -wОпция grep может быть другим способом достижения этого.)

Однако это неразумный поиск , поэтому он может давать ложные срабатывания, если одно и то же слово появляется в несвязанных контекстах.


По правде говоря , я использую мою собственную модифицированную версию плагина grep.vim . Это немного удобнее использовать:

  • Он позволяет вам редактировать шаблон поиска, а также командную строку grep (чтобы вы могли ориентироваться на определенные папки, например, src/ lib/вместо .) и запоминать изменения.
  • Я добавил поддержку Google's Csearch . Это может быть намного быстрее, чем grep, потому что он строит индекс слов, а не сканирует каждый файл каждый раз. Примечательно, что csearch использует немного другой стандарт регулярных выражений, поэтому \bдолжен использоваться вместо \<и \>.

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

Для быстрого доступа я создаю две комбинации клавиш . F3позволяет мне редактировать командную строку, F4использует предварительно настроенную командную строку без каких-либо дополнительных нажатий клавиш. Механизм довольно уродливый, и может использовать некоторую очистку, но он мне хорошо послужил.

joeytwiddle
источник