使用vim中的block select从行末尾删除

使用vim中的block select从行末尾删除,vim,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 t

当我试图在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


我可以用宏或替代品来实现这一点,但我不太理解这种行为背后的原理。有没有一种方法可以通过块选择来实现这一点?

$
C-v
4j
x

  • 使用
    $
  • 切换可视块
    C-v
  • 向下(在您的情况下为4x)
    4j
  • x
  • 编辑:(对您的评论做出任意缩进的反应)

    这可以通过简单的宏实现。宏并不像您想象的那么难:

  • 开始录制宏,我们将其命名为“a”,因此
    qa
  • 转到行的末尾
    $
  • 删除一个字符
    x
  • j向下移动一行
  • 结束我们的宏
    q

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

    如果我有少量行,通常会执行BackspaceEsc。然后重复做j。直到完成。不是最快的方法,但很容易记住

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

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

    正如你自己所说,要实现你的目标,还有其他的方法,事实上更好的方法<代码>:s
    q(宏)
    :g/../norm$x
    :s/$//g
    非常简单

    Ctrl-V不适合此工作。至于它的名字:VisualBLOCK。如果要删除最后一个x,则它们(仅x)不在块中

    然而,如果你真的想坚持使用ctrl-v,你必须做一些额外的工作,使那些“x”在一个块中。如果已安装Align插件,则可以:

    选择(
    V
    )要执行此操作的所有行

    <leader>t:
    
    Ctrl-V
    要删除x,您应该知道如何操作

    然后

    要删除“:”之前的填充空格,请执行以下操作


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

    你试过
    :{range}normal
    ?这应该起作用:

    :'<,'>normal $x
    

    :“这是可行的,但我需要一些可以处理任意缩进的东西。我已经相应地编辑了这个问题。宏解决方案的问题是我必须计算需要修改的行数。我不了解您描述的行为。第一个
    x
    被删除,但没有添加任何内容。@Romaill您是否使用问题中相同的示例?如果您使用的是
    删除此字符:x
    和delete
    x
    ,它会添加尾随空格,这可能很容易丢失..不,我可以看到尾随空格,但没有。在此上下文中,
    {movement}$A
    ,并不是在选择中的每一行都删除字符。只有添加字符才有效。如果你想听听我的意见的话,这有点短视,但它就是这样设计的。删除一系列行末尾的
    x
    通常是通过
    完成的:“这些都很好,但没有一个比视觉块更直观。在放弃之前,我想先把这个问题留一段时间,因为我仍然觉得没有理由阻止实现这样一个功能。如果你把它做成一个宏,你可以重复任意次数,例如
    10@
    ,而不是
    j.j.j.j.j.j.j.j.j.
    (4次击键而不是20次,再加上录制宏所需的3次额外击键(
    q
    q
    ))。我想解释一下它对上述解决方案的作用会很好。我试图在中编辑一次,但被拒绝。
    {range}
    在帮助文件中是非常常见的Vim语言。
    normal
    是一个命令,它输入以下内容,就像您在正常模式下键入它们一样。因此,该命令对每行都起作用:转到行尾,然后删除光标下的字符。注意:您需要先使用
    ctrl+V
    来选择视觉块。
    delete this char : x
    and this         : x
    also this        : x
    and then this    : x
    lastly this      : x
    
    :%s/ *:/:/g
    
    :'<,'>normal $x