Найти тему
Блокнот математика

Рубрика "Секреты Вим". Полезные привязки

Привет, друзья. Сегодня я поделюсь своим опытом, а именно: расскажу, какие привязки использую. Некоторые я придумал сам, другие подсмотрел у кого-то или где-то. Некоторые я уже не использую: когда-то казалось полезно, а потом, по мере роста мастерства, оказались не нужны. О них тоже расскажу.

http://zhurnal.lib.ru/img/g/gljuk/forgotten_magic/ed7e2602db46465bb34216eb26a9640b.jpg
http://zhurnal.lib.ru/img/g/gljuk/forgotten_magic/ed7e2602db46465bb34216eb26a9640b.jpg

Начнем с рекомендованных Справкой Вим (пере)привязок. Первая:

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

Но в целом всё то же самое.

Привязки для режима вставки обсудим в другой заметке.

Удачи.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022