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