Привет, друзья. Сегодня я поделюсь своим опытом, а именно: расскажу, какие привязки использую. Некоторые я придумал сам, другие подсмотрел у кого-то или где-то. Некоторые я уже не использую: когда-то казалось полезно, а потом, по мере роста мастерства, оказались не нужны. О них тоже расскажу.
Начнем с рекомендованных Справкой Вим (пере)привязок. Первая:
map ' `
Она превращает команду "апостроф" в команду "обратная кавычка". Дело в том, что обе команды переходят на метку (они обозначены буквами, букву надо указать после команды), только апостроф переходит на начало строки, где метка, а обратная кавычка - прямо на метку. Обычно вам надо именно второе.
Вторая привязка:
map Y y$
Так уж исторически сложилось, что команда Y работает не так, как D или C. Команда D удаляет все от курсора до конца строки, С тоже (и включает режим вставки). А Y работает как yy, копируя всю строку. Логично ее переопределить.
Команды
map <A-DOWN> gj
map <A-UP> gk
включают режим перехода по логическим строкам. Если включен режим сворачивания (set wrap) и строки длинные, то одна строка будет уложена в окно в виде нескольких логических. Команды "стрелки" ходят по физическим строкам, а с g - по логическим. Удобнее прижать клавишу ALT, хотя некоторые предпочитают просто переопределить стрелку (без А-). Можно сделать аналог для режима вставки:
imap <A-DOWN> <ESC>gji
Только не забудьте, что формально режим вставки будет прерван и потом возобновлен. Например, это будет две правки, и каждую отдельно можно отменить.
Клавиши ввода и пробела в нормальном режиме просто перемещают курсор. Я нашел удобным настроить их на вставку соответствующего символа:
map <CR> a<CR><ESC>
map <SPACE> a <ESC>
Это позволяет поставить перевод строки там, где мне надо, например, f.<CR> (прыжок на точку в конце предложения и начать там новую строку).
Часто нужны команды переключения флага сворачивания строк и отключения подсветки найденного. Повесил на команды:
map <C-N> :noh<CR>
map <C-Z> :set wrap!<CR>
Выход из Вим до сих пор висит на ctrl+F10:
map <C-F10> :quit<CR>
Но не использую. Потому что из Вима не выхожу, да) Вообще-то это не выход из Вим, а закрытие окна (вкладки, если окно одно, и Вим, если вкладка одна). Да и то если буфер сохранен. Помним про :q! для игнорирования изменений, :qa для закрытия всего (при условии, что всё сохранено) и :qa! для глобального армагеддона.
Из F-клавиш многие повешены на меню, но не все; так, F2 сохраняет текст:
:map <F2> :w<CR>
:imap <F2> <ESC>:w<CR>
Обратите внимание, что в режиме вставки F2 из него выходит. Я ее и использую для этого вместо <ESC>.
Клавиша <F5> выходит в bash:
map <F5> :sh<CR>
Обратно возвращаемся через <C-D>, завершив работу bash.
Вот такая привязка позволяет удалить пустую строку, но не удаляет непустую (пустой считается строка без непробельных символов):
map <C-D> :.,.g/^\s*$/d<CR>:noh<CR>
imap <C-D> <ESC>:.,.g/^\s*$/d<CR>:noh<CR>i
По сути, на диапазоне строк из одной текущей строки (.,.) выполняется фильтрация строк (:g), которая выбирает пустые строки и удаляет их. Число множественное, но строка одна (или ни одной). Потом снимается выделение искомого. Побочный эффект - снимается подсветка предыдущего искомого.
Сложные привязки к F9 и F9 с shift и control ставят, снимают и переходят на визуальную закладку:
highlight boo ctermbg=2 ctermfg=0
sign define mybookmark text=!> linehl=boo texthl=boo
map <F9> :exe ":sign place 666 line=" . line(".") ." name=mybookmark file=" . expand("%:p")<CR>
map <C-F9> :sign unplace<CR>
map <S-F9> :exe ":sign jump 666 file=" . expand("%:p")<CR>
Первая команда определяет цветовое оформление. Вторая - визуальную закладку (зеленый текст и в начале маркировка вида !>). Далее идут три привязки: F9 ставит закладку, C-F9 снимает ее, S-F9 переходит на нее. Это всё один раз помещается в .vimrc и потом просто пользуетесь.
Часто работая с vimdiff, я сделал две привязки:
map <C-E> :diffget<CR>
map Q :diffupdate<CR>
Первая устраняет различие, приведя строку (или несколько смежных строк) в соответствие с соответствующими строками другого файла. Вторая обновляет разметку различий, если она не обновилась сама.
Несколько привязок связаны с написанными мною функциями: это перекодировка и суммирование.
Давайте напоследок разберем сложную привязку из Справки Вим. Она удаляет серии пустых (совсем пустых) строк, заменяя их на одну пустую строку:
:map ;b GoZ<Esc>:g/^$/.,/./-j<CR>Gdd
На последовательность ;b повешена вот такая команда. Что она делает?
G переходит на последнюю строку файла, o открывает новую строку и включает режим вставки, символ Z вставляется, выходим из режима вставки. Далее фильтруем строки (:g), отлавливая пустые строки (начало ^ и сразу конец $ строки). На них выполняется команда j (соединение строк), но хитрым образом: она выполняется на диапазоне от текущей (найденной) строки (.) до строки на одну выше (-) строки с первым же найденным символом (поиск /./). В итоге на каждой пустой строке будет проведено объединение строк от данной до строки перед первой же непустой, то есть объединение всех пустых, идущих подряд. В конце убираем искусственно вставленный символ Z, который нужен был для обработки серии пустых строк в конце файла.
Для пустых строк в смысле "пробелы могут быть" команда ещё чуть сложнее:
:map ;n GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd
Но в целом всё то же самое.
Привязки для режима вставки обсудим в другой заметке.
Удачи.