当我尝试使用vim中的块选择从行尾删除时,我遇到了异常行为。
所以我要说我有一个文本:
delete this char:x
and this:x
also this:x
and then this:x
lastly this:x
如果我想将y
附加到每行我可以:
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
)。
我可以用宏或替代品来做这件事,但我不太明白这种行为背后的理由。我有办法用块选择吗?
答案 0 :(得分:8)
你试过:{range}normal
吗?这应该有效:
:'<,'>normal $x
(当您输入:时,'<,'>
位将填入。)
答案 1 :(得分:6)
$
C-v
4j
x
$
C-v
4j
x
修改 :(对您的任意缩进评论做出反应)
可以使用简单的宏来完成。宏并不像你想象的那么难:
qa
$
行x
j
q
现在应用我们的宏:20@a
- 将执行与录制宏时相同的操作,20x。
答案 2 :(得分:4)
如果我有少量行,我通常会 A backsapce esc 。然后反复做 j 。直到完成。不是最快的方式,但容易记住。
对于大量的线,我通常通过 V 在视觉上选择线,然后对范围进行替换或正常命令。
:'<,'>s/.$//
:'<,'>norm $x
注意:您不必键入'<,'>
。当视觉选择某些文本时,它会在您启动命令时自动插入。
替换命令非常简单,匹配最后一个字符(.$
),然后将其替换为空。
正常命令就是如何通过 $ x 删除正常模式中的最后一个字符,除了它将它应用于范围中的每一行
如需更多帮助,请参阅:
:h range
:h :s
:h :norm
答案 3 :(得分:2)
正如你所说,为了实现你的目标,还有其他方法,实际上是更好的方法。 :s
或q(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
删除':'
之前的填充空格但我认为这不是一个好方法。