如何在命令行模式下映射键,但不在搜索模式下映射

时间:2015-06-15 01:29:33

标签: vim

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

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

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

如果我可以将Q映射到qWw,我可以将错误的命令设为正确。

我尝试了cmap Q qcmap W w,但这也会影响搜索模式,即/Query/query(实际上你无法输入上层Q)。

我还尝试了cabbrev Q q,这也会影响搜索模式。

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

感谢。

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到,而且两者都不是很简单。

使用command,您需要处理属性:

command! -nargs=* -complete=file -range=% -bang -bar W w
command! -bang -bar Q q

对于cabbrevwiki中描述了陷阱,所以你需要这样做:

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