Приятные открытия в VIM

02.05.2019

vim

На днях пересматривал довольно старое выступление по Vim чувака по имени Maxin Cardamom, где он рассказывал, как можно обойтись без некоторых самых распространённых плагинов и ничего себе не сломать. Доклад оказался очень интересным и некоторые вещи у меня закрепились и теперь я их использую на практике. Видео доклада будет ниже, а в статье я опишу, чем из советов я воспользовался и как мои волосы стали мягкие и шелковистые после этого.

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

Итак, что это за хитрости.

Простая замена FZF или быстро находим файлы по неполному названию.

Самые распространённые плагины, которые делают тоже самое - это ctrlp.vim и fzf.vim. Они хорошо работают, но остановиться на них я так и не смог, просто вбивал :e file_name.txt или визуально искал в NERDTree, если файл был достаточно глубоко запрятан.

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

Добавляем в ~/.vimrc строчки:

" для поиска во всех подкаталогах
set path+=**
" при нажатии Tab в командном режиме для авто дополнения варианты будут отображаться в меню, а не появляться по-одному.
set wildmenu

Теперь, если заново открыть Вим в папке с нужным проектом, набрать команду :find my_fi и нажать (где “my_fi” - это часть имени нужного файла) Tab, то будет показано меню с вариантами того, что можно открыть. Клавишей Tab и Shift-Tab можно перемещаться по этому меню. Если нажать Enter, откроется выбранный файл.

Можно сделать ещё проще, если мы знаем, что имя файла уникально, то набрав :find my_fi нажимаем Enter и сразу попадаем в нужный файл.

Точно так же и с буферами. Раньше, чтобы открыть нужный буфер, я смотрел список всех открытых буферов командой :ls и запоминал номер нужного буфера, а затем переходил к этому нужному буферу :b5, где 5 - это нужный буфер. Опять-таки оказалось, что можно воспользоваться командой :b my_fi и нажать Tab, опять отобразиться меню с вариантами. Если вместо таба нажать Enter, откроется нужный буфер, если другие не содержат этих же символов.

Ищем объявление функции или переменной. Ctags.

Уже давно IDE позволяют переходить к местам, где определена та или иная функция или переменная. В Vim для разных языков это сделано плагинами этих языков. По работе я много работаю с terraform и пользуюсь разными модулями, написанными в соседних командах. К сожалению, Vim да и другие редакторы не умеют корректно переходить на определения ресурсов, поэтому, засучив рукава, можно это поправить.

На помощь нам придёт утилита ctags, она есть во всех дистрибутивах Linux и в brew для MacOs.

Изначально Ctags поддерживает C-подобные языки и немного дополнительно, но terraform - нет. Не проблема, ведь можно настроить ctags под любой язык. Для terraform у меня такой конфиг:

--recurse
--exclude=.git
--langdef=terraform
--langmap=terraform:.tf.tfvars
--regex-terraform=/^[[:space:]]*resource[[:space:]]*"([^"]*)"[[:space:]]*"([^"]*)"/\2/r,Resource/
--regex-terraform=/^data[[:space:]]*"([^"]*)"[[:space:]]*"([^"]*)"/\2/d,Data/
--regex-terraform=/^[[:space:]]*variable[[:space:]]*"([^"]*)"/\1/v,Variable/
--regex-terraform=/^[[:space:]]*provider[[:space:]]*"([^"]*)"/\1/p,Provider/
--regex-terraform=/^[[:space:]]*module[[:space:]]*"([^"]*)"/\1/m,Module/
--regex-terraform=/^[[:space:]]*output[[:space:]]*"([^"]*)"/\1/o,Output/
--regex-terraform=/^([a-z0-9_]+)[[:space:]]*=/\1/f,TFVar/

Теперь заходим в папку с нашим проектом и выполняем команду ctags . -R. В папке будет создан файл tags, в нём соответственно, будут прописаны все метки.

Теперь открываем Vim, подводим курсор к одному ресурсу или переменной, нажимаем Ctrl-] и перемещаемся в место объявления ресурса. Чтобы прыгнуть обратно нажимаем Ctrl-t. Теперь моя работа с terraform стала на много удобнее и быстрее.

Более подробно почитать про работу с метками в Vim можно по ссылке.

Остальное, что я не использовал.

Авто заполнение.

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

Навигатор по папкам и файлам.

Предпочитаю пользоваться NERDTree потому что позволяет показать на файловой системе открытый сейчас файл.

Сниппеты.

Не прижились.

Использование утилиты сборки.

В Vim никогда не применял команду :make и пока об этом не пожалел. Может потому, что нету одного языка, на котором пишу. Мне гораздо проще вызывать и фильтровать эти команды в терминале.

Короче.

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

comments powered by Disqus