我一直vim
使用yy
和来拉动和粘贴线条。p
但是,如果我想在文件中的多个位置替换一行,我无法使用,yy
p
dd
p
因为dd
删除了剪贴板/寄存器的行。虽然我可能应该知道如何更好地使用寄存器,但我觉得可能有一种方法可以p
替换当前行。
答案1
默认情况下,粘贴命令使用"
(“未命名”)注册。实际上,任何写入寄存器的命令也会写入未命名的寄存器,因此猛拉、删除和更改都会影响它。这就是为什么您的复制-删除-粘贴序列会粘贴已删除的文本而不是复制的文本。
这0
登记可以在这里提供帮助。任何未指定寄存器的复制命令都会将复制的文本放入寄存器中0
(除了"
)。它不受删除或更改操作的影响,因此即使您进行中间删除或更改,也可以使用它多次粘贴拉出的行。
yy
:寄存器0
和"
两者现在都有拉线。- 移动到要替换的行。
dd
: 寄存器"
现在有删除的行,但寄存器0
仍然有拉出的行。
"0P
:粘贴最初从寄存器中拉出的行0
。- 移至下一行进行替换。
dd"0P
(同上)
(由于替换缓冲区最后一行时光标定位的工作方式,您将需要使用"0p
而不是"0P
。)
这非常接近布鲁斯·艾迪格的回答,除了您在最初拉取时不必指定寄存器。使用一个或多个命名寄存器可能会非常方便,但如果您需要(例如)将某些行替换为AAA
,而将其他行替换为BBB
(放入AAA
register a
,并BBB
在 register 中b
(或将其中之一保留在 register 中0
),然后相应地粘贴它们)。
您还可以0
在逐行可视模式 ( V
) 中粘贴以保存击键:V"0p
。
如果您不喜欢键入"0
,您可能会发现映射更方便:
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
另一种方法是删除_
(“黑洞”)注册。当您删除它时,"
寄存器不受影响,因此您的复制-删除-粘贴序列仍然可以从未命名的寄存器粘贴复制的文本。
yy
:注册后0
,"
两者现在都已拉线。"_dd
:寄存器没有变化。
P
:粘贴最初从寄存器中拉出的文本"
。
同样,您可能会发现映射更方便:
noremap <Leader>d "_d
答案2
看起来凯文有一个很好的答案,但如果你想关注你删除的每一行,然后替换,存在一个稍微不同的解决方案。
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
第三条线,依此类推。我养成了一个习惯(这降低了食谱的通用性)来减轻我的精神负担。
答案3
您可以V
在视觉模式下突出显示要替换的行,然后点击pp
以粘贴该行。
这只增加了一次击键,因此这似乎是一个非常好的解决方案。
答案4
c
对于此类事情,我经常使用“更改”命令,并结合常规搜索。您可以在文件中搜索您感兴趣的每一行/每段文本,然后使用连续的n.
命令(n
用于下一个,然后.
重复最后一个更改。)
/^hello
- 找到以 hello 开头的行;
c$goodbye
- 换线道别;
n.
- 重复查找,重复更改
如果您想将该行更改为文件中已有的行,只需将其复制到输入缓冲区中(假设您的 GUI 允许),然后粘贴以获取第一个更改命令的内容。
与 vi 的所有内容一样,根据您想要进行的编辑类型,您的口袋里有很多选项是个好主意。