Перейти к определению функции в vim - PullRequest
202 голосов
/ 11 марта 2009

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

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

Ответы [ 10 ]

172 голосов
/ 11 марта 2009

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

В есть еще несколько трюков и советов по тегам .

114 голосов
/ 11 марта 2009

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

92 голосов
/ 13 октября 2011

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

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

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

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

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

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

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

40 голосов
/ 19 ноября 2013

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

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

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

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

14 голосов
/ 11 марта 2009

Как отметил Пол Томблин, вы должны использовать ctags . Вы также можете рассмотреть возможность использования plugins для выбора соответствующего или для предварительного просмотра определения функции под курсором. Без плагинов у вас будет головная боль при попытке выбрать один из сотен перегруженных методов 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

11 голосов
/ 11 марта 2009

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

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

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

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

9 голосов
/ 12 ноября 2013

1 - установить обильные ctags. Если вы используете osx, эта статья показывает небольшой трюк: http://www.runtime -era.com / 2012/05 / буйный-Ctags-в-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 (источник: https://stackoverflow.com/a/53929/226255)

6 голосов
/ 11 марта 2009

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

set tags=tags;/
4 голосов
/ 05 июля 2018

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

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

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

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

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

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

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

1 голос
/ 17 сентября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...