Vim: Путь ниндзя

11 March 2017

Жизнь с VIM

Начнем с меня.

Как долго? c 2013 года

Для чего? писать код и plain text, править конфиги на сервере

И как? отлично и на все времена!

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

Итак, ты первый раз попал в Vim:

First time with Vim

Конечно же первым делом ты научился выходить. И затем проводишь большую часть времени в Insert mode, где бесконечно клацаешь по стрелочкам… Совсем не круто.

Дальше текст подразумевает что вы знакомы с основами Vim, такими как режимы.

hjkl

Первое: ваши пальцы должны находиться на одной линии. Это серьезно повышает продуктивность. Как пример, можно вспомнить слепой десятипальцевый метод где рекомендуют тоже самое.

Поэтому отключаем стрелки:

noremap <Up> <NOP>
noremap <Down> <NOP>
noremap <Left> <NOP>
noremap <Right> <NOP>

Сюда можно добавить еще пару крутых хаков.

  • Переназначаем Ctrl на Caps Lock. Для этого в случае macOS можно использовать Karabiner-Elements
  • Вместо Esc начинаем использовать связку Ctrl + [. Это стандарт для терминалов и Vim в частности.

Esc в Vim используется очень часто, так как это путь для выхода например из Insert или Visual режима. Сооветственно теперь вам не надо тянуться к Esc, вы просто используете оба своих мизинца которые зажимают Caps Lock(Ctrl) + [. Плюс теперь когда Ctrl оказывает всегда под рукой появляется возможность эффективней использовать хоткеи Vim’а с Ctrl, например те же Ctrl + d, Ctrl + u.

И еще, иногда во время ввода текста мне надо удалить пару ошибочных символов, но я не использую Backspace, а использую связку Ctrl + h:

imap ^H <Left><Del>

Таким образом мои пальцы все время находятся на hjkl.

Скорость ввода

Стоит добавить про настройку скорости ввода вообще. Для macOS этим можно рулить используя следующие настройки:

defaults write NSGlobalDomain KeyRepeat -int 2 # 30 ms
defaults write NSGlobalDomain InitialKeyRepeat -int 15 # 225 ms

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

Рациональность

Все знают что настоящий ниндзя быстр, незаметен и точен, но также он рационален в своих действиях.

Отказываемся от hjkl

Не совсем конечно. Вы должны понять что плохо перемещаться по одной строке или столбцу за раз. Например, использовать jk для перемещения по строкам является анти-паттерном в Vim.

Тут мы подходим к теме Vim motions. Это про то как быстро и эффективно перемещаться по тексту. Эти практики реально не отнимут много усилий чтобы их изучить.

Быстрый как ветер

Ninja cat

Начинаем быстро перемещаться. Самые известные хоткеи для перемещений это пожалуй w и b, они позволяют перемещаться по словам, причем к первому символу слова. Это то с чего стоит начать. Дальше можно добавить e и ge для перемещения по последним символов слов. Еще несколько часто используемых комбинаций:

$ - к концу строки

0 - к началу строки

I - к концу строки и перейти в Insert mode

A - к началу строки и перейти в Insert mode

gg - к началу файла

G - в конец файла

Знакомимся с f, F, t, T:

Когда вы делаете fсимвол, Vim ищет этот символ на текущей строке и перебрасывает вас к нему. Если символ встречается несколько раз для перехода к следующему просто нажимайте ; или для возвращения к предыдущему используйте ,.

Конечно людям этого показалось мало и были созданы плагины для организации быстрых перемещений, один из самых популярных это vim-easymotion который позволяет уже перемещаться по всему тексту, например по вхождению двух символов. Рекомендую ознакомится.

Hard mode

Чтобы жизнь медом не казалась и чтобы отучивать себя от плохого народ придумывает разные способы. Один из них вырубить стрелки, hjkl, page down/up и учиться уже перемещаться по тексту эффективно. Ставим плагин hardmode и страдаем(переучиваемся). Чуть меньше страданий можно получить с vim-hardtime.

Combo

Ninja cat combo

Комбинации команд - это вообще одна из главных фич Vim’а. Чтобы перемещаться и править текст еще быстрее используем комбинации, например:

5w - прыгнуть на 5 слов вперед

15j - на 15 строк вниз

dw - удалить все до следующего слова

v2t) - выделить все до второй скобки в текущей строке

ct( - удалить все до ( и начать ввод

ciw - заменить слово

Fuzzy finder

Помимо перемещений по тексту нам надо научиться быстро перемещаться по файлам. Для этого придумали такую вещь как fuzzy finder. Есть несколько реализаций, рассмотрим несколько популярных.

ctrlp.vim - можно искать по файлам, буферам + поддерживает regexp Vim’а. Вы можете указать команду которую стоит использовать для поиска, а это может быть например find или ag.

fzf - само по себе это утилита написанная на Go которая реализует fuzzy search, т.е. можно использовать не только в Vim, но и в терминале например. Для Vim есть плагин fzf.vim. Работает быстрее ctrlp. Можно кстати и по истории комитов Git перемещаться.

Плагины ниндзя

Следующий набор плагинов определенно заслуживает вашего внимания, ведь они стали стандартом де-факто в мире Vim. И серьезно повышают вашу производительность.

vim-surround

vim-surround это про то как в пару нажатий сделать из “Hello world!” ‘Hello world!’

vim-repeat

vim-repeat как научить Vim повторять ваши даже самые заковыристые команды

vim-rails

Если вы разрабатываете под Rails, то обратите внимание на vim-rails. Плагин позволяет делать такие штуки как переключаться из модели в соотствующий ей спек или из вьюхи в хелпер, а также например быстро вывести кусок вьюхи в partial.

vim-multiple-cursors

В Sublime есть такая штука как возможность изменить/вставить в несколько мест одновременно. Для Vim есть плагин который делает тоже самое vim-multiple-cursors.

С Vim’ом по жизни

Vim в терминале

Если закинуть в ~/.inputrc строку:

set editing-mode vi

то можно использовать большинство фич Vim’а и в терминале, например при редактировании команд.

Vim в браузере

Vimium - типа браузер для хакеров, в хорошем смысле. Заставьте хоткеи Vim’а работать в Chrome. Я использую. Это довольно круто, поскольку веб-разработчику часто приходится переключаться из консоли в браузер и обратно.

Итог

Внедрение подобных практик требует времени и терпения, обычно недели хватает чтобы привыкнуть. Но в будущем они окупаются вдвойне. Вы начинаете работать эффективней и получать кайф от правки кода или текста.

Привыкаешь настолько что начинаешь пытаться использовать эти практики в других редакторах или где-либо где надо что-то редактировать. Кстати, в некоторых редакторах(Atom) есть Vim mode, так что можно почувствовать Vim не переходя в него.

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

Мои конфиги можно найти здесь https://github.com/accessd/dotfiles.

P.S. Может еще помимо гифок с котиками добавить гифок с демо?:)