理解 Vim 独占运动

4
我参考了此链接:http://vimdoc.sourceforge.net/htmldoc/motion.html#exclusive。具体而言,以下文字内容如下:
哪些动作是行内、包容或排除是在命令中提到的。然而有两个一般例外情况:
如果运动是排他的且运动结束于第1列,则运动结束于前一行的结尾,并变成包容。例如:}将移至段落后的第一行,但d}不包括该行。
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上时。

这是例外中的例外吗?还是我完全搞错了?

2个回答

4
重要的是要理解“独占式运动”的含义,即被排除的字符总是在缓冲区末尾最远的字符
当您向前移动时,被排除的是您要跳转到的字符,但当您向后移动时,实际上被排除的是光标下的字符。
以下是第二个示例的说明。由{覆盖的部分以粗体突出显示。
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.␤

是的,这是“正常”的行为。但正如我在问题开头提到的那样,根据参考手册,这个规则有一个例外;否则你怎么解释我给出的第一个例子(带有“d}”)呢? - arunj
@arunj 我觉得你自己已经很好地解释了第一个例子。正如你所解释的,并且在你引用的帮助文本中所描述的那样,它就是这样的。你的问题是关于第二个例子是如何工作的,对吗?无论如何,“异常”确实适用于第一个例子的情况,但不适用于第二个例子的情况。 - glts
这正是我困惑的地方……为什么异常情况不适用于示例2中的情况?所有规则适用的条件都已经具备——运动是独家的,运动的结束在第一列(在空白行中)。 - arunj
1
@arunj 不是的,这就是为什么我在我的回答的第一句话中添加了高亮 :) “运动结束”不在第1列,而是在第35列的S上。 - glts
也许我错过了什么,但是那个异常对我来说没有意义;它似乎与规则相同。正如在这个答案中引用的那样,“当为exclusive时,缓冲区末尾的最后一个字符不包括在内。”,而且无论结束是否在第一列,都会发生这种情况——例如,dw保留下一个单词的第一个字符,db保留光标下的字符。 - mMontu
显示剩余3条评论

0

@glts 经过深思熟虑,我现在明白你想说什么了。基本上,我误解了手册中“运动开始”和“运动结束”的含义。简而言之,如果我理解正确,“运动开始”始终是最靠近缓冲区开头的位置,“运动结束”是最靠近缓冲区结尾的位置,无论运动使光标向哪个“方向”移动!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接