如何在命令行模式下而不是在搜索模式下映射键

che*_*wei 5 vim

我想在命令行模式下而不是在搜索模式下(带有前导/)映射 VIM 中的一个键,如下所示:

  • 将 Q 映射到 q
  • 映射 W 到 w

有时我在 VIM 中输入了错误的命令,例如:Q和:W,我想让这些错误的命令正确。

如果我可以映射Q到q和W到w,我可以使错误的命令正确。

我试过cmap Q qand cmap W w,但这也会影响搜索模式,即/Queryto be /query(实际上你不能输入上面的 Q)。

而且我也试过cabbrev Q q,这也会影响搜索模式。

那么,有没有其他命令可以满足我的要求?

谢谢。

lcd*_*047 4

有很多种方法可以做到这一点,但没有一种方法是真正简单的。

您需要command注意以下属性:

command! -nargs=* -complete=file -range=% -bang -bar W w
command! -bang -bar Q q
Run Code Online (Sandbox Code Playgroud)

由于wikicabbrev中描述了这些陷阱,因此您需要这样做:

cnoreabbrev W <C-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'w' : 'W')<CR>
Run Code Online (Sandbox Code Playgroud)

我有一个用于此目的的函数:

function! s:CAbbrev(from, to)
    execute 'cnoreabbrev ' . a:from . ' <C-r>=(getcmdtype()==#'':'' && getcmdpos()==1 ? ' . string(a:to) . ' : ' . string(a:from) . ')<CR>'
endfunction
Run Code Online (Sandbox Code Playgroud)

cmap您需要限定符,并且<expr>您需要或多或少与以下相同的预防措施cabbrev:

cnoremap <nowait> <expr> W getcmdtype() ==# ':' && getcmdpos() == 1 ? 'w' : 'W'
Run Code Online (Sandbox Code Playgroud)

最安全的方法可能是cabbrev。