使用vim中的块选择从行尾删除

时间:2013-01-04 21:50:56

标签: vim

当我尝试使用vim中的块选择从行尾删除时,我遇到了异常行为。

所以我要说我有一个文本:

delete this char:x
and this:x
also this:x
and then this:x
lastly this:x

如果我想将y附加到每行我可以:

  • 使用 C-v
  • 开始选择块
  • 选择4j
  • 的所有行
  • 使用$
  • 转到行尾
  • 开始追加A
  • 输入所需的文字y

为了获得:

delete this char:xy
and this:xy
also this:xy
and then this:xy
lastly this:xy

但如果我尝试在最后一步删除x而不是追加,我希望得到:

delete this char:
and this:
also this:
and then this:
lastly this:

虽然我最终得到了:

delete this char:
and this:x:
also this:x:
and then this:x:
lastly this:x:

据我了解,它将第一行中的最后一个字符添加到所有其他行(在本例中为:),而不是删除缺少的字符串(在本例中为x)。

我可以用宏或替代品来做这件事,但我不太明白这种行为背后的理由。我有办法用块选择吗?

4 个答案:

答案 0 :(得分:8)

你试过:{range}normal吗?这应该有效:

:'<,'>normal $x

(当您输入时,'<,'>位将填入。)

答案 1 :(得分:6)

$ C-v 4j x

  1. 使用$
  2. 转到行尾
  3. 切换视觉区块C-v
  4. 下去(在你的情况下为4x)4j
  5. 使用x
  6. 删除这些内容

    修改 :(对您的任意缩进评论做出反应)

    可以使用简单的宏来完成。宏并不像你想象的那么难:

    1. 开始录制宏,我们将其命名为'a',因此qa
    2. 转到第$
    3. 删除一个字符x
    4. 使用j
    5. 向下一行
    6. 结束我们的宏q
    7. 现在应用我们的宏:20@a - 将执行与录制宏时相同的操作,20x。

答案 2 :(得分:4)

如果我有少量行,我通常会 A backsapce esc 。然后反复做 j 直到完成。不是最快的方式,但容易记住。

对于大量的线,我通常通过 V 在视觉上选择线,然后对范围进行替换或正常命令。

:'<,'>s/.$//
:'<,'>norm $x

注意:您不必键入'<,'>。当视觉选择某些文本时,它会在您启动命令时自动插入。

替换命令非常简单,匹配最后一个字符(.$),然后将其替换为空。

正常命令就是如何通过 $ x 删除正常模式中的最后一个字符,除了它将它应用于范围中的每一行

如需更多帮助,请参阅:

:h range
:h :s
:h :norm

答案 3 :(得分:2)

正如你所说,为了实现你的目标,还有其他方法,实际上是更好的方法。 :sq(macro):g/.../norm $x:s/.$//g非常简单明了。

Ctrl-V不适合此作业。至于它的名字:Visual BLOCK 。您想要删除最后一个x,并且它们(仅x)不在块中。

但是如果你真的想坚持使用ctrl-v,你必须做一些额外的工作,在一个块中制作那些'x'。如果您安装了Align插件,则可以:

选择(V)你要做的所有行,

<leader>t:

然后你的文字看起来像:

delete this char : x
and this         : x
also this        : x
and then this    : x
lastly this      : x

Ctrl-V要删除x,您应该知道该怎么做。

然后

:%s/ *:/:/g

删除':'

之前的填充空格

但我认为这不是一个好方法。