Answers:
默认情况下,粘贴命令使用"
(“未命名”)寄存器。实际上,任何写入寄存器的命令也会写入未命名的寄存器,因此,拉动,删除和更改都会对其产生影响。这就是为什么您的yank-delete-paste序列粘贴已删除的文本而不是被粘贴的文本的原因。
该0
寄存器可以帮助在这里。任何未指定寄存器的yank命令0
(除了之外"
)都会将选中的文本放入寄存器中。它不受删除或更改操作的影响,因此即使您执行中间的删除或更改,也可以使用它多次粘贴带阴影的行。
yy
:寄存器,0
并且"
现在都带有被拉线。dd
:"
现在,注册具有已删除的行,但注册0
仍然具有被删除的行。"0P
:从寄存器粘贴最初拉出的行0
。dd"0P
(同上)(由于在替换缓冲区的最后一行时,光标定位的工作方式,您将希望使用"0p
而不是"0P
。)
这与Bruce Ediger的答案非常接近,除了在初次拉动时不必指定寄存器。使用一个或多个命名寄存器非常方便,但是,如果您需要(例如)用替换某些行AAA
,而用BBB
(放入AAA
寄存器a
和BBB
寄存器中b
(或将其中之一保留在寄存器中0
)替换其他行),然后相应地粘贴它们)。
您还可以0
在逐行可视模式(V
)中进行粘贴以保存击键:V"0p
。
如果您不喜欢输入"0
,则可能会找到一个更方便的映射:
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
另一种方法是删除_
(“ blackhole”)寄存器。当您删除它时,该"
寄存器不会受到影响,因此您的yank-delete-paste序列仍可以从未命名的寄存器中粘贴被选中的文本。
yy
:注册0
,"
现在都带有拉线。"_dd
:不更改寄存器。P
:从寄存器粘贴最初拉的文本"
。同样,您可能会发现映射更方便:
noremap <Leader>d "_d
看起来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
第三行等等使用。我养成了习惯(这降低了食谱的普遍性),以减轻我的精神负担。
"ayy
后dd
,dd
不会取代是什么a
,但如果我键入p
它会粘贴使用的是什么刚删除dd
。如果我想"ayy
用要删除的内容替换其中的内容,那么我会使用"add
-是吗?
有两种方法可以执行此操作:s
,具体取决于您要进行多少次键入。最简单的方法是简单的搜索和替换:
:%s/find this line/replace with this/
在%
将搜索整个文件全部替换。
如果您输入的内容过多,则可以提取目标字符串(yy
)并使用"
(默认)寄存器,并在其中插入Ctrl+r ":
:%s/<ctrl+r><">/replacement/
或者,如果您有替换字符串的副本,则可以分别使用"ayy
和"byy
将这两个分别拖入a
和并b
分别拖入和寄存器(可以将任何字母用作寄存器)。然后使用Ctrl+r a和Ctrl+r b将它们粘贴到搜索和替换字段中。
不是单打布鲁斯,而是如果您要在替换行之前检查行,只需添加以下c
选项:
:%s/find this line/replace with this/c
您可以V
用来突出显示要在可视模式下替换的行,然后单击pp
以粘贴到该行上。
这仅增加了一个击键,因此似乎是一个很好的解决方案。
V
p
。
yy
(移至要替换的行)S<C-r>0<Esc>
。具有.
命令可重复的优点。