有时我想跨多行编辑某个可视文本块.
例如,我会采用如下所示的文本:
name
comment
phone
email
Run Code Online (Sandbox Code Playgroud)
让它像这样扯掉
vendor_name
vendor_comment
vendor_phone
vendor_email
Run Code Online (Sandbox Code Playgroud)
目前,我现在的方式是......
" vendor_"没有引用的a.注意我们不得不放回的额外空间.如果在单词之前至少有一列空格,我不需要缩进.如果我不必清除视觉块,我就不需要空格c.
但是如果我必须清除,那么有没有办法在不创建所需的缩进空格的情况下执行上面执行的操作?
此外为什么用退出了插入模式编辑一次只能工作多行esc了ctrlc?
编辑:
这是一个更复杂的例子
name = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone = models.CharField( max_length = 135, blank = True )
email = models.EmailField( blank = True )
Run Code Online (Sandbox Code Playgroud)
至
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 )
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我将执行垂直视觉块.,然后在插入模式期间重新插入它,即类型.whatever..希望现在你可以看到这种方法的缺点.我仅限于在垂直位置选择一列完全相同的文本.
ick*_*fay 850
nin name.I(大写i).vendor_.
I必须使用大写而不是小写,i因为小写i被解释为文本对象的开头,这本身就很有用,例如用于选择标记块(it)内部:

小智 66
另一种方法是结合使用.(dot)命令I.
vendor_)我发现这种技术通常比视觉块模式更快,适用于少量添加,并且还有一个额外的好处,即如果你不需要在一个范围内的每一行上插入文本,你可以通过按下extra来轻松跳过它们j. .
请注意,对于大量连续添加,块方法或宏可能会更好.
Lou*_*adi 36
按:
输入新文本.
Bri*_*eal 29
我会使用宏来记录我的动作,然后重复它.
qq开始录制到q缓冲区.i进入插入模式,然后键入vector_,然后点击ESC退出插入模式.0回到行的开头.j了下来.q再次点击停止录制.你现在有一个很好的宏.
键入3@q以执行宏3次以执行其余行.
sri*_*lla 26
:%s/^/vendor_/
Run Code Online (Sandbox Code Playgroud)
还是我错过了什么?
arc*_*don 12
2016年1月更新
虽然接受的答案是一个很好的解决方案,但实际上这个键击次数会少一些,并且可以更好地扩展 - 原则上基于已接受的答案.
nin name.I.vendor_.注意,这比所提供的接受答案的键击次数少(比较步骤3).我们只计算要执行的j个动作的数量.
如果您启用了行号(如上图所示),并且知道要移动到的行号,则可以将步骤3更改为#G,其中#是所需的行号.
在上面的例子中,这将是4G.但是,当处理几个行号时,显式计数效果很好.
您可能还有一个用例要删除文本块并替换它.
像这样
Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)
至
Hello Cool
Hello Cool
Run Code Online (Sandbox Code Playgroud)
您可以直观地在两行中选择"世界".
键入c进行更改 - 现在您将处于插入模式.
插入你想要的东西,然后点击逃脱.
两者都得到垂直反射.它的工作原理就像'我',除了它用新文本替换块而不是插入它.
假设你有这个文件:
something
name
comment
phone
email
somethine else
and more ...
Run Code Online (Sandbox Code Playgroud)
您想在"name","comment","phone"和"email"前面添加"vendor_",无论它们出现在文件中的哪个位置.
:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc
Run Code Online (Sandbox Code Playgroud)
该c旗帜将提示您确认.如果您不想要提示,可以删除它.
我想在只有vi(没有nano)的服务器上的一些配置文件中注释掉很多行,因此可视方法也很麻烦。这就是我的方法。
vi file:set number!或:set number:35,77s/^/#/
注意:这些数字包括在内,从35到77的行(都包括在内)将被修改。
要取消注释/撤消该注释,只需使用 :35,77s/^#//
如果要在每行代码之后添加文本词作为注释,则还可以使用:
:35,77s/$/#test/ (适用于Python之类的语言)
:35,77s/;$/;\/\/test/ (用于Java之类的语言)
学分/参考:
一个可以更灵活的替代方案:
示例:在行首输入文本 XYZ
:%norm IXYZ
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?
% == 在每一行上执行norm ==在普通模式下执行以下键I == 在行首插入XYZ == 您要输入的文字然后你点击Enter,它就会执行。
具体到您的要求:
:%norm Ivendor_
Run Code Online (Sandbox Code Playgroud)
您还可以选择特定范围:
:2,4norm Ivendor_
Run Code Online (Sandbox Code Playgroud)
或者在选定的视觉范围内执行:
:'<,'>norm Ivendor_
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)