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

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

例如,我将采取如下所示的文本:

name comment phone email 

让它像这样stream淌

 vendor_name vendor_comment vendor_phone vendor_email 

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

  1. V ,然后按jselect全部4行块。
  2. 缩进>
  3. 回去一个字母h
  4. 使用ctrl v转到阻止可视模式。
  5. j键 4下select4行。 在这一点上,你已经select了一个4×1的可视空白块(4行,1列)。
  6. c 。 注意,这几乎是向左缩进一列。
  7. input一个" vendor_"不带引号。 注意我们必须放回的额外空间。
  8. esc 。 这是我使用esc退出插入模式的less数几次之一。 ctrl c只会编辑第一行。
  9. 重复步骤1。
  10. <<另一种方式缩进。

如果在单词前至less有一列空格,我不需要缩进。 如果我不需要用c来清除视觉块,我不需要空白。

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

另外为什么一次编辑多行只能通过退出插入模式与esc通过ctrl c

编辑:

这是一个更复杂的例子

 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. 。 希望现在你可以看到这种方法的缺点。 我仅限于select垂直位置上相同的文本列。

  1. 将光标移到name
  2. 进入视觉模块模式( ctrl v )。
  3. j三次。
  4. I (首都)。
  5. inputvendor_
  6. esc

演示该方法的小屏幕录像

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

显示它的文本对象的有用性的迷你截屏

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

  1. 将光标移动到要开始的位置
  2. I键
  3. input你想要的前缀(例如vendor_
  4. esc
  5. j键下线
  6. types 重复上次编辑,再次自动插入前缀
  7. jj之间快速交替

我发现这种技术通常比用于less量添加的可视块模式更快,并且还有另外的好处,如果你不需要在一个范围内的每一行插入文本,你可以通过按下额外的j '秒。

请注意,对于大量的连续添加,块方法或macros可能会优于。

我会用macros来logging我的行为,然后重复它。

  1. 把你的光标放在名字的第一个字母上。
  2. 点击qq开始logging到q缓冲区。
  3. i进入插入模式,并inputvector_ ,然后按ESC退出插入模式。
  4. 现在点击0返回到行首。
  5. 现在打到j去。
  6. 现在再次点击q停止录制。

你现在有一个很好的macros。

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

 :%s/^/vendor_/ 

还是我错过了什么?

  1. 使用Ctrl-vselect要修改的行。
  2. 按:

    • I :在select之前插入。
    • A :追加什么select。
    • c :replace选中的内容。
  3. input新的文字。

  4. Esc将更改应用于所有选定的行。

2016年1月更新

虽然接受的答案是一个很好的解决scheme,但这实际上是轻微的击键less一些,并且更好地扩展 – 原则上基于被接受的答案。

  1. 将光标移到name
  2. 进入视觉模块模式( ctrl v )。
  3. 3j
  4. I
  5. inputvendor_
  6. esc

视觉例证

请注意,这比所提供的接受答案less击键(比较第3步)。 我们只计算要执行的j个动作的数量。

如果您启用了行号(如上所示),并知道您想要移动到的行号,则步骤3可以更改为#G ,其中#是想要的行号。

在我们上面的例子中,这将是4G 。 但是,只处理几行数时,明确的计数效果很好。

假设你有这个文件:

 something name comment phone email somethine else and more ... 

无论在文件中出现的位置如何,您都要在“名称”,“评论”,“电话”和“电子邮件”前添加“vendor_”。

 :%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc 

c标志会提示您确认。 如果你不想要提示,你可以放弃。

您可能还有一个用例,您要删除一段文本并将其replace。

喜欢这个

 Hello World Hello World 

 Hello Cool Hello Cool 

你可以直观地select两行中的“世界”。

键入c进行更改 – 现在您将处于插入模式。

插入你想要的东西,并点击逃生。

两者都被垂直reflection。 它像“我”一样工作,只不过是用新文本replace块而不是插入它。

我想在一个只有vi(没有纳米)的服务器上的一些configuration文件中注释了很多行 ,所以可视化方法也很麻烦以下是我如何做到这一点。

  1. 打开文件vi file
  2. 显示行号:set number! 或者:set number
  3. 然后用行号代替“#”开头的行,怎么样?

:35,77s/^/#/

注意:数字是包含性的,从35到77的行,都将被修改。

要取消注释/撤销该操作,只需使用:35,77s/^#//

如果您想在每行代码之后添加文字作为注释,您还可以使用:

:35,77s/$/#test/ (像Python这样的语言)

:35,77s/;$/;\/\/test/ (对于像Java这样的语言)

币/参考:

  1. https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

 Use Ctrl+V to enter visual block mode Move Up/Down to select the columns of text in the lines you want to comment. Then hit Shift+i and type the text you want to insert. Then hit Esc, wait 1 second and the inserted text will appear on every line