例如,我将文本看起来像这样:
name
comment
phone
email
< br并使它看起来像这样
vendor_name
vendor_comment
vendor_phone
vendor_email
目前我现在要做的是...
依次按V键和j键四次选择一个块的所有4行。
用>。
缩进。
用h返回一个字母。
用Ctrlv进入块可视模式。
四次按j向下选择四行。此时,您已经选择了一个4x1的可视空格块(四行一列)。
按C。注意,该行几乎向左缩进一列。
键入一个
" vendor_"
,不带引号。请注意我们必须退回的多余空间。按Esc键。这是我使用Esc退出插入模式的极少数情况之一。 Ctrlc只会编辑第一行。
重复步骤1。
用<。
缩进另一种方式。我不需要缩进是否至少有一行单词前的空白。如果我不必用c清除可视块,则不需要空格。
但是如果我必须清除,那么有一种方法可以执行我在上面所做的操作而无需创建
为什么还要一次编辑多行只能通过在Ctrlc上用Esc退出插入模式才能起作用?复杂的示例:
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.
。希望现在您可以看到此方法的缺点。我仅限于选择垂直位置都相同的一列文字。#1 楼
将光标移至
n
中的name
。进入可视块模式(Ctrlv)。
按j三次(或3j)。
按
I
(大写i)。 br />输入vendor_
。注意:只会更新第一行中的屏幕-直到按Esc键(6.),此时所有行都将被更新。按Esc。
必须使用大写
I
而不是小写i
,因为小写i
被解释为文本对象的开始,例如,文本对象本身非常有用用于在标签块内选择(it
):评论
我无法在Windows中使用它(因为CTRL + V已映射为剪贴板粘贴)。但是对于Windows版本,Vim还将此映射到Ctrl + Q。
– Arnestig
2014年7月3日在11:11
@Ven:Vim在这段时间内实际上并不忙-它只是在等待您按另一个键,最终超时。为您进行两个实验:首先,尝试按Escape键,然后立即按另一个键,例如j或^ L。您应该会看到Vim毕竟不忙。它只是在等待。其次,尝试将“超时”更改为较低的值,例如80(而不是默认值1000),并观察到它超时更快。
–icktoofay
2014年8月8日,3:24
@icktoofay看来您要设置的变量是timeoutlen而不是timeoutlen。
– Jez
2014年8月29日在17:39
@ANjaNA:如果要插入的位置全部在同一列中(例如,如果数字都具有相同的长度),则可以使用相同的技术,但按A而不是I,这将在所选块之后而不是之前插入。但是,如果您的线长不同,那将行不通;我喜欢用替换匹配每一行的结尾,例如选择一些行并使用:s / $ / inserted /。
–icktoofay
2015年9月21日在23:03
我按下esc后必须按下箭头才能使它工作
– GeoSword
17年5月5日在12:24
#2 楼
另一种方法是使用。 (dot
)命令与I组合。将光标移动到要开始的位置
按I
键入所需的前缀(例如
vendor_
)按esc。
按j向下一行
键入。重复上一次编辑,自动再次插入前缀
在j和。之间快速替换。
我发现,对于少量添加,此技术通常比可视块模式更快并具有额外的好处,如果您不需要在范围内的每一行上插入文本,则可以通过按额外的j轻松地跳过它们。
请注意,对于大量连续的添加,块方法或宏可能会更好。
评论
很高兴看到另一种方法。
–伊本·赛义德(Ibn Saeed)
2014年3月4日在16:52
我只喜欢这几行。执行IMO容易得多。
–丹·贝查德(Dan Bechard)
2014年3月21日在18:19
输入所需的前缀后,是否不需要按Escape键?
–iamnotsam
2014年8月4日14:00
#3 楼
使用CtrlV选择要修改的行。
按:
I:在选择的内容之前插入。
A:在选择的内容之后附加。
c:替换选择的内容。
键入新文本。
按Esc键将更改应用于所有选定的行。
评论
优秀的!我只是强调针对像我这样的VIM初学者的最后一步Esc-我花了一段时间才弄清楚更改是“后来”传播的!
–Bugs Bunny
16年5月10日在12:46
很好,也不知道“ A”和“ C”选项。
–hobbes3
18年5月24日,1:11
为什么这不适用于v?我可以使用Ctrl + V-> A来做到这一点,但是用v来选择文本是行不通的-A只能追加到该行。他们不是都选择吗?同样,很奇怪-如果我将可视块扩展到行的末尾,则A仅附加到行的末尾;否则,它会附加在每行可视块结束的位置。就像无法识别a和A之间的区别一样。
– Alex G
18-11-18在22:42
我需要使用c而不是C,但是它工作得很好。谢谢
–塔罗尔
20年5月7日,11:40
#4 楼
我将使用宏来记录我的动作,然后重复执行。将光标放在名称的第一个字母上。
点击qq开始记录到q缓冲区中。
让i进入插入模式,键入vector_,然后按Esc退出插入模式。
现在按0返回到行首。
现在按j到继续。
现在再次按q停止录制。
您现在有了一个不错的宏。
键入3 @ q可以执行三次宏其余的行。
评论
“ q”是否特殊(对于“快速宏”而言?)?
– Peter Mortensen
20年1月1日,18:37
如何使宏保持不变(跨多个会话工作)?
– Peter Mortensen
20年1月1日,18:40
@PeterMortensen Vim具有称为会话的功能,该功能将持久化您可以查看的缓冲区(以及许多其他内容)。
–布赖恩·尼尔(Brian Neal)
20年1月2日,17:41
#5 楼
:%s/^/vendor_/
还是我缺少什么?
评论
您缺少这样一个事实,它很可能是文件中包含许多其他行的子文本,在这些行上不需要添加vender_前缀。
–丹·贝查德(Dan Bechard)
2014年3月21日在18:21
@dan如果仅需要一个文本,则可以将搜索限制为一组行号,例如1,4s / ^ / vendor_ /
–布拉德·科赫(Brad Koch)
15年5月20日在19:34
@BradKoch有趣。我不知道行号的限制,为此。
–丹·贝查德(Dan Bechard)
2015年5月21日在14:18
这很有趣,但是更实际的是使用V并键入:来可视地阻止选择。它将在ed表达式前加上:'<,'>前缀,这使ed仅适用于带有:'<,'> s / ^ / vendor_ /的选择
–Dolanor
16年8月9日在17:28
#6 楼
更新于2016年1月,虽然可接受的答案是一个不错的解决方案,但实际上击键次数略少,并且伸缩性更好-原则上基于可接受的答案。
将光标移至
n
中的name
。进入可视块模式(ctrlv)。
按3j
按
I
。键入
vendor_
。按esc。
请注意,此键击次数少于提供的可接受答案(比较步骤3)。我们只计算要执行的j个动作的数量。
如果启用了行号(如上所示),并且知道要移至的行号,则可以将步骤3更改为# G,其中#是所需的行号。
在上面的示例中,这是4G。但是,当只处理几个行号时,显式计数会很好。
#7 楼
我想在只有vi(没有nano)的服务器上的一些配置文件中注释掉很多行,因此可视方法也很麻烦这就是我的方法。
打开文件
vi file
显示行号
:set number!
或:set number
然后用行号将行首替换为“#”,怎么办? />
:35,77s/^/#/
注意:数字包括端值,从35到77的行(包括两者在内)将被修改。
要取消注释/撤消该操作,只需使用
:35,77s/^#//
如果要在每行代码后添加文本单词作为注释,则还可以使用:
:35,77s/$/#test/
(适用于Python之类的语言):35,77s/;$/;\/\/test/
(适用于Java之类的语言)信用/参考:
https://unix.stackexchange.com/questions/84929/uncommenting -multi-line-of-line-of-of-codes-by-line-numbers-by-line-numbers-using-vi-or-vim
https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-行一次
评论
这对我来说是完美的解决方案,因为我经常只使用vim-tiny。
– JSON C11
19年3月12日在21:37
#8 楼
您可能还会有一个用例,要删除一段文本并替换它。 />Hello World
Hello World
您只需要在两行中可视块选择“世界”即可。
键入c进行更改-现在您将处于插入模式。 br />
插入所需的内容并按Escape键。
两者都会垂直反射。它与“ I”的工作方式相同,只是它用新文本替换了块而不是插入了新文本。
#9 楼
假设您具有以下文件:something
name
comment
phone
email
something else
and more ...
要在“名称”,“评论”,“电话”和“电子邮件”前面添加“ vendor_”,不管它们出现在文件中的什么位置。
:%s/\<\(name\|comment\|phone\|email\)\>/vendor_/gc
c
标志将提示您进行确认。如果您不希望出现提示,可以将其删除。#10 楼
另一种可能更灵活的替代方法:示例:在行的开头输入文本XYZ
:%norm IXYZ
这是怎么回事?
%
==每行执行一次norm
==在正常模式下执行以下键I
==在行首插入XYZ
==要输入的文本然后按Enter键,它就会执行。
特定根据您的要求:
:%norm Ivendor_
您还可以选择特定范围:
:2,4norm Ivendor_
或在选定的视觉范围:
:'<,'>norm Ivendor_
评论
是否可以在插入模式(规范Iabc
–batbrat
19年4月30日在15:56
@batbrat我刚刚想通了!您可以按ctrl-v ctrl- [插入一个“转义的Esc”,出于正常命令的目的,这会将您拉回到“正常模式”。我刚刚使用'<,'> norm Iaa ^ [ysiw“进行了测试,其中^ [是转义的Esc。
–奥布里·拉维尼(Aubrey Lavigne)
19年5月10日在20:23
#11 楼
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
评论
这种方法是否适用于所有版本的vim或需要任何vim插件?我问的原因是b / c有时可以在某些机器上使用,但有时不能。我不知道区别。 Windows上git附带的vim-我无法正常运行。在某些ubuntu和centos linux计算机上,我无法正常运行。我在少数情况下取得了成功,但我无法复制成功。这是一个谜。我按下ESC后似乎什么也没发生。
–davidj411
17年11月22日15:26
奇怪的是,它现在对我有用。什么都没有改变,也许只是星星:)在寻找解决方案时,我确实在此页面上找到了一些东西,尽管其中提到了要在vim中寻找的东西vim.wikia.com/wiki/Inserting_text_in_multiple_lines在Vim中,请检查是否已通过输入:version命令,逐块运算符功能(I,A等)。输出应包括+ visualextra。
–davidj411
17年12月7日在15:35
我的意思是一般添加评论,而不是您的答案。这些答案大多数都说相同的话,只是用不同的词。我的提供的东西有所不同,并包含一个链接。
–davidj411
17年12月10日,0:50
#12 楼
Ctrl + v进入可视块模式
使用向上和向下箭头选择行
输入小写字母3i(按小写字母I三次)
I(按大写字母I。这将带您进入插入模式。)
编写要添加的文本
Esc
按向下箭头
评论
更好的方法:“:%s / ^ / vendor_ /”感谢您的回复。如果我只想在每行后面附加一个单词,那是可行的。但是我使用的方法可以在任何位置完成。让我再添加一个示例,其中包含一个更复杂的示例。
然后突出显示要使用shift-V更改的行,并键入适当的搜索和替换命令-在第二个示例中,:s / models \ ./ \ 0whatever./
实现上述目标的方法很多。为了完全回答问题的所有部分,然后是第1部分),无论是正则表达式还是可视模式,我编辑esc都可以很好地如答案中所提供的那样工作(我更喜欢GVIM中的可视选择)。对于第2部分,宏可能是Brian Neal提供的最简单的方法。我所知道的关于所有此类“如何做”的最佳资源是Drew Neil的《实用Vim》。每当您忘了一个公式时,它都是出色的快速阅读和轻量参考。希望此建议对某人有帮助,对于许多vim用户来说,值得付出努力。
@Paul:如果您要计算击键次数,可以用&替换\ 0。