Как перейти к определению функции с помощью vim? Например, с помощью Visual Assist я могу ввести Alt + g под функцию и открыть контекстное меню, в котором перечислены файлы с определениями.
Как я могу сделать что-то подобное в vim?
Как перейти к определению функции с помощью vim? Например, с помощью Visual Assist я могу ввести Alt + g под функцию и открыть контекстное меню, в котором перечислены файлы с определениями.
Как я могу сделать что-то подобное в vim?
Используйте ctags. Создайте файл тегов и сообщите vim, где он использует команду: tags. Затем вы можете просто перейти к определению функции, используя Ctrl - ]
В этом вопросе есть больше трюков и подсказок тэгов.
Если все содержится в одном файле, выполните команду gd
(как в 'goto definition'), которая перенесет вас к первому вхождению в файл слова под курсором, что часто является определением.
g* делает достойную работу без установки ctags.
То есть, введите g, * (или просто * - см. Ниже), чтобы найти слово под курсором (в данном случае, имя функции). Затем нажмите n, чтобы перейти к следующему (или Shift - n для предыдущего) вхождения.
Он не переходит непосредственно к определению, учитывая, что эта команда просто ищет слово под курсором, но если вы не хотите заниматься настройкой ctags в данный момент, вы можете, по крайней мере, избавить себя от необходимости повторного ввода. введите имя функции, чтобы найти ее определение.
- Редактировать-- Хотя я уже давно использую g *, я недавно обнаружил два ярлыка для этих ярлыков!
(a) * перейдет к следующему вхождению слова под курсором. (Нет необходимости вводить g
, команду 'goto' в vi).
(б) # переходит к предыдущему вхождению, аналогичным образом.
N и n по-прежнему работают, но '#' часто очень полезно для начала поиска в обратном направлении, например, при поиске объявления переменной под курсором.
Используйте gd
или gD
при наведении курсора на любую переменную в вашей программе.
gd
приведет вас к местной декларации.gD
приведет вас к глобальной декларации.больше вариантов навигации можно найти здесь.
Используйте cscope для перекрестных ссылок на большой проект, такой как ядро Linux.
Как сказал Пол Томблин, вы должны использовать 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
Другой распространенный метод заключается в том, чтобы поместить имя функции в первый столбец. Это позволяет определить определение с помощью простого поиска.
int
main(int argc, char *argv[])
{
...
}
Вышеуказанная функция может быть найдена с помощью /^main
внутри файла или с помощью :grep -r '^main' *.c
в каталоге. Пока код имеет правильный отступ, единственный раз, когда идентификатор будет появляться в начале строки, находится в определении функции.
Конечно, если вы не используете ctags с этого момента, вам должно быть стыдно за себя! Тем не менее, я нахожу этот стандарт кодирования полезным дополнением, а также.
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/...)
Второй ответ Павла: да, ctags (особенно exuberant-ctags (http://ctags.sourceforge.net/)) отлично. Я также добавил это в свой vimrc, поэтому я могу использовать один файл тегов для всего проекта:
set tags=tags;/
Я действительно не рекомендую использовать теги в Vim. Мне пришлось написать собственный плагин тегов, который является более продвинутым, чем все другие плагины тегов, а также пропускать много времени, прежде чем я смогу наконец понять и принять, что теги слишком ограничены и слишком много ложных срабатываний.
Вместо этого я рекомендую использовать более интеллектуальные инструменты, которые действительно знают язык, с которым вы работаете, структуру вашего проекта и контекст, из которого вы пытаетесь перейти к определению чего-то. В качестве примера phpcd отлично подходит для проектов PHP. Он использует отражение PHP, чтобы получить представление о вашем коде. Существуют и другие варианты для других языков, которые не полагаются на теги.
Современный способ сделать это - запустить языковой сервер - отдельное отдельное приложение (по одному для каждого языка программирования), которое анализирует весь ваш проект в режиме реального времени и предоставляет возможности вашему редактору (это общее решение). Вы получаете такие вещи, как:
В nvim
и vim8
(или выше) вы общаетесь с серверами lang, устанавливая плагин Language Server Protocol:
Вы можете найти список активно разрабатываемых языковых серверов и их возможностей на веб-сайте Lang Server.
Протокол Language Server Protocol был создан Microsoft для кода Visual Studio и выпущен как проект с открытым исходным кодом с разрешающей лицензией MIT (стандартизированной в сотрудничестве с Red Hat и Codenvy).
Я рекомендую использовать LSP вместе с DAP (Debug Adapter Protocol) для полного взаимодействия с IDE в выбранном вами редакторе (плагин DAP для VIM: vimspector).
Установите cscope
. Он очень похож на ctags
, но более мощный. Чтобы перейти к определению, вместо Ctrl + ], сделайте Ctrl + \ + g. Конечно, вы можете использовать оба одновременно. Но с большим проектом (скажем, с ядром Linux) cscope на несколько миль впереди.
После генерации ctags вы также можете использовать следующее в vim:
:tag <f_name>
Выше приведут вас к определению функции.