在Vim中,我如何有效地在多行中插入相同的字符?

有时我想跨多行编辑某个可视文本块。

例如,我会看到如下所示的文本:

name
comment
phone
email

让它像这样流淌

vendor_name
vendor_comment
vendor_phone
vendor_email

目前我现在要做的方式是......

  • 按V再按j选择所有4行块。
  • 缩进>。
  • 带h回去一封信。
  • 使用ctrlv转到阻止可视模式。
  • 按j键4下选择4行。 此时,您已经选择了一个4x1的空格可视块(4行,1列)。
  • 按c。 注意,这几乎缩进了一列的左侧。
  • 输入" vendor_"不含引号。 注意我们必须放回的额外空间。
  • 按esc。 这是我使用esc退出插入模式的少数几次之一。 ctrlc只会编辑第一行。
  • 重复步骤1。
  • 用<来缩小另一个方向。
  • 如果在单词前至少有一列空白,我不需要缩进。 如果我不需要用c清除视觉块,我不需要空白。

    但是如果我必须清楚,那么是否有办法做到我在上面执行的操作,而不用缩进来创建所需的空格?

    此外,为什么一次编辑多行只能通过使用esc over ctrlc退出插入模式?

    编辑:

    这是一个更复杂的例子

    name    = models.CharField( max_length = 135 )
    comment = models.TextField( blank = True )
    phone   = models.CharField( max_length = 135, blank = True )
    email   = models.EmailField( blank = True )
    

    name    = models.whatever.CharField( max_length = 135 )
    comment = models.whatever.TextField( blank = True )
    phone   = models.whatever.CharField( max_length = 135, blank = True )
    email   = models.whatever.EmailField( blank = True )
    

    在这个例子中,我会执行垂直视觉模块. ,然后在插入模式下重新插入,即键入.whatever. 。 希望现在你可以看到这种方法的缺点。 我仅限于选择垂直位置上相同的文本列。


  • 将光标移动到nname
  • 进入视觉模块模式(ctrlv)。
  • 按j三次。
  • I (首都)。
  • 输入vendor_
  • 按esc。
  • 演示该方法的微型屏幕录像

    必须使用大写字母I而不是小写字母i因为小写字母i被解释为文本对象的开始,这对于自己而言非常有用,例如,用于在标签块( it )内选择内部:

    显示它的文本对象的有用性的迷你屏幕录像


    另一种方法是使用。 ( dot )命令与I相结合。

  • 将光标移动到要开始的位置
  • 按I
  • 输入你想要的前缀(例如vendor_
  • 按esc。
  • 按j键下线
  • 类型。 重复上次编辑,再次自动插入前缀
  • j和j之间快速交替。
  • 我发现这种技术通常比用于少量添加的可视块模式更快,并且还具有额外的好处,如果您不需要在范围内的每一行上插入文本,则可以通过按下多余的j来轻松地跳过它们。

    请注意,对于大量连续添加,块方法或宏可能会更好。


    我会用宏来记录我的动作,然后重复它。

  • 将光标放在名字的第一个字母上。
  • 点击qq开始记录到q缓冲区。
  • i进入插入模式,输入vector_ ,然后按ESC退出插入模式。
  • 现在点击0返回到行首。
  • 现在打到j去。
  • 现在再次点击q停止录制。
  • 你现在有一个不错的宏。

    键入3@q来执行你的宏3次来完成其余的行。

    链接地址: http://www.djcxy.com/p/49461.html

    上一篇: In Vim how do I effectively insert the same characters across multiple lines?

    下一篇: Vim: faster way to select blocks of text in visual mode