了解 Vim 独家动议

Understanding Vim exclusive motion

我指的是:http://vimdoc.sourceforge.net/htmldoc/motion.html#exclusive。 具体如下文字:

Which motions are linewise, inclusive or exclusive is mentioned with the command. There are however, two general exceptions:

  1. If the motion is exclusive and the end of the motion is in column 1, the end of the motion is moved to the end of the previous line and the motion becomes inclusive. Example: } moves to the first line after a paragraph, but d} will not include that line.

给定以下文本开头:

This is just a random paragraph.

This is another random paragraph ([S]ome text inside brackets).

This is a third paragraph.

我将光标放在字符 S 上,就在第二段的 ( 之后。

我在正常模式下执行以下命令 - d}。我得到以下信息:

This is just a random paragraph.

This is another random paragraph [(]

This is a third paragraph.

光标现在在第二段的(上。根据上述规则,这是预期的:} 是排他性动议,它会导致光标转到第 2 段和第 3 段之间空白行的第 1 列;根据规则,光标转到上一行(在句号处),并且运动变为包含(句号作为 d 操作的一部分被删除)。

我们还是把原文拿过来,把光标再次放在S上。

如果我执行以下命令 - d{ - 在正常模式下,我希望得到以下结果,因为 { 是一个独占动作,它会导致光标转到第 1 段和第 2 段之间空白行的第 1 列:第 1 段句号和 S 之间的所有内容都被删除,包括在内。

This is just a random paragraphome text inside brackets).

This is a third paragraph.

但实际情况是这样的:

This is just a random paragraph.  
[S]ome text inside brackets).

This is a third paragraph.

光标位于 S

这是异常的异常吗?还是我完全弄错了?

关于排他性动作,要理解的重要一点是被排除的字符始终是距离缓冲区末端最远的字符

前进时排除的是跳转到的字符,后退时排除的实际上是光标下的字符。

这是你的第二个例子。 { 涵盖的部分以粗体突出显示。

This is just a random paragraph.␤
<strong>␤
This is another random paragraph (S</strong>ome text inside brackets).␤
␤
This is a third paragraph.␤

如你所见,S被覆盖了,但它是目标最右边的字符,因此——{是一个独占动议——它不受操作的影响。

它之前的所有内容,包括它之前的行中的换行符({ 光标所在的位置)都被删除。所以你看到的确实是预期的:

This is just a random paragraph.␤
Some text inside brackets).␤
␤
This is a third paragraph.␤

@glts 经过深思熟虑,我想我现在明白你想说什么了。基本上我误解了手册中 'start of motion' 和 'end of motion' 的意思。简而言之,如果我理解正确,'start of motion' 始终是最接近缓冲区开始的位置,而 'end of motion' 是最接近缓冲区末尾的位置,无论 'direction'其中的动作导致光标移动!