在vim
我使用yy
和p
所有的时间猛拉和粘贴线条。但是,如果我想在文件中的多个位置替换一行,则无法使用,yy
p
dd
p
因为dd
删除了到剪贴板/寄存器的行。虽然我应该知道如何更好地使用寄存器,但我觉得可能有一种方法可以p
替换当前行。
Chr*_*sen 33
默认情况下,粘贴命令使用"
(“未命名”)寄存器。实际上,任何写入寄存器的命令也会写入未命名的寄存器,因此猛拉、删除和更改都会影响它。这就是为什么您的 yank-delete-paste 序列粘贴已删除的文本而不是 yanked 的文本。
该0
寄存器可以帮助在这里。任何不指定寄存器的 yank 命令都会将 yank 的文本放入寄存器0
(除了"
)。它不受删除或更改操作的影响,因此即使您进行中间删除或更改,您也可以使用它多次粘贴被拉取的行。
yy
: 寄存器0
和"
两者现在都有拉出的线。dd
: 注册"
现在有删除的行,但注册0
仍然有被拉走的行。"0P
:粘贴最初从寄存器中拉出的行0
。dd"0P
(同上)(由于在替换缓冲区最后一行时光标定位的工作方式,您将需要使用"0p
代替"0P
。)
这与Bruce Ediger 的回答非常接近,只是您在最初猛拉时不必指定寄存器。使用一个或多个命名寄存器可能非常方便,但如果您需要(例如)将某些行替换为AAA
,但将其他行替换为BBB
(放入AAA
registera
和BBB
register b
(或将其中一个留在 register 中0
),然后相应地粘贴它们)。
您还可以0
在逐行可视模式 ( V
) 中粘贴以保存击键:V"0p
。
如果您不喜欢键入"0
,您可能会发现映射更方便:
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
Run Code Online (Sandbox Code Playgroud)
另一种方法是删除到_
(“黑洞”)寄存器。当你删除它时,"
寄存器不受影响,所以你的 yank-delete-paste 序列仍然可以从未命名的寄存器中粘贴被拉出的文本。
yy
: 注册0
,"
现在都有了被拉的线。"_dd
: 寄存器没有变化。P
:粘贴最初从 register 中提取的文本"
。同样,您可能会发现映射更方便:
noremap <Leader>d "_d
Run Code Online (Sandbox Code Playgroud)
Bru*_*ger 12
看起来凯文有一个很好的答案,但如果你想关注你删除的每一行,然后替换,存在一个稍微不同的解决方案。
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.
Run Code Online (Sandbox Code Playgroud)
这种方法允许您使用模式匹配来查找要删除和替换的行,并且您可以返回到文件的开头 (1G) 并根据需要随时向前搜索。如果我有 2 条或更多条线要重复收集和放置,我将"ayy
用于第一条线、"byy
第二条线、"cyy
第三条线,依此类推。我养成了一个习惯(这降低了食谱的通用性)来减少我的心理负担。
有几种方法可以使用:s
,这取决于您想要输入多少。最简单的方法是简单的搜索和替换:
:%s/find this line/replace with this/
Run Code Online (Sandbox Code Playgroud)
在%
将搜索整个文件全部替换。
如果这对您来说打字太多,您可以拉出目标字符串 ( yy
) 并使用"
(默认)寄存器,将其插入Ctrl+r ":
:%s/<ctrl+r><">/replacement/
Run Code Online (Sandbox Code Playgroud)
或者,如果您有替换字符串的副本,则可以将两者分别用"ayy
和 拉入单独的寄存器,并分别拉"byy
入a
和b
寄存器(您可以对寄存器使用任何字母)。然后使用Ctrl+r a和Ctrl+r b将它们粘贴到搜索和替换字段中。
不是单人布鲁斯,但如果你想在替换之前检查行,只需添加c
选项:
:%s/find this line/replace with this/c
Run Code Online (Sandbox Code Playgroud)