我可以让 Vim 过滤输入的 ex 命令吗?

我可以让 Vim 过滤输入的 ex 命令吗?

我知道解决这个问题的最好办法可能是一开始就不要草率地打字,但我只是认为这样做真的很好。

由于我已经使用 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命令,因此您无需进行元编程。

相关内容