vi / Vim:用动作组合删除/更改(d/c)的奇怪之处

vi / Vim:用动作组合删除/更改(d/c)的奇怪之处

让我们开始研究 vi(m) 中的一些运动。我用的是样品线

AA BBB

作为这些调查的主题,对于每个实验,我们都以正常模式开始,光标位于行首。实验也将以正常模式结束,我添加了一个封闭rX操作来指示最终的光标位置。

所以请看这四个动作:tBfBw3l。第一个将光标移动到前面的空格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

也就是说,构图包含前两个乐章,但排除后两个乐章!请问有什么原理可以解释这个吗?

可以看出,ft是包容性的,w并且l是排他性的。


cw 结合使用会产生不同的效果:此操作甚至保留 前面的空格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.

相关内容