让我们开始研究 vi(m) 中的一些运动。我用的是样品线
AA BBB
作为这些调查的主题,对于每个实验,我们都以正常模式开始,光标位于行首。实验也将以正常模式结束,我添加了一个封闭rX
操作来指示最终的光标位置。
所以请看这四个动作:tB
、fB
、w
、3l
。第一个将光标移动到前面的空格BBB
,其他的移动到第一个B
。那是,
tBrX # AAXBBB
fBrX # AA XBB
wrX # AA XBB
3lrX # AA XBB
现在让我们看看文档是如何在删除上下文中执行这些移动的:
维姆:
d{motion} Delete text that {motion} moves over
FreeBSD vi(1) 手册页:
d motion Delete the region of text described by ... motion
所以这些表达了一个简单而清晰的概念,删除和运动的构成。此时,几乎一切似乎都清楚了,除了删除范围是包含的还是排除的,即。移动结束后的位置是否被删除或保留。
如果是的话独家的,在上述操作前面加上前缀d
应该只删除以下所有内容X
:
dtBrX # XBBB
dfBrX # XBB
dwrX # XBB
d3lrX # XBB
如果是的话包括的,上面指示的位置X
也被删除,所以最终的位置是后续位置,即又一个角色将被吞噬,因此我们得到:
dtBrX # XBB
dfBrX # XB
dwrX # XB
d3lrX # XB
现在让我们看看它是怎样的现实生活:
dtBrX # XBB
dfBrX # XB
dwrX # XBB
d3lrX # XBB
也就是说,组成是包括的对于前两个动作,但是独家的对于后两者!请问有什么原理可以解释这个吗?
另外,还有c
,在 Vim 文档中描述为Delete {motion} text and start insert
。我预计,从规范来看,如果我们在c
:之后返回正常模式,则具有与(如中讨论的c{motion}<ESC>l
相同的效果)d{motion}
为什么 vim 中 `ESC` 会将光标移回原处?,<ESC>
具有向左移动光标的效果,因此l
如果我们想通过正常/插入模式往返保持位置,我们需要补偿)。嗯,差不多了:
ctB<ESC>lrX # XBB
cfB<ESC>lrX # XB
cw<ESC>lrX # XBBB
c3l<ESC>lrX # XBB
...仅c
与 结合使用w
会产生不同的效果:此操作甚至会保留 之前的空格BBB
,即移动目的地之前的字符!这种行为背后的逻辑是什么?
答案1
d
其本身既不具有包容性,也不具有排他性。这动议是。每个动议的帮助说明了它是包容性的还是排他性的:
f
f{char} To [count]'th occurrence of {char} to the right. The
cursor is placed on {char} |inclusive|.
t
t{char} Till before [count]'th occurrence of {char} to the
right. The cursor is placed on the character left of
{char} |inclusive|.
<S-Right> or <S-Right> w
w [count] words forward. |exclusive| motion.
l or l
<Right> or <Right> <Space>
<Space> [count] characters to the right. |exclusive| motion.
更多详情请参见:h inclusive
。
也就是说,构图包含前两个乐章,但排除后两个乐章!请问有什么原理可以解释这个吗?
可以看出,f
和t
是包容性的,w
并且l
是排他性的。
与
c
w 结合使用会产生不同的效果:此操作甚至保留 前面的空格BBB
。
这是文档中也提到的一个特殊情况。再往下看一点:h word
:
Special case: "cw" and "cW" are treated like "ce" and "cE" if the cursor is
on a non-blank. This is because "cw" is interpreted as change-word, and a
word does not include the following white space.