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

Vim 如何在命令行模式下映射键,而不是在搜索模式下映射键,vim,Vim,我想在命令行模式下映射VIM中的一个键,但不想在搜索模式下映射(带前导的/),如下所示: 将Q映射到Q 从西到西映射 有时我在VIM中输入了错误的命令,比如:Q和:W,我希望这些错误的命令是正确的 如果我可以将Q映射到Q和W映射到W,我就可以将错误的命令映射为正确的命令 我尝试了cmap Q和cmap W,但这也会影响搜索模式,即/Query成为/Query(实际上您无法键入较高的Q) 我还尝试了cabbrev Q,这也会影响搜索模式 那么,还有其他命令可以满足我的要求吗 谢谢。在本例中,您

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

  • 将Q映射到Q
  • 从西到西映射
有时我在VIM中输入了错误的命令,比如
:Q
:W
,我希望这些错误的命令是正确的

如果我可以将
Q
映射到
Q
W
映射到
W
,我就可以将错误的命令映射为正确的命令

我尝试了
cmap Q
cmap W
,但这也会影响搜索模式,即
/Query
成为
/Query
(实际上您无法键入较高的Q)

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

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


谢谢。

在本例中,您可以定义一个用户命令,因为它以大写开头

:command! Q q
:command! W w

有很多方法可以做到这一点,但都不是很简单

使用
命令
您需要注意以下属性:

command! -nargs=* -complete=file -range=% -bang -bar W w
command! -bang -bar Q q
使用
cabbrev
中描述了陷阱,因此您需要这样做:

cnoreabbrev W <C-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'w' : 'W')<CR>

最安全的可能是
cabbrev
方式。

在你想做类似
:Q,或
:W file
谢谢您的回答,但它仍然有一些问题。我还想让
:Wq
:Wq
:Wq
工作。所以我可能需要添加这三个命令。@zhiwei是的,您必须对它们中的每一个都执行相同的操作。恐怕没有捷径了。
function! s:CAbbrev(from, to)
    execute 'cnoreabbrev ' . a:from . ' <C-r>=(getcmdtype()==#'':'' && getcmdpos()==1 ? ' . string(a:to) . ' : ' . string(a:from) . ')<CR>'
endfunction
cnoremap <nowait> <expr> W getcmdtype() ==# ':' && getcmdpos() == 1 ? 'w' : 'W'