Сделайте свой Vim умнее с помощью Ctrlp и Ctags

Я очень люблю Vim, и из года в год использую Vim для написания кода и написания кода. Хотя все больше людей, особенно тех, кто работает с JavaScript, предпочитают современные редакторы кода, такие как Sublime Text или VSCode, я бы предпочел потратить немного времени, пытаясь сделать свою игрушку более умной.

CtrlP

Если вы специалист по Sublime Text, Atom или VSCode, вы должны использовать ctrl + pтысячи раз, чтобы повысить производительность. Что ж, не завидуйте, если вы парень Vim, потому что этот модный плагин Vim CtrlP даст вам все, что вам нужно.

Проверьте этот официальный документ для установки и настройки.

Ctags

Ctags - это инструмент, который просеивает ваш код, методы индексации, классы, переменные и другие идентификаторы, сохраняя индекс в файле тегов. Файл тегов содержит по одному тегу на строку. В зависимости от аргументов командной строки и языковых тегов, на которых выполняется запуск, из этого индекса можно получить много информации.

В настоящее время Ctags поддерживает 41 язык программирования, и относительно легко добавить определения для других.

Ctags значительно упрощает навигацию по большому проекту, особенно если код, с которым вы работаете, незнаком. Если вы не знаете, что делает метод или как он должен называться, вы можете сразу перейти к его определению. Если вы находитесь в нисходящей спирали Perl-скрипта из 500+ строк и хотите знать, где была определена переменная три часа назад, вы можете сразу вернуться к ней. А после вы можете сразу вернуться туда, где вы работали.

Вы можете установить Ctags с помощью Homebrew в OSX:

brew install ctags

Обратите внимание, что OS X поставляется с исполняемым файлом Ctags, но он не является обильным Ctags и в нем отсутствует большинство полезных функций. Если вы видите ошибку, например, Invalid Parameterпри запуске ctags, это означает, что система не использует ту, которую вы установили с Homebrew. Чтобы решить эту проблему:

$ alias ctags="`brew --prefix`/bin/ctags"

Когда вы находитесь в каталоге, который хотите проиндексировать, просто запустите:

ctags -R.

Ctags будет рекурсивно проходить по каталогу, помечая все обнаруженные исходные файлы. Для очень больших проектов это может занять некоторое время, но обычно это довольно быстро.

Вам также может понадобиться дополнительная конфигурация для Ctags, ниже ~/.ctagsя использую:

--langmap=javascript:.js.es6.es.jsx--javascript-kinds=-c-f-m-p-v
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*\[/\2/A,Array,Arrays/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function/\2/C,Class,Classes/--regex-javascript=/^[ \t]*class[ \t]+([A-Za-z0-9_$]+)/\1/C,Class,Classes/
--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/E,export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)/\2/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\4/E,Export,Exports/
--regex-javascript=/^[ \t]*function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*[\(]function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function[^\*][^\*]/\2/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*\([^\*]/\2/F,Function,Functions/
--regex-javascript=/^[ \t]*function[ \t]*\*[ \t]*([A-Za-z0-9_$]+)/\1/G,Generator,Generators/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function([ \t]*\*)/\2/G,Generator,Genrators/--regex-javascript=/^[ \t]*(\*[ \t])([A-Za-z0-9_$]+)[ \t]*\(.*\)[ \t]*{/\2/G,Generator,Generators/
--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/I,Import,Imports/
--regex-javascript=/^[ \t]*this\.([A-Za-z0-9_$]+)[ \t]*=.*{$/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)[ \t]*[:=][ \t]*[\(]*function[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*static[ \t]+([A-Za-z0-9_$]+)[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)\(.*\)[ \t]*{/\1/M,Method,Methods/
--regex-javascript=/^[ \t]*(this\.)*([A-Za-z0-9_$]+)[ \t]*[:=].*[,;]*[^{]$/\2/P,Property,Properties/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*{/\2/O,Object,Objects/
--regex-javascript=/\/\/[ \t]*(FIXME|TODO|BUG|NOBUG|\?\?\?|\!\!\!|HACK|XXX)[ \t]*\:*(.*)/\1/T,Tag,Tags/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*[^\[{]*;$/\2/V,Variable,Variables/
--exclude=min--exclude=vendor--exclude=\*.min.\*--exclude=\*.map--exclude=\*.swp--exclude=\*.bak--exclude=tags--exclude=node_modules--exclude=bower_components--exclude=test--exclude=__test__--exclude=build--exclude=dist--exclude=*.bundle.*

Вот как это выглядит при переходе к определению функции:

Также вы можете использовать Ctrlp для поиска тегов вместо файлов. Для этого сначала вам нужно сопоставить ярлык в вашем .vimrc:

nnoremap . :CtrlPTag

Вот как это работает:

Надеюсь, это поможет :)

Я пишу код для аудио и Интернета и играю на гитаре на YouTube. Если вы хотите увидеть больше от меня или узнать больше обо мне, вы всегда можете найти меня в:

Веб-сайт:

//haochuan.io/

GitHub:

//github.com/haochuan

Средняя:

//medium.com/@haochuan

YouTube: //www.youtube.com/channel/UCNESazgvF_NtDAOJrJMNw0g