Vim:在多行中插入相同的字符

时间:2012-03-03 20:44:46

标签: vim

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

例如,我会采用如下文字:

name
comment
phone
email

让它像这样被拉出来

vendor_name
vendor_comment
vendor_phone
vendor_email

目前我现在的做法是......

  1. V 然后 j 4次选择所有4行块。
  2. 缩进>
  3. 使用 h 返回一个字母。
  4. 使用 ctrl v 进入阻止视觉模式。
  5. j 选择向下4行。此时,您已选择了一个4x1的空白视觉块(4行,1列)。
  6. c 。请注意,这一列几乎向左缩进了一列。
  7. 键入不带引号的" vendor_"。注意我们不得不放回的额外空间。
  8. esc 。这是我使用 esc 退出插入模式的极少数时间之一。 ctrl c 只会编辑第一行。
  9. 重复步骤1.
  10. 使用<
  11. 缩小其他方式

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

    但是如果我必须清除,那么有没有办法在不创建所需的缩进空格的情况下执行上面执行的操作?

    另外,为什么一次编辑多行只能通过 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.。希望现在你可以看到这种方法的缺点。我仅限于选择一列文字在垂直位置

12 个答案:

答案 0 :(得分:791)

  1. 将光标移动到n中的name
  2. 进入视觉区块模式( ctrl v )。
  3. j 三次(或 3j )。
  4. I (大写i)。
  5. 输入vendor_
  6. esc
  7. mini-screencast demonstrating the method

    必须使用大写I而不是小写i,因为小写i被解释为text object的开头,这本身就很有用,例如用于选择标记块内部(it):

    mini-screencast showing the usefulness of the it text object

答案 1 :(得分:62)

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

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

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

答案 2 :(得分:27)

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

  1. 将光标放在名字的第一个字母上。
  2. 点击qq开始录制到q缓冲区。
  3. 点击i进入插入模式,然后输入vector_,然后点击ESC退出插入模式。
  4. 现在点击0返回到行首。
  5. 现在点击j下降。
  6. 现在再次点击q以停止录制。
  7. 你现在有一个漂亮的宏。

    键入3@q以执行宏3次以执行其余行。

答案 3 :(得分:27)

  1. 使用 Ctrl V 选择要修改的行。
  2. 出版社:

    • I :在选择之前插入。
    • A :在选择的内容后附加。
    • C :替换所选内容。
  3. 输入新文字。

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

答案 4 :(得分:24)

:%s/^/vendor_/

或者我错过了什么?

答案 5 :(得分:11)

2016年1月更新

虽然接受的答案是一个很好的解决方案,但实际上这个键击的次数会少一些,并且可以更好地扩展 - 原则上基于接受的答案。

  1. 将光标移动到n中的name
  2. 进入视觉区块模式( ctrl v )。
  3. 3j
  4. I
  5. 输入vendor_
  6. esc
  7. visual illustration

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

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

    在上面的示例中,这将是 4G 。但是,当处理几个行号时,显式计数效果很好。

答案 6 :(得分:6)

您可能还有一个用例要删除文本块并替换它。

喜欢这个

Hello World

Hello World

Hello Cool

Hello Cool

你可以直观地选择" World"在这两行中。

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

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

两者都是垂直反射的。它的工作方式就像我'除了它用新文本替换块而不是插入它。

答案 7 :(得分:5)

假设您有此文件:

something

name
comment
phone
email

somethine else
and more ...

您想在“名称”,“评论”,“电话”和“电子邮件”前面添加“vendor_”,无论它们出现在文件中的哪个位置

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

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

答案 8 :(得分:5)

我想在只有vi(没有nano)的服务器上的某个配置文件中注释掉很多行,所以可视化方法也很麻烦 这就是我如何做到的。

  1. 打开文件vi file
  2. 显示行号:set number!:set number
  3. 然后使用行号用&#34;#&#34;替换行首,怎么做?
  4. :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

答案 9 :(得分:1)

这是一个老问题,但我想提供一种更灵活的替代方案:

示例:在行的开头输入文本XYZ

:%norm IXYZ

这里发生了什么?

  • % ==在每一行执行
  • norm ==在正常模式下执行以下键
  • I ==在行首
  • 处插入
  • XYZ ==您要输入的文字

然后你按Enter键,然后执行。

根据您的要求:

:%norm Ivendor_

您还可以选择特定范围:

:2,4norm Ivendor_

或在选定的视觉范围内执行:

:'<,'>norm Ivendor_

答案 10 :(得分:0)

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

答案 11 :(得分:0)

1. ctrl + v to go to visual block 
2. select the lines using up and down arrow 
3. enter small 3i ( presess SMALL I three times)
4. I (Press capital I, That will take you into insert mode)
4. Write the text you want to add
5. esc 
6. press down arrow