试图理解 Vim 中的删除逻辑

Trying to understand the logic of deletions in Vim

我用谷歌搜索了这个,但找不到任何明确的解释。

很多人称赞 Vim 是一种内部一致的语言,但我没有看到一致性。

因为 hjkl 从左到右:

dh 与 "delete left" 类似,它删除光标左侧的字符,到目前为止是有意义的。

dl 类似于 "delete right" 但它会删除...当前字符?

dj 就像 "delete down",我假设这只是删除下面的行,但它实际上也删除了当前行!

'dk' 就像 "delete up" 一样,我希望它只是清除上面的行,而是清除当前行和上面的行。

谁能解释一下这里的逻辑是什么?我对 delete + 左右处理同一行字符和 delete + 上下处理行的想法没意见,但为什么行为如此不一致?我在这里缺少什么逻辑?

或者它真的更像是 "there is no consistent logic here really, just memorize it" 的东西?

你不应该 "assume" 或 "expect" 任何东西。 Vim 的在线文档中对所有这些命令的行为进行了精确解释。

hjkl 是动作,d 是对动作覆盖的文本起作用的运算符。

  • dj 处理 j 议案所涵盖的文本。由于 j 是将光标移动到下一行的线性运动,因此 dj 是 "cut this line and the one below".

  • dk 处理 k 议案所涵盖的文本。由于 k 是将光标移动到上面一行的线性运动,因此 dk 是 "cut this line and the one above".

对于水平移动,你必须明白终端的光标实际上是两个字符之间:

sample text:                lorem

the "current character":    lorem
                              ^

the "cursor":               lo|rem

the text covered by "h":    l|orem
                              ←

the text covered by "l":    lor|em
                              →
  • dh 作用于 h 动作覆盖的文本,因此它会剪切 "cursor" 之前的字符,而 "cursor" 恰好也是 [ 之前的字符=58=].

  • dl 作用于 l 动作覆盖的文本,因此它会剪切 "cursor" 之后的字符,恰好是 "current character" .

这是一致的。将其视为文本光标,而不是块光标,例如:

abc
 ^

您在此处使用光标。删除命令其实是这样的:

a|bc

Vim 始终适用于范围。如果不指定范围,只指定一个目标,则范围的第一个点永远是光标位置: 所以dh就是从这里删除到h,下面的h位置:

|abc

所以你告诉 vim 从 a|bc|abc 删除,因此光标位置之间的所有内容都被删除。

dla|bcab|c 的另一个方向 -> a|b|c 所以只有 b 会被删除。

jk动作中,都是以行为主,但基本相同。

因此,如果您在以下情况下按 dk

abc

abc
 ^

您告诉 vim 删除每一行,直到到达以下位置:

abc
 ^
abc

这与 vim 中的所有其他命令一致,并且是 vim 如此强大的部分原因。 想想搜索 / 命令,例如:

 abc
 a|bc
 abc
 dfe
 dfe 
 dfe

如果您按 d/dfe<CR>,它不仅会删除 dfe,还会删除 dfe。所以你将有以下两个光标位置:

 abc
 a|bc
 abc
 |dfe    
 dfe 
 dfe

中间的所有内容都将被删除,您最终会得到:

 abc
 a
 dfe    
 dfe 
 dfe

其他所有动作都是如此。