Перейти к определению функции в vim

Как перейти к определению функции с помощью vim? Например, с помощью Visual Assist я могу ввести Alt + g под функцию и открыть контекстное меню, в котором перечислены файлы с определениями.

Как я могу сделать что-то подобное в vim?

Ответ 1

Используйте ctags. Создайте файл тегов и сообщите vim, где он использует команду: tags. Затем вы можете просто перейти к определению функции, используя Ctrl - ]

В этом вопросе есть больше трюков и подсказок тэгов.

Ответ 2

Если все содержится в одном файле, выполните команду gd (как в 'goto definition'), которая перенесет вас к первому вхождению в файл слова под курсором, что часто является определением.

Ответ 3

g* делает достойную работу без установки ctags.

То есть, введите g, * (или просто * - см. Ниже), чтобы найти слово под курсором (в данном случае, имя функции). Затем нажмите n, чтобы перейти к следующему (или Shift - n для предыдущего) вхождения.

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

- Редактировать-- Хотя я уже давно использую g *, я недавно обнаружил два ярлыка для этих ярлыков!

(a) * перейдет к следующему вхождению слова под курсором. (Нет необходимости вводить g, команду 'goto' в vi).

(б) # переходит к предыдущему вхождению, аналогичным образом.

N и n по-прежнему работают, но '#' часто очень полезно для начала поиска в обратном направлении, например, при поиске объявления переменной под курсором.

Ответ 4

Используйте gd или gD при наведении курсора на любую переменную в вашей программе.

  1. gd приведет вас к местной декларации.
  2. gD приведет вас к глобальной декларации.

больше вариантов навигации можно найти здесь.

Используйте cscope для перекрестных ссылок на большой проект, такой как ядро Linux.

Ответ 5

Как сказал Пол Томблин, вы должны использовать ctags. Вы также можете рассмотреть возможность использования плагинов для выбора подходящего или для предварительного просмотра функции под курсором. Без плагинов у вас будет головная боль, пытающаяся выбрать один из сотен перегруженных методов doAction, поскольку встроенная поддержка ctags не учитывает контекст - просто имя.

Также вы можете использовать cscope и его функцию "найти глобальный символ". Но ваш vim должен быть скомпилирован с поддержкой + cscope, которая не является по умолчанию одним вариантом сборки.

Если вы знаете, что функция определена в текущем файле, вы можете использовать нажатия клавиш "gD" в обычном режиме, чтобы перейти к определению символа под курсором.

Вот самый загруженный плагин для навигации
http://www.vim.org/scripts/script.php?script_id=273

Вот один из них, который я написал, чтобы выбрать контекст во время перехода к тегу
http://www.vim.org/scripts/script.php?script_id=2507

Ответ 6

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

int
main(int argc, char *argv[])
{
    ...
}

Вышеуказанная функция может быть найдена с помощью /^main внутри файла или с помощью :grep -r '^main' *.c в каталоге. Пока код имеет правильный отступ, единственный раз, когда идентификатор будет появляться в начале строки, находится в определении функции.

Конечно, если вы не используете ctags с этого момента, вам должно быть стыдно за себя! Тем не менее, я нахожу этот стандарт кодирования полезным дополнением, а также.

Ответ 7

1- установить буйные ctags. Если вы используете osx, эта статья показывает небольшой трюк: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2- Если вы хотите включить только файлы ctags в свой каталог, запустите эту команду в своем каталоге:

ctags -R

Это создаст для вас файл тегов.

3- Если вы используете Ruby и хотите включить ctags для своих драгоценных камней (это было действительно полезно для меня с RubyMotion и локальными камнями, которые я разработал), сделайте следующее:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

кредит: https://coderwall.com/p/lv1qww (Обратите внимание, что я опустил параметр -e, который генерирует теги для emacs вместо vim)

4- Добавьте следующую строку в ваш ~/.vimrc

set autochdir 
set tags+=./tags;

(Почему полуколона: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree)

5 Перейдите к слову, которому вы хотите следовать, и нажмите ctrl + ]; если вы хотите вернуться, используйте ctrl+o (источник: fooobar.com/questions/28190/...)

Ответ 8

Второй ответ Павла: да, ctags (особенно exuberant-ctags (http://ctags.sourceforge.net/)) отлично. Я также добавил это в свой vimrc, поэтому я могу использовать один файл тегов для всего проекта:

set tags=tags;/

Ответ 9

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

Вместо этого я рекомендую использовать более интеллектуальные инструменты, которые действительно знают язык, с которым вы работаете, структуру вашего проекта и контекст, из которого вы пытаетесь перейти к определению чего-то. В качестве примера phpcd отлично подходит для проектов PHP. Он использует отражение PHP, чтобы получить представление о вашем коде. Существуют и другие варианты для других языков, которые не полагаются на теги.

Ответ 10

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

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

В nvim и vim8 (или выше) вы общаетесь с серверами lang, устанавливая плагин Language Server Protocol:

  1. vim-lsp-client - обрабатывает связь с языковым сервером
  2. deoplete - необязательно, запускает завершение тега при вводе

Вы можете найти список активно разрабатываемых языковых серверов и их возможностей на веб-сайте Lang Server.

Протокол Language Server Protocol был создан Microsoft для кода Visual Studio и выпущен как проект с открытым исходным кодом с разрешающей лицензией MIT (стандартизированной в сотрудничестве с Red Hat и Codenvy).

Я рекомендую использовать LSP вместе с DAP (Debug Adapter Protocol) для полного взаимодействия с IDE в выбранном вами редакторе (плагин DAP для VIM: vimspector).

Ответ 11

Установите cscope. Он очень похож на ctags, но более мощный. Чтобы перейти к определению, вместо Ctrl + ], сделайте Ctrl + \ + g. Конечно, вы можете использовать оба одновременно. Но с большим проектом (скажем, с ядром Linux) cscope на несколько миль впереди.

Ответ 12

После генерации ctags вы также можете использовать следующее в vim:

:tag <f_name>

Выше приведут вас к определению функции.