如何在VIM中用缓冲区中的文本替换整行?
以下是我正在编写的文本: 第1行:网站=“a.com”如何在VIM中用缓冲区中的文本替换整行?,vim,Vim,以下是我正在编写的文本: 第1行:网站=“a.com” … 第3行:网站=“b.com” … 第5行:网站=“c.com” 假设我想将所有网站更改为“stackoverflow.com”,我可以这样做: -将“a.com”更改为“stackoverflow.com” -拉下整条线(Y) -转到第3行,点击p、k、dd从缓冲区粘贴并删除旧的“b.com”行 现在的问题是,由于dd将“b.com”放入缓冲区,要替换第5行,我必须再次拉动整行。 有什么简单的方法可以让我用已经拉紧的线快速替换3号线和5
…
第3行:网站=“b.com”
…
第5行:网站=“c.com” 假设我想将所有网站更改为“stackoverflow.com”,我可以这样做:
-将“a.com”更改为“stackoverflow.com”
-拉下整条线(Y)
-转到第3行,点击p、k、dd从缓冲区粘贴并删除旧的“b.com”行 现在的问题是,由于dd将“b.com”放入缓冲区,要替换第5行,我必须再次拉动整行。
有什么简单的方法可以让我用已经拉紧的线快速替换3号线和5号线吗 更新:
感谢您的回答,现在有几种方法:删除到黑洞,从命名缓冲区中拖动,等等。我发现这是我最喜欢的方法(有时我需要替换单个字符,所以使用R键代替R键): 我在下面列出了一些类似问题的链接:
您可以为此使用命名缓冲区,而不是默认的未命名缓冲区:
“lY
然后”lp
,以拖动响应。从寄存器粘贴l
,然后让dd
使用默认缓冲区。重读这个问题,我认为这更接近您的目标:
例如,与其使用
dd
不如使用“\u dd
我认为这不是对你提出的问题的回答,而是对你真正问题的回答
技巧1:您是否知道:s
?如果您只是想替换所有匹配项,可以执行以下操作:
:%s/^website = "\zs.*\ze\.com";$/stackoverflow/
由于您尚未指定所有内容的精确格式,以及您是否希望全部替换或仅替换部分内容,所以我无法确定这是否是您想要的
技巧1b:即使您只想替换一些,对于:s
:c
,“确认”也有一个有用且并不广为人知的标志(请参见:help:s_标志
,更具体地说是:help:s_c
),然后您可以用每个标志来决定是否替换它
:%s/^website = "\zs.*\ze\.com";$/stackoverflow/c
技巧2:您也可以搜索、替换然后重复。/^website=“\zs.*\ze\.com”$
,然后cwstackoverflow
Esc将单词替换为“stackoverflow”。然后n
转到下一个匹配,如果您想将其替换为“stackoverflow”,请先使用
第一件事
不需要显式删除行,您可以做得更好:
x
:“xY“
,但被拖动的行仍位于寄存器x
,因此您可以重复步骤2到4,而无需反复拖动
重复的事情重复
不幸的是,您不能使用。重复步骤3+4。因此,如果必须对很多行执行此操作,请插入更多步骤来录制宏:
x
:“xYw
寄存器中:qww
:@w中的宏- 将“a.com”更改为“stackoverflow.com”
- 猛拉整条线(Y)
- 转到第3行,点击“0p,k,dd”从缓冲区粘贴并删除旧的“b.com”行李>
- 转到第5行,点击“0p,k,dd”从缓冲区粘贴并删除旧的“c.com”行
- ci“-在
- ctrl-r 0-放入默认寄存器
- jj-向下移动两行
- -重复上一个命令
- jj
vi
中)单个字母;在使用缓冲区的命令前面加上“
和缓冲区名称,因此将Y
替换为“lY
,将p
替换为”lp
(或者使用任何其他字母;vim
可能也允许其他字符,甚至可能支持更长的名称,但我无能为力)@AZ.别担心,即使你已经“老到”了,你也可能不熟悉vim的一半。第二种方法非常聪明,与“Bram Moolennar”的“有效文本编辑的7个习惯”是一致的。我对否决票很好奇。我想是的