在Vim中,如何有效地在多行中插入相同的字符?
有时我想跨多行编辑某个可视的文本块。
例如,我将采取如下所示的文本:
name comment phone email
让它像这样stream淌
vendor_name vendor_comment vendor_phone vendor_email
目前我现在要做的方式是…
- 按V ,然后按jselect全部4行块。
- 缩进> 。
- 回去一个字母h 。
- 使用ctrl v转到阻止可视模式。
- 按j键 4下select4行。 在这一点上,你已经select了一个4×1的可视空白块(4行,1列)。
- 按c 。 注意,这几乎是向左缩进一列。
- input一个
" vendor_"
不带引号。 注意我们必须放回的额外空间。 - 按esc 。 这是我使用esc退出插入模式的less数几次之一。 ctrl c只会编辑第一行。
- 重复步骤1。
- 用<<另一种方式缩进。
如果在单词前至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垂直位置上相同的文本列。
- 将光标移到
name
。 - 进入视觉模块模式( ctrl v )。
- 按j三次。
- 按
I
(首都)。 - input
vendor_
。 - 按esc 。
I
必须使用大写字母I
而不是小写字母i
因为小写字母i
被解释为文本对象的开始,这对于自己而言是相当有用的,例如,用于select标签块( it
)内部:
另一种方法是使用。 ( dot
)命令与I结合使用。
- 将光标移动到要开始的位置
- 按I键
- input你想要的前缀(例如
vendor_
) - 按esc 。
- 按j键下线
- types。 重复上次编辑,再次自动插入前缀
- j和j之间快速交替。
我发现这种技术通常比用于less量添加的可视块模式更快,并且还有另外的好处,如果你不需要在一个范围内的每一行插入文本,你可以通过按下额外的j '秒。
请注意,对于大量的连续添加,块方法或macros可能会优于。
我会用macros来logging我的行为,然后重复它。
- 把你的光标放在名字的第一个字母上。
- 点击
qq
开始logging到q
缓冲区。 - 打
i
进入插入模式,并inputvector_
,然后按ESC
退出插入模式。 - 现在点击
0
返回到行首。 - 现在打到
j
去。 - 现在再次点击
q
停止录制。
你现在有一个很好的macros。
键入3@q
来执行你的macros3次来完成其余的行。
:%s/^/vendor_/
还是我错过了什么?
- 使用
Ctrl-v
select要修改的行。 -
按:
-
I
:在select之前插入。 -
A
:追加什么select。 -
c
:replace选中的内容。
-
-
input新的文字。
- 按
Esc
将更改应用于所有选定的行。
2016年1月更新
虽然接受的答案是一个很好的解决scheme,但这实际上是轻微的击键less一些,并且更好地扩展 – 原则上基于被接受的答案。
- 将光标移到
name
。 - 进入视觉模块模式( ctrl v )。
- 按3j
- 按
I
。 - input
vendor_
。 - 按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文件中注释了很多行 ,所以可视化方法也很麻烦以下是我如何做到这一点。
- 打开文件
vi file
- 显示行号
:set number!
或者:set number
- 然后用行号代替“#”开头的行,怎么样?
:35,77s/^/#/
注意:数字是包含性的,从35到77的行,都将被修改。
要取消注释/撤销该操作,只需使用:35,77s/^#//
如果您想在每行代码之后添加文字作为注释,您还可以使用:
:35,77s/$/#test/
(像Python这样的语言)
:35,77s/;$/;\/\/test/
(对于像Java这样的语言)
币/参考:
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