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->.

Вывод

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