如何用vim粘贴(覆盖)?


31

vim使用yyp一直拉和粘贴行。但是,如果我想在文件的多个位置替换一行,则无法使用,yy p dd p因为dd 删除会将行删除到剪贴板/寄存器中。虽然我可能应该知道如何更好地使用寄存器,但我觉得可能有一种方法可以p替代当前行。

Answers:


27

默认情况下,粘贴命令使用"(“未命名”)寄存器。实际上,任何写入寄存器的命令也会写入未命名的寄存器,因此,拉动,删除和更改都会对其产生影响。这就是为什么您的yank-delete-paste序列粘贴已删除的文本而不是被粘贴的文本的原因。

0寄存器可以帮助在这里。任何未指定寄存器的yank命令0(除了之外")都会将选中的文本放入寄存器中。它不受删除或更改操作的影响,因此即使您执行中间的删除或更改,也可以使用它多次粘贴带阴影的行。

  1. yy:寄存器,0并且"现在都带有被拉线。
  2. 移至一行进行替换。
  3. dd"现在,注册具有已删除的行,但注册0仍然具有被删除的行。
    "0P:从寄存器粘贴最初拉出的行0
  4. 移至下一行进行替换。
  5. dd"0P (同上)

(由于在替换缓冲区的最后一行时,光标定位的工作方式,您将希望使用"0p而不是"0P。)

这与Bruce Ediger的答案非常接近,除了在初次拉动时不必指定寄存器。使用一个或多个命名寄存器非常方便,但是,如果您需要(例如)用替换某些行AAA,而用BBB(放入AAA寄存器aBBB寄存器中b(或将其中之一保留在寄存器中0)替换其他行),然后相应地粘贴它们)。

您还可以0在逐行可视模式(V)中进行粘贴以保存击键:V"0p

如果您不喜欢输入"0,则可能会找到一个更方便的映射:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

另一种方法是删除_(“ blackhole”)寄存器。当您删除它时,该"寄存器不会受到影响,因此您的yank-delete-paste序列仍可以从未命名的寄存器中粘贴被选中的文本。

  1. yy:注册0"现在都带有拉线。
  2. "_dd:不更改寄存器。
    P:从寄存器粘贴最初拉的文本"

同样,您可能会发现映射更方便:

noremap <Leader>d "_d

2
或者,tl; dr,只需使用yy(移至要替换的行)S<C-r>0<Esc>。具有.命令可重复的优点。
通配符

11

看起来Kevin的回答很不错,但是如果您想盯着要删除的每一行,然后再替换,则存在一个略有不同的解决方案。

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

这种方法可以使您使用模式匹配来查找要删除和替换的行,并且可以返回到文件的开头(1G),并可以根据需要多次向前搜索。如果我有2条或更多条线可以重复收集和放置,则我"ayy将第一行,"byy第二行,"cyy第三行等等使用。我养成了习惯(这降低了食谱的普遍性),以减轻我的精神负担。


非常好。所以,如果我使用"ayydddd不会取代是什么a,但如果我键入p它会粘贴使用的是什么刚删除dd。如果我想"ayy用要删除的内容替换其中的内容,那么我会使用"add-是吗?
cwd

“ ayy将一行复制到寄存器'a'中。” dd“将一行剪切到一个默认寄存器中,而不是'a'。'p'将正确的粘贴到默认寄存器中。是的,” add将一行剪切到一个寄存器'a'中,这会从“AYY命令替换内容。
布鲁斯Ediger

5

有两种方法可以执行此操作:s,具体取决于您要进行多少次键入。最简单的方法是简单的搜索和替换:

:%s/find this line/replace with this/

%将搜索整个文件全部替换。

如果您输入的内容过多,则可以提取目标字符串(yy)并使用"(默认)寄存器,并在其中插入Ctrl+r "

:%s/<ctrl+r><">/replacement/

或者,如果您有替换字符串的副本,则可以分别使用"ayy"byy将这两个分别拖入a和并b分别拖入和寄存器(可以将任何字母用作寄存器)。然后使用Ctrl+r aCtrl+r b将它们粘贴到搜索和替换字段中。

不是单打布鲁斯,而是如果您要在替换行之前检查行,只需添加以下c选项:

:%s/find this line/replace with this/c

2

您可以V用来突出显示要在可视模式下替换的行,然后单击pp以粘贴到该行上。

这仅增加了一个击键,因此似乎是一个很好的解决方案。


这不起作用:粘贴之后,剪贴板包含由V
daniel kullmann

只是一个p
亚伦·托马

2

c对于这种事情,我经常使用“ change”命令,并与常规搜索结合使用。您可以在文件中搜索感兴趣的每一行/每一段文本,然后使用连续的n.命令(n对于下一个然后.重复上一次更改)。

/^hello-查找以“ hello”开头的行;
c$goodbye-改行再见;
n.-重复查找,重复更改

如果要将行更改为文件中已有的行,则可以将其复制到输入缓冲区(假设您的GUI允许),然后粘贴以获取第一个change命令的内容。

与所有vi一样,根据您要进行的编辑类型,最好有很多选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.