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

例如,我将文本看起来像这样:

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.。希望现在您可以看到此方法的缺点。我仅限于选择垂直位置都相同的一列文字。

评论

更好的方法:“:%s / ^ / vendor_ /”

感谢您的回复。如果我只想在每行后面附加一个单词,那是可行的。但是我使用的方法可以在任何位置完成。让我再添加一个示例,其中包含一个更复杂的示例。

然后突出显示要使用shift-V更改的行,并键入适当的搜索和替换命令-在第二个示例中,:s / models \ ./ \ 0whatever./

实现上述目标的方法很多。为了完全回答问题的所有部分,然后是第1部分),无论是正则表达式还是可视模式,我编辑esc都可以很好地如答案中所提供的那样工作(我更喜欢GVIM中的可视选择)。对于第2部分,宏可能是Brian Neal提供的最简单的方法。我所知道的关于所有此类“如何做”的最佳资源是Drew Neil的《实用Vim》。每当您忘了一个公式时,它都是出色的快速阅读和轻量参考。希望此建议对某人有帮助,对于许多vim用户来说,值得付出努力。

@Paul:如果您要计算击键次数,可以用&替换\ 0。

#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
按向下箭头