如何在VIM中用缓冲区中的文本替换整行?

如何在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

以下是我正在编写的文本:

第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号线吗

更新:
感谢您的回答,现在有几种方法:删除到黑洞,从命名缓冲区中拖动,等等。我发现这是我最喜欢的方法(有时我需要替换单个字符,所以使用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
  • 转到下一行进行更换
  • 目视选择整条线:V
  • 粘贴在寄存器x的选择上:“xp
  • 现在,删除的行与往常一样位于寄存器
    ,但被拖动的行仍位于寄存器
    x
    ,因此您可以重复步骤2到4,而无需反复拖动

    重复的事情重复 不幸的是,您不能使用。重复步骤3+4。因此,如果必须对很多行执行此操作,请插入更多步骤来录制宏:

  • 将整行拖动到寄存器
    x
    :“xY
  • 转到下一行进行更换
  • 将宏记录到
    w
    寄存器中:qw
  • 目视选择整条线:V
  • 粘贴在寄存器x的选择上:“xp
  • 停止录音:q
  • 转到下一行进行更换
  • 重放录制到
    w
    :@w中的宏
  • 转到下一行进行更换
  • 现在,您终于可以重播与上次相同的内容:@@
  • 然后,您只需对接下来需要更换的50行重复步骤9和10即可

    最后的(重复的)事情最后的 事实上,如果您通过搜索找到下一行,那么您也应该使用该搜索转到第一行。因为这样,用于转到下一行的n就可以作为宏的一部分包含进来——基本上,您只需交换步骤6和步骤7

    然后,您根本不必手动转到下一行进行替换,因为宏会像它最后一次执行的操作一样将您发送到下一行。只要你想跳过一场特定的比赛,你就可以不停地打@,偶尔也可以打N

    工具书类
    0注册表始终包含您最后一次拖动的文本。然后您可以执行以下操作:

    • 将“a.com”更改为“stackoverflow.com”
    • 猛拉整条线(Y)
    • 转到第3行,点击“0p,k,dd”从缓冲区粘贴并删除旧的“b.com”行
    • 转到第5行,点击“0p,k,dd”从缓冲区粘贴并删除旧的“c.com”行
        • ci“-在
        • ctrl-r 0-放入默认寄存器
        • jj-向下移动两行
        • -重复上一个命令
        • jj

        替换将适用于示例文本,但实际上,要找到待替换文本的通用模式并不容易。我认为在这种情况下,基于行的方法比基于内容的方法快。我想我更好地理解了您的要求。现在我编辑了我的响应以反映它。嗯,我对VIM是新手,所以我不熟悉命名缓冲区。我刚刚给了您配方。缓冲区名称是(在可移植的
        vi
        中)单个字母;在使用缓冲区的命令前面加上
        和缓冲区名称,因此将
        Y
        替换为
        “lY
        ,将
        p
        替换为
        ”lp
        (或者使用任何其他字母;
        vim
        可能也允许其他字符,甚至可能支持更长的名称,但我无能为力)@AZ.别担心,即使你已经“老到”了,你也可能不熟悉vim的一半。第二种方法非常聪明,与“Bram Moolennar”的“有效文本编辑的7个习惯”是一致的。我对否决票很好奇。我想是的