我在 vim 8.2、vim 9 和 nvim 0.10.2 中发现了两个奇怪的行为omap
。它可能适用于所有运算符(至少d
,,,我已经测试过了),但我将在下面选择一个例子y
。c
d
用 表示行尾␊
。
案例 1
缓冲区是
␊
abc␊
光标位于b
。
使用 时dge
,除了 之外,缓冲区会被清除,c
这并不奇怪。但是,使用d2ge
(或 ,2dge
相当于 ,d3ge
,d4ge
等),光标会移动到第一行的开头,并且不会删除任何内容(或对于运算符c
,我们不会处于插入模式)!
案例 2
缓冲区是
abc␊
光标位于a
。使用db
,没有任何变化。这是因为 不b
包括。但是,使用dge
,即包括 ,同样没有任何变化!
我尝试在手册中查找,但无济于事。有人可以解释这种行为吗,希望可以参考 vim 手册?非常感谢!
为什么这对我有用:我正在开发一个vim 插件,将 vim单词移动扩展到没有单词边界的语言,比如中文。一个重要特性是与 ASCII 文本上的 vim 兼容。因此,我需要了解 vim/nvim 中的此类行为细节。
案例 1
dge
根本不“清除缓冲区”,因为动作不包括c
。你的意思是“光标位于c
”吗?d2ge
不执行任何操作,因为在您的示例中,不可能将光标移动到不存在的第二个前一个单词的末尾。由于移动过程中出现错误,因此不执行该操作。案例 2
这基本上是同一个问题:和
b
都是ge
不可能的,所以操作不会执行:b
则将光标移至上一个单词的第一个字母。无上一个单词 → 错误 → 无动作 → 无操作。ge
将光标移动到上一个单词的最后一个字符。无上一个单词 → 错误 → 无动作 → 无操作。换句话说,您描述的行为是预期的行为。