我知道解决这个问题的最好办法可能是一开始就不要草率地打字,但我只是认为这样做真的很好。
由于我已经使用 Vim 一段时间了,因此;w
(我已将普通模式映射;
到:
)对我来说有点习惯。但是,我不喜欢的是,有时我打字太快,导致不好的事情发生。
看看我的 vimrc...
"""" Commenting out cmaps because cmap applies when e.g. typing in (/)-search mode
" " prevent common typos from actually writing files to disk
" cmap wq1 wq!
" cmap w1 w!
" cmap q1 q!
" cmap qa1 qa!
" cmap e1 e!
"
" cmap w; w
"
" cmap qw wq
" cmap qw! wq!
" cmap qw1 wq!
"
" " and more combinatorially exploding goodness for dealing with flubbing the
" " enter key
" cmap wq\ wq
" cmap wq1\ wq!
" cmap wq!\ wq!
" cmap w\ w
" cmap w1\ w!
" cmap w!\ w!
这段代码还有 50 行左右。
它们都带有注释,因为在用于搜索cmap
时适用。这是个大问题。/
:w
这甚至没有涵盖我写入后碰巧混入一些特殊字符的情况,这不知何故导致 vim 将缓冲区写入以该字符命名的文件中。这真是丢掉一些工作的好办法。
有什么想法吗?这需要我编辑 vim 源代码,不是吗...
答案1
你是对的,它的缺点:cmap
是它适用于所有命令行模式,所以它也会阻止你搜索这些字符串。
一个解决方案是检查类型命令行模式,通过表达式映射:
cnoremap <expr> w1 getcmdtype() == ':' ? 'w!' : 'w1'
如果你很聪明,你可以进行元编程并在循环中定义所有映射,只需传入源字符串和目标字符串。
即使那些修改过的映射仍然不允许您输入那些映射的字符串,例如作为命令参数(因此您不能轻易地:w w1
,只能通过转义后者<C-V>
)。
插入
这cmdalias.vim - 为 Vim 命令创建别名插件还会检查命令位置,从而处理参数。它还提供了一个方便的:Alias
命令,因此您无需进行元编程。