[英]Vim: insert the same characters across multiple lines
有时我想跨多行编辑某个可视文本块。
例如,我会采用如下所示的文本:
name
comment
phone
email
让它看起来像这样
vendor_name
vendor_comment
vendor_phone
vendor_email
目前我现在要做的是......
" vendor_"
。 注意我们不得不放回去的额外空间。如果单词前至少有一列空格,我不需要缩进。 如果我不需要用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 中完全相同的文本。
另一种方法是使用. ( dot
) 命令与I结合使用。
vendor_
)我发现这种技术对于少量添加通常比视觉块模式更快,并且具有额外的好处,如果您不需要在范围内的每一行上插入文本,您可以通过按额外的j ' 轻松跳过它们s。
请注意,对于大量连续添加,块方法或宏可能会更好。
按:
键入新文本。
我会使用一个宏来记录我的动作,然后重复它。
你现在有一个很好的宏。
键入3@q以执行宏 3 次以执行其余行。
:%s/^/vendor_/
或者我错过了什么?
我想在只有 vi(没有 nano)的服务器上的一些配置文件中注释掉很多行,所以可视化方法也很麻烦这就是我是如何做到的。
vi file
:set number!
或:set number
:35,77s/^/#/
注:数字包括在内,从35行到77行,包括在内都会被修改。
要取消注释/撤消,只需使用:35,77s/^#//
如果要在每行代码后添加一个文本词作为注释,也可以使用:
:35,77s/$/#test/
(对于像 Python 这样的语言)
:35,77s/;$/;\\/\\/test/
(适用于 Java 等语言)
学分/参考文献:
您可能还有一个用例,要删除文本块并替换它。
像这样
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
我来这里是为了在多行中粘贴一个已经复制的字符串。 当使用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.