[О блоге] [наверх] [пред] [2020-12-22 13:51:41+03:00] [707157d15ebc01ac430bfc8d4b4c0dad5203eb27]
Темы: [go][tip][vim]

Как индексируется исходный код?

https://lobste.rs/s/ujr9mg/how_do_you_index_code_your_projects
Автор вопроса описывает свой use-case:

    * Fuzzy find and open a file in the project (FZF :Files or Ctrl+P)
    * Fuzzy find and jump to line in the open buffer (FZF :Lines)
    * Grep the project and jump to line (FZF :Rg)

но прыгать на нужные "символы" (определения фунок и прочего) было бы
очень здорово. Когда-то он использовал vim-gutentags, но это медленно
для больших проектов и нужно не забывать про файл с тэгами.

Да, создание тэгов для больших проектов может занять время (у меня
наверно самые большие проекты по 10-15сек индексировались), но делается
это ведь достаточно редко. Даже с активно разрабатываемым проектом не
факт что за целый день я запущу переиндексацию (инкрементально вообще
никогда не пробовал). Так что это терпимо. Меня больше напрягает размер
этого файла по несколько мегабайт в лёгкую. И когда мне надо работать с
OpenSSL и libtasn1 кодом, то я просто делаю символические ссылки на их
исходник в своём проекте и ctags их отлично индексирует тоже.

Зато его простота, возможно генерировать хоть руками и интеграция в Vim
из коробки -- это стоит того! Достаточно узнать несколько команд для
навигации по тэгам и вот уже из коробки можно удобно работать с тьмой
языков программирования, не ставя для каждого свои уникальные плагины
или ожидать наличия LSP (в котором и прыжки по определениям не факт что
будут), который у меня в любом случае (ну кроме Go) ещё и медленнее
будет работать. Даже при наличии работающего goto-definition в LSP я всё
равно не использую его возможности (1ae39d6ffa08741a2564f3e095508ce49b11bf03),
как минимум, ради скорости (интерактивного перехода).

Для Python я ни у одного человека с Vim-ом не видел чтобы их
language-aware плагины достойно прыгали на определения. Даже знакомый с
Emacs-ом всё равно "путешествует" по коду через тэги. Конечно, всё ещё
зависит и от программы которой создаются эти тэги. Я недавно перешёл на
Universal Ctags (31a56f5de0234738b454049f5a18a8d8b65a11a3) потому что
Exhuberant не знал ничего про Go.

Для управления tags файлом я давным давно написал функу помощник и
никаких плагинов никогда не использовал за ненадобностью:
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/ctags.vim;h=a76e736dc4f8528ee3ca7d9ae4569dcbc3ff80ed;hb=HEAD
Где-то в корне проекта надо самостоятельно создать "tags" файл (touch
flags), а дальше вызвать ":Ctags ЯЗЫКИ" ("C,C++", "Go", "Python", и т.д.).
Вот и всё что у меня есть на эту тему. А дальше штатные встроенные
команды для тэгов.

Автор использует FZF для поиска файлов. Не приживались у меня как-то все
эти fuzzy finder-ы. Но мне очень нравилось как работает дополнение пути
в zsh-е и я использую самописный плагин для вызова zsh, осуществления
дополнения в нём: 72bfea8fec7934c5c70a6a6795e48b8c8c9e920c
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/zshfe.vim;h=fd5e5b14616596802f7eaf01e804e34e0eadb936;hb=HEAD
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/zshfe.zsh;h=0dfcd68e96761bff887a860988e5ad7b1338322a;hb=HEAD
Выглядит ужасно (vim запускает subprocess zsh, который в свою очередь
запускает pty внутри которого другой zsh, скармливая ему искомую строку
и tab, как будто это пользователь ввёл), но работает очень хорошо,
регулярно использую.

Для открытия FILE:LINE:COL строк использую самопереписный:
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/file_line.vim;h=65962d2f9fc8d2c0e77aec4f1bc0c5149020032b;hb=HEAD
Для открытия выхлопа команд (в вышеуказанном формате) в консоли:
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=bin/bin/qq;h=250645a664e6476d699ad4ae135a2e5ee943207d;hb=HEAD
Для перехода между буферами в которых FILE:LINE есть: родные возможности
когда можно ввести только часть имени буфера, через одно нажатие tab-а:
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vimrc;h=f26cf6ef1857670c6695eb36a7f7bdad19e6ea65;hb=HEAD#l162

Ну и поиск по директориям/проекту через вызов :vimgrep или git grep, но
через удобные самописные обёртки, сразу же делающие и экранирование
нужное и открывающие quickfix:
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/grep.vim;h=e0878e7e2186e0fad352054a25b88cb79244b270;hb=HEAD
http://www.git.stargrave.org/?p=dotfiles.git;a=blob;f=vim/.vim/plugin/ggrep.vim;h=7b52921113ff525e61bca15bf3c45828d7fa4f9a;hb=HEAD

    [оставить комментарий]