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

时间:2011-07-09 00:57:07

标签: vim

以下是我正在处理的文字:

  

第1行:网站=“a.com”;
  ...
  line3:website =“b.com”;
  ...
  line5:website =“c.com”;

假设我想将所有网站更改为“stackoverflow.com”,我可以这样做:
- 将“a.com”更改为“stackoverflow.com”
- 猛拉整条线(Y)
- 转到第3行,点击p,k,dd从缓冲区粘贴并删除旧的“b.com”行。

现在的问题是,由于dd将“b.com”放入缓冲区,为了替换line5,我将不得不再次拉动整条线。
有没有简单的方法,以便我可以快速替换line3和line5与已经被拉动的线?

更新
谢谢你的答案,现在有几种方法可以做到这一点:删除黑洞,从命名缓冲区中抽出等等。我发现这是我最喜欢的方法(我使用键R代替r,因为有时我需要替换单个字符):

In Vim is there a way to delete without putting text in the register?

我在下面提到了类似SO问题的链接:

How to Delete (desired text), delete (undesired text), and paste (desired text) in Vim
In Vim is there a way to delete without putting text in the register?

6 个答案:

答案 0 :(得分:4)

首先是

您可以通过不需要明确删除该行来改善:

  1. 将整行录入注册x“xY
  2. 转到下一行替换
  3. 直观地选择整行: V
  4. 粘贴来自寄存器x的选择:“xp
  5. 现在删除的行一如既往地在寄存器"中,但是拉出的行仍然在寄存器x中,因此您可以重复步骤2到4,而不必一遍又一遍。< / p>

    重复重复的事情

    很遗憾,您无法使用重复步骤3 + 4。因此,如果您必须为很多行执行此操作,请插入一些步骤来记录宏:

    1. 将整行录入注册x“xY
    2. 转到下一行替换
    3. 将宏记录到w寄存器中: qw
    4. 直观地选择整行: V
    5. 粘贴来自寄存器x的选择:“xp
    6. 停止录制: q
    7. 转到下一行替换
    8. 重播录制到w的宏: @w
    9. 转到下一行替换
    10. 现在最后,你可以重播同上一次: @@
    11. 然后,您只需重复步骤9和10,即可替换您需要替换的50行。

      最后(重复)的事情持续

      事实上,如果您通过搜索找到下一行,那么您应该使用该搜索转到第一个行。因为你用来转到下一行的 n 可以作为宏的一部分包含在内 - 基本上你只需要交换步骤6和7。

      然后您不必手动转到下一行进行替换,因为宏会将它作为最后一件事发送给您。你可以随时点击 @@ 以及任何偶然的 n ,只要你想跳过特定的比赛。

      参考

答案 1 :(得分:3)

您可以为此使用命名缓冲区而不是默认的未命名缓冲区:"lY然后"lp来缓存。从寄存器l粘贴,然后让dd使用默认缓冲区。

答案 2 :(得分:3)

这不是你问题的答案,但我认为这是对你真实问题的回答。

技巧1:您是否知道:s?如果您只想替换所有匹配项,您可以执行以下操作:

:%s/^website = "\zs.*\ze\.com";$/stackoverflow/

由于您尚未指定所有格式的精确格式以及您是否想要替换全部或仅一些,我不能说这是否是您想要的。

技巧1b:即使你只想要替换一些,:sc:{确认'也是一个有用而且非常广为人知的标志。 (请参阅:help :s_flags,更具体地说:help :s_c。)然后,您可以决定是否要替换它。

:%s/^website = "\zs.*\ze\.com";$/stackoverflow/c

技巧2:您还可以搜索,替换然后重复。 /^website = "\zs.*\ze\.com";$,然后cwstackoverflow Esc 将该字替换为“stackoverflow”。然后n转到下一个匹配项,如果要将其替换为“stackoverflow”,请使用.

答案 3 :(得分:2)

重读这个问题我认为这更接近你所追求的目标:

In Vim is there a way to delete without putting text in the register?

E.g。而不是使用dd使用"_dd

答案 4 :(得分:0)

"0寄存器始终包含您上次被取消的文本。然后你可以这样做:

  • 将“a.com”更改为“stackoverflow.com”
  • 猛拉整行(Y)
  • 转到第3行,点击“0p,k,dd从缓冲区粘贴并删除旧的”b.com“行。
  • 转到第5行,点击“0p,k,dd从缓冲区粘贴并删除旧的”c.com“行。

答案 5 :(得分:0)

  • ci&#34; - 更改&#34;&#34;
  • ctrl-r 0 - 输入默认寄存器
  • jj - 向下移动两行
  • - 重复上一个命令
  • jj
  • 即可。