11

当我尝试使用 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

4 回答 4

11

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

:'<,'>normal $x

'<,'>当您键入时,该位会为您填写:。)

于 2013-01-05T02:27:46.487 回答
6

$ C-v 4j x

  1. 走到行尾$
  2. 切换视觉块C-v
  3. 往下走(在你的情况下是 4x)4j
  4. 删除那些东西x

编辑:(对您对任意缩进的评论作出反应)

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

  1. 开始录制宏,我们将其命名为“a”,所以qa
  2. 走到行尾$
  3. 删除一个字符x
  4. 下一行j
  5. 结束我们的宏q

现在应用我们的宏:20@a- 将执行与录制宏时相同的操作,20 倍。

于 2013-01-04T22:21:52.487 回答
5

如果我的行数很少,我通常会这样做Abackspaceesc。然后反复做j.,直到做完。不是最快的方法,但很容易记住。

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

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

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

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

普通命令就是你如何删除普通模式下的最后一个字符,$x除非它将应用于范围内的每一行。

如需更多帮助,请参阅:

:h range
:h :s
:h :norm
于 2013-01-04T23:07:20.860 回答
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

删除“:”之前的填充空格

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

于 2013-01-05T00:26:43.397 回答