Pull to refresh

Про Vim " Горячие клавиши

Reading time8 min
Views7.3K
https://motionarray.imgix.net/preview-432520-g2HdCkQ8rZ-high_0012.jpg
https://motionarray.imgix.net/preview-432520-g2HdCkQ8rZ-high_0012.jpg

Тема очень обширная, не сказать бесконечная, но я постараюсь затронуть только очень важные вещи, о которых говорится не так много в бесчисленных джентльменских минимумах по Vim. Хотя, конечно, придется время от времени возвращаться к теме дабы дать уточняющие указания или рекомендации. Да и не упомню я всего сразу. Память вообще штука интересная. Помнит ли человек как надо ходить? Раз кто-то забывает, то видимо помнит осознанно и не так уж что бы очень хорошо. Вроде как, через примерно пол года в постели или в космосе учиться ходить нужно заново.

В частности, видимо, с этим связано то, что во многих обучающих материалах так много говорится о повторяющихся вещах типа того как удобно использовать числовой префикс перед движением или командой, или о том как работают сокращения переходов по словам (w и b), по предложениям (( и )), по параграфам ({ и }), или о том как передвигаться по всему тексту при помощи <C-u> и <C-d> или <C-f> и <C-b>. И в то же время совсем мало говорится, например, почему-то о том как передвигаться в режиме вставки. Или, например, я совсем недавно открыл для себя замечательные f и F. Я смею предположить, что большинство тех, кто занимается составлением таких мануалов попросту перестают замечать какие-то движения, которые они сами используют уже на уровне рефлексов, а поэтому и не могут вспомнить когда составляют какие-то планы и даже когда непосредственно набирают текст.

Поэтому, я решил поимпровизировать: никакого предварительного плана. Сразу с точки зрения человека, который вот прямо сейчас сталкивается с какими-то особенностями, нюансами. Проверяя всё описываемое на ходу, используя вот этот самый текст. Надеюсь, именно это придаст данному материалу больше пользы, применимости что ли. С другой стороны, я осознаю, что от этого повествование может оказаться сумбурным, несвязным, и, местами, уходить куда-то в бок, сильно вперед или повторять, что-то старое. Тем не менее, начнем, таки с совсем простого - с движений.

Motions

Сразу надо сказать, что я всё-таки очень много времени до этого проводил в графических редакторах, и что уж тут греха таить, под одну известную платформу. Сказать, что горячие клавиши типа CTRL+C, CTRL+V, всевозможные сочетания со стрелками и функциональными клавишами сидят во мне прочно, это не сказать ничего. К слову, слепую печать и максимальный отказ от использования мыши я буквально через силу освоил еще будучи студентом. Ну, то есть горячие клавиши стандартных графических редакторов и IDE зашиты в самые глубокие структуры мозжечка. Соответственно пересадка на Vim для меня изначально была очень суровым и ресурсоемким испытанием. И тем важнее мне было резко и бескомпромиссно уйти в Vim и только Vim. Промежуточное, вялое, эпизодическое, точно бы вернуло меня обратно к старым добрым far2l и kate. А что бы кодить опять бы пришлось понуро возвращаться ко всяким sql developer, netbeans и, прости господи, к atom.

Надо было сразу решить, пытаться ли адаптировать Vim что бы он работал приблизительно так же как всё остальное, или сразу сломать себе мозг. С одной стороны, был риск опять так по-настоящему и не получить весь этот восхваляемый профит от навигации по <expr>hjkl, с другой, можно было получить шок, разочароваться в себе, и вообще закрыть себе путь в новый и удивительный мир. В результате был избран несколько трусливый вариант, но в целом по итогу он оказался не таким уж и плохим. А именно.

" shift arrow like gui
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>

" copy paste like gui
vmap <C-c> "+y<Esc>i
vmap <C-x> "+d<Esc>i
imap <C-v> "+pi
imap <C-v> <Esc>"+pi
imap <C-z> <Esc>ui
inoremap <C-a> <Esc>ggVG
vnoremap <C-a> <Esc>ggVG
xnoremap <C-a> <Esc>ggVG
tnoremap <C-a> <Esc>ggVG
xnoremap p pgv"@=v:register.'y'<CR>

" yank to system clipboard
noremap <Leader>y "+y
noremap <Leader>p "+p
noremap <Leader>Y "*y
noremap <Leader>P "*p

Сверху вниз тут собственно идут самые распространенные, скажем так, виндовые, сочетания, которые я пока решил добавить в Vim, что бы не запинаться во время интенсивной работы с несколькими окнами, в том числе и с самым обычным браузером. Выделение текста стрелками мне показалось тем, без чего я, пожалуй, не смогу по-началу жить совсем. Но, теперь, становится понятно, что движения по параграфам, предложениям и даже скобкам куда выгоднее чем даже CTRL+SHIFT+Arrow или PGDN и PGUP.

Registers

Также оказалось, что трюк с использованием системного буфера обмена в общем не дает особой выгоды. Во-первых, потому что у эмуляторов терминала тоже не всё так просто с копированием и вставкой. То есть ты либо используешь именно функции эмулятора к выделению и копированию, так что бы например забрать текст из удаленной сессии. Либо внутри одной сессии нет необходимости открывать две копии Vim, так как он сам отлично справляется со всеми мыслимыми сценариями размещения и компоновки файлов внутри одного экземпляра. А внутри одного экземпляра, соответственно, нет никакой необходимости использовать системный буфер обмена. Более того, начинаешь понимать и ощущать плюшки от встроенных регистров, которых, а - больше чем один, б - в числе их есть и системный.

Таким образом, практическое применение осталось, разве что, за последним набором команд, который в принципе нужен в любом случае, будь ты переселенцем с окошек, будь ты приверженцем миднайта или емакса. Хотя и в них нужда постепенно исчезает, так как чаще приходится вставлять из буфера в режиме вставки или вовсе в командную строку с выбором регистра ручками после CTRL+R.

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

" display white space characters with F3
nnoremap <F3> :set list! list?<CR>
" toggle line numbers
nnoremap <F4> :set rnu! \| set nu!<CR>

" no indent on paste
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set noshowmode " duplicated by status line plugin

Здесь это <F4>. Выше отображение специальных символов, чуть ниже переключатель режима вставки, который отключает автоотступы, и, последнее - нужно если у вас установлен плагин типа airline.

Следует отметить, что здесь клавиши F2, F3, F4 я взял откуда-то еще. Это не моя осознанная инициатива. Подозреваю, что привыкать к такому может быть и не стоило. А если это и безопасно (в смысле использования совместно с каким-то специфическим окружением), то я бы ограничился функциональными исключительно без каких-нибудь дополнительных модификаторов. И посадил бы на них какую-то вот такую одну категорию команд, с одной стороны достаточно редко используемую, с другой - которую всё-таки можно нажать в любом режиме в любой ситуации не задумываясь о последствиях. Некие переключатели чего-нибудь.

Тема с буферами наверное требует отдельной публикации. Но я пока сам не очень хорошо ориентируюсь в их эффективном использовании, так что пока оставим на потом.

Modifiers

Касательно безопасности использования тех или иных сочетаний. Вообще оказалось, что хоть и всюду утверждается, что пятьдесят процентов мощи кроется в правильных и удобных горячих клавишах, по факту оказывается, что их во-первых не так уж и много часто используемых, а во-вторых - они черт возьми уже почти все заняты. Почти каждая буковка, каждая заглавная буковка, каждая буковка с CTRL - практически все уже что-то умеют и на что-то завязаны. Понимаете, есть даже специальная страничка Unused keys в которой перечислены "свободные" сочетания и их там не так что бы много.

Другое дело, конечно, что мы можем беспрепятственно переназначать родные привязки так как удобно именно нам. Более того совсем свободны те самые функциональные клавиши и все которые можно нажать вместе с ALT. Но тут кроется другая опасность. Я бы даже сказал сразу две.

Понятно, ALT, особенно в сочетании с функциональными, скорее всего уже связан с каким-нибудь системным сочетанием. Понятно, ALT будет выкидывать всякие фокусы при использовании на удаленной машине. Существует ненулевая вероятность что вы попадете на конфликт даже сочетаниями на CTRL. Мне как минимум известны два примера: tmux завязанный на <C-b> (благо что не жестко, но об этом как-нибудь потом), и konsole в котором, например, стрелками с разными модификаторами можно переключать вкладки. Уверен, таких ситуаций хватает.

Все они так или иначе наверняка решаются, но тут есть вторая опасность. Сильно переназначая стандартные сочетания на какие-то другие команды вы рискуете, ну то есть я решил, что я рискую, часто попадать в ситуации, когда нужно редактировать не в своем Vim. Масса вариантов: новая удаленная или виртуальная машина в том же докере, чужая машина коллеги который позвал показать что-нибудь, да то же режим sudo. Наверняка и из этих ситуаций есть какой-то достойный выход, но это наверное зависит от конкретного пользователя и рода его деятельности. Может кому-то совсем никогда не надо делать вышеуказанные вещи. Например, я пытаюсь сейчас решать это путем хранения личных конфигов в гите. То есть, садясь даже за новую машину или зайдя под новым пользователем, мне нужно реально четыре команды что бы синхронизироваться. Но, опять же. Вдруг на виртуальной машине нет интернета? Встанут ли все плагины? Свежая ли версия самого Vim?

Общий вывод такой, что лучше всё-таки сильно не увлекаться с привязкой новых смыслов к существующим сочетаниям, а другие модификаторы не использовать вообще. Максимум, что-то типа переключения окон и вкладок можно себе поставить, так как с многооконной конфигурацией вряд ли очень надо работать на чужой или новой машине.

" move between windows
nnoremap <C-j> <c-w>j
nnoremap <C-k> <c-w>k
nnoremap <C-h> <c-w>h
nnoremap <C-l> <c-w>l 

" escape terminal and move to window
tnoremap <C-j> <c-\><c-n><c-w>j
tnoremap <C-k> <c-\><c-n><c-w>k
tnoremap <C-h> <c-\><c-n><c-w>h
tnoremap <C-l> <c-\><c-n><c-w>l 

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

Ну а главной клавишей в таком случае для вас должна стать, конечно же, <leader>. Все пользовательские, какие-то дублирующие, лучше всего повесить на сочетания с лидером. Не удивительно, что все сразу садят лидера на пробел. По ней банально легче попасть. Но тут возникает другая, наверное, новичковая, проблема. Как же их все эти сочетания упомнить.

Whichkey

Один из тех первых плагинов, которые должны быть установлены в первую очередь если вы новоприезжий. Встроенной замены этому инструменту из коробки нет. Как-то с очень большой натяжкой можно, наверное, справляться с :map <leader>, но когда у вас сочетаний больше чем 20, или как чаще это бывает за 50, то зачем ломать себе голову. Есть мнение, что потом этот плагин будет только мешать. Ну, вот когда он будет мне мешать, я возьму да и удалю его.

По сути этот плагин просто выдает подсказки в виде меню. Да это как бы и есть меню в понимании других редакторов, только вызываемый не специальной клавишей или мышкой, а клавишей лидером. И когда вы только установились и поставили минимальный набор плагинов, то он просто дает возможность быстрее запомнить сочетания. Я честно попробовал сходу "для тренировки памяти" попробовать без подсказок. Уверяю - бесполезное занятие - пытаясь всё запомнить сразу, вы наоборот тут же забудете о наличии редко используемых сочетаний и перестанете пользоваться ими совсем.

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

:x

Tags:
Hubs:
+8
Comments6

Articles