Vim печально известен тем, что назначает команды почти каждой клавише на клавиатуре (просто попробуйте вызвать :help
практически на любой клавише). Хотя это по-своему хорошо, остается нехватка ключей, которые можно использовать в пользовательских сопоставлениях. Мы можем использовать выделенный ведущий ключ, например \
или <Space>
, чтобы отложить наши сопоставления под полку, но это приводит к тому, что наш ведущий ключ очень быстро переполняется. Один из обходных путей — сопоставить существующую функциональность.
Неиспользованные «метки»
В некоторых случаях можно использовать m
в качестве альтернативного ключевого ключа. m
размещает метки только для буквенно-цифровых клавиш вместе с ' " ` [ ] < >
. Это оставляет довольно много неиспользуемых последовательностей клавиш, некоторые из которых перечислены ниже:
m! m( m) m= m{ m} m; m: m, m. m/ m? m<CR> m<Space> m<BS>
Примеры:
" substitute forwards and backwards nnoremap m, #NcgN xnoremap m, "zy?\V<C-R>=escape(@z,'/\')<CR><CR>NcgN nnoremap m; *Ncgn xnoremap m; "zy/\V<C-R>=escape(@z,'/\')<CR><CR>Ncgn " :make mappings nnoremap m= :set makeprg= nnoremap m<Space> :make<Space> nnoremap m<CR> <Cmd>make<CR> nnoremap m? :help makeprg<CR>
Мы можем применить аналогичную логику к командам '
и `
. Хотя у этих двоих точно меньше вариантов:
'! '@ '# '$ '% '<Tab> '<Space>
Примеры:
" jump to special files (vimrc, indent file, etc.) nnoremap '$ :sp <C-r>=stdpath('config')<CR>/init.vim<CR> nnoremap '<Tab> :sp <C-r>=stdpath('config')<CR>/after/indent/<C-r>=&filetype<CR>.vim<CR>
Числовые сопоставления
Хотя эта концепция не чужда vim, я думаю, что ее стоит упомянуть. К сопоставлению можно привязать различные функции в зависимости от того, используется ли с ним число или нет. Это позволяет нам накладывать дополнительные функции на команду, не удаляя ее полностью. Вот пример с <C-l>
:
" redraw the screen " using a number additionally edits the buffer noremap <expr> <C-l> \ (v:count ? '<Cmd>edit<CR>' : '') \ . '<Cmd>noh<CR>' \ . (has('diff') ? '<Cmd>diffupdate<CR>' : '') \ . '<Cmd>redraw<CR>'
Сопоставление оператора с оператором
Мы можем сопоставлять последовательности клавиш оператора с оператором, не нарушая значения по умолчанию vim. Это связано с тем, что vim фокусируется только на концепции «оператор-движение» для большей части редактирования, например diw
, daw
, dw
, d]}
. Вариантов много, поэтому я оставлю здесь лишь несколько для идей:
dc ds dy d! d= d< d> yc yd yo ys y! y= =p =P cd cs co cp
Примеры:
" vim-surround default mappings nnoremap cs <Plug>Csurround nnoremap ds <Plug>Dsurround nnoremap ys <Plug>Ysurround " paste and indent nnoremap =p p='] nnoremap =P P='] nnoremap =gP gPmz'[=']`z nnoremap =gp gpmz'[=']`z " change directory nnoremap cd <Cmd>tcd %:p:h<CR>
Неиспользуемые сопоставления скобок
Большинство последовательностей клавиш, включающих [ ]
, не используются в настройках vim по умолчанию. Спасибо tpope за популяризацию этой идеи с помощью vim-unimpaired
:
" vim-unimpaired nnoremap [q <Cmd>cprev<CR> nnoremap ]q <Cmd>cnext<CR> nnoremap [t <Cmd>tprev<CR> nnoremap ]t <Cmd>tnext<CR> " cycle between quickfix lists nnoremap [<M-q> <Cmd>exe "sil!uns colder" v:count1<CR> nnoremap ]<M-q> <Cmd>exe "sil!uns cnewer" v:count1<CR>
Неиспользуемые сопоставления `g` и `z`
Встроенные лидеры g
и z
также имеют некоторые неиспользуемые последовательности клавиш, некоторые из которых я перечислю здесь. Используйте :help
, чтобы обнаружить другие неиспользуемые ключи:
nnoremap g<CR> <Cmd>Git<CR> nnoremap g<Space> :Git<Space> nnoremap g. <Cmd>Gvdiffsplit<CR> nnoremap g/ :sil!gr<Space> nnoremap g! <Cmd>FzfProcKill<CR> xnoremap g& <Esc><Cmd>'<,'>&&<CR> " note visual mapping nnoremap z/ <Cmd>BLines<CR>
Эффективно «неиспользуемые» команды
Некоторые клавиши сопоставлены с vim и в некоторой степени «бесполезны». Эти клавиши либо бесполезны, либо заменены существующими командами. Обратите внимание, что этот раздел субъективен, поэтому количество доступных ключей будет варьироваться в зависимости от человека. Вот некоторые из них, которые я переназначаю, так как редко ими пользуюсь:
" <Space> <CR> ' _ Q d<CR> d<Space> gh gs s S noremap ' ` nnoremap _ <Cmd>sil !xdg-open "%:p:h"<CR> noremap gh ^ nnoremap gs :sil!gr \b<C-r>=escape(expand('<cword>'), '%#"')<CR>\b<CR>
Всегда проверяйте :help
эти команды, прежде чем пытаться их заменить, так как полезно понимать, что заменяется.
Неиспользуемые ключи из `map.txt`
Мы также можем проверить :help map-which-keys
, в котором уже есть несколько идей по отображению. Это довольно просто, но стоит упомянуть на случай, если все остальное не поможет. Отдельное упоминание о сопоставлениях <M->
.
Вывод
Немного поразмыслив, можно втиснуть некоторые пользовательские сопоставления, которые не используют наши первичные ведущие ключи. Существует больше возможных последовательностей клавиш, чем указано здесь, поэтому обязательно подумайте о них.