繁体   English   中英

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

[英]Vim: insert the same characters across multiple lines

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

例如,我会采用如下所示的文本:

name
comment
phone
email

让它看起来像这样

vendor_name
vendor_comment
vendor_phone
vendor_email

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

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

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

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

另外,为什么一次编辑多行只能通过使用Esc over 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. . 希望现在您可以看到这种方法的缺点。 我仅限于选择一列在垂直 position 中完全相同的文本。

  1. 将光标移动到namen
  2. 进入可视块模式 ( Ctrl v )。
  3. j三次(或3j )。
  4. I (大写 i)。
  5. 输入vendor_ 注意:它只会更新第一行的屏幕 - 直到按下Esc (6.),此时所有行都将被更新。
  6. Esc

演示该方法的迷你截屏视频

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

显示“it”文本对象有用性的迷你截屏视频

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

  1. 将光标移动到要开始的位置
  2. 输入您想要的前缀(例如vendor_
  3. esc
  4. j向下一行
  5. 键入 重复上次编辑,再次自动插入前缀
  6. j和 之间快速交替

我发现这种技术对于少量添加通常比视觉块模式更快,并且具有额外的好处,如果您不需要在范围内的每一行上插入文本,您可以通过按额外的j ' 轻松跳过它们s。

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

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

    • I : 在选择的内容之前插入。
    • A : 在选择的内容之后追加。
    • c : 替换选择的内容。
  3. 键入新文本。

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

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

  1. 将光标放在name 中的第一个字母上。
  2. 点击qq开始录制到 q 缓冲区。
  3. 点击i进入插入模式,输入vector_ ,然后点击Esc离开插入模式。
  4. 现在点击0回到行的开头。
  5. 现在点击j下降。
  6. 现在再次点击q停止录音。

你现在有一个很好的宏。

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

:%s/^/vendor_/

或者我错过了什么?

2016 年 1 月更新

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

  1. 将光标移动到namen
  2. 进入可视块模式 ( ctrl v )。
  3. 3j
  4. I
  5. 输入vendor_
  6. esc

视觉插图

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

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

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

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

  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

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

像这样

Hello World

Hello World

Hello Cool

Hello Cool

您可以在两行中视觉块选择“世界”。

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

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

两者都会垂直反射。 它的工作方式与 'I' 类似,不同之处在于它用新文本替换块而不是插入它。

一个可以更灵活的替代方案:

示例:在行首输入文本 XYZ

:%norm IXYZ

这里发生了什么事?

  • % == 在每一行执行
  • norm == 在普通模式下执行以下键
  • I == 在行首插入
  • XYZ == 你要输入的文字

然后你点击Enter ,它就会执行。

具体到您的要求:

:%norm Ivendor_

您还可以选择特定范围:

:2,4norm Ivendor_

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

:'<,'>norm Ivendor_

或者对匹配“目标”正则表达式的每一行执行:

:%g/target/norm Ivendor_

假设你有这个文件:

something

name
comment
phone
email

something else
and more ...

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

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

c标志将提示您进行确认。 如果您不想要提示,您可以删除它。

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
  1. Ctrl + v 进入可视块模式
  2. 使用向上和向下箭头选择线条
  3. 输入小写3i (按小写I三下)
  4. I (按大写I 。这将带您进入插入模式。)
  5. 写下你想添加的文字
  6. Esc键
  7. 按向下箭头

我来这里是为了在多行中粘贴一个已经复制的字符串。 当使用y复制时,我们可以粘贴,在插入模式中,按CTRL + r并在按"之后" 。这将与在正常模式下按p具有相同的结果。这称为从注册表粘贴。

假设缓冲区中有以下文本:

vendor_something

text
to_receive
the_paste
pattern

然后我们可以将光标指向 vendor_ 中的v并按v ,使用l向右移动,直到选择我们要粘贴到下面文本中的下划线符号。 之后,我们可以将光标指向“文本”的开头(vendor_something 下方的两行),然后按CTRL + v 然后I进入插入模式,我们按3j CTRL + r " ESC 。这个序列的结果将是:

vendor_something

vendor_text
vendor_to_receive
vendor_the_paste
vendor_pattern

:.,+3s/^/vendor_/

另一个例子,我只需要在一个 125 行的块中添加两个空格,所以我使用了(cursor 位于该块第一行的开头):

:.,+125s/^//

效果很好。

如果需要在整个文件中进行更改,

:1,$s/^/vendor_/

如果只需要更改几行,

Go 到需要更改的第一行,然后给出命令

:.,ns/^/vendor_/

将 n 替换为块中最后一行的行号。

要么,

:.,+ns/^/vendor_/

将 n 替换为需要更改的行数减 1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM