我想在命令行模式下在VIM中映射一个键,但不是在搜索模式下(带有前导/
),如下所示:
有时我在VIM中键入了错误的命令,例如:Q
和:W
,我想让这些错误的命令正确。
如果我可以将Q
映射到q
和W
到w
,我可以将错误的命令设为正确。
我尝试了cmap Q q
和cmap W w
,但这也会影响搜索模式,即/Query
为/query
(实际上你无法输入上层Q)。
我还尝试了cabbrev Q q
,这也会影响搜索模式。
那么,还有其他命令可以满足我的要求吗?
感谢。
答案 0 :(得分:3)
有很多方法可以做到,而且两者都不是很简单。
使用command
,您需要处理属性:
command! -nargs=* -complete=file -range=% -bang -bar W w
command! -bang -bar Q q
对于cabbrev
,wiki中描述了陷阱,所以你需要这样做:
cnoreabbrev W <C-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'w' : 'W')<CR>
我有一个用于此目的的功能:
function! s:CAbbrev(from, to)
execute 'cnoreabbrev ' . a:from . ' <C-r>=(getcmdtype()==#'':'' && getcmdpos()==1 ? ' . string(a:to) . ' : ' . string(a:from) . ')<CR>'
endfunction
使用cmap
,您需要<expr>
限定符,并且您需要与cabbrev
或多或少相同的预防措施:
cnoremap <nowait> <expr> W getcmdtype() ==# ':' && getcmdpos() == 1 ? 'w' : 'W'
最安全的可能是cabbrev
方式。
答案 1 :(得分:0)
在这种情况下,您可以定义用户命令,因为它以大写字母开头。
:command! Q q
:command! W w