如何在 vim 中替换粘贴选中的文本而不选中已删除的行?

如何在 vim 中替换粘贴选中的文本而不选中已删除的行?

因此,我经常发现自己将文本从一个点复制到另一个点,同时在粘贴新文本的地方覆盖旧文本:

blah1
newtext
blah2
wrong1
blah3
wrong2
blah4

假设我对其进行了视觉标记newtexty注释。现在我选择wrong1(可以是任何内容,不一定只是一个单词)并p粘贴newtext。但是,如果我现在对 执行相同操作,wrong2它将被替换为wrong1而不是newtext

那么,我该如何防止缓冲区中的文本与我当前正在覆盖的文本交换呢?

编辑1

虽然我很喜欢寄存器建议(我想我会开始更多地使用寄存器,因为我发现了这个:dis命令),但我还是要修改一下金菲尔德的回答,因为我没有使用交换模式。

vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d

完美地完成了这个任务。

编辑2

我太快了;羅馬尼的解决方案正是我所寻找的,没有黑客编辑1
其实vnoremap p "_dP就够了!
所以,改变接受的答案。

答案1

我的 .vimrc 中有这些映射:

" delete without yanking
nnoremap <leader>d "_d
vnoremap <leader>d "_d

" replace currently selected text with default register
" without yanking it
vnoremap <leader>p "_dP

"_是“黑洞登记册”,根据:help "_

“当写入此寄存器时,不会发生任何事情。这可用于删除文本而不影响正常寄存器。当读取此寄存器时,不会返回任何内容。{Vi 中不存在}”

答案2

除了标准缓冲区外,您还可以将文本提取到命名缓冲区中,然后从这些命名缓冲区中放入文本。您最多可以使用 26 个命名缓冲区(每个字母一个)。使用双引号和字母访问命名缓冲区。示例:

"dyy - 将当前行拉入缓冲区 d。
"a7yy- 将接下来的七行拉入缓冲区 a。
"dP- 将缓冲区 d 的内容放在光标之前。
"ap- 将缓冲区 a 的内容放在光标之后

另一个很酷的事情是,如果你使用大写字母而不是小写字母,即"Dyy当前行将被附加到缓冲区 d 而不是替换它。更多详细信息请参阅 O`Reilly 书籍:http://docstore.mik.ua/orelly/unix/vi/ch04_03.htm

答案3

用于P粘贴而不拉出已删除的文本。

:帮助 v_P

使用 P 时未命名的寄存器不会改变(选择或剪贴板也不会改变),您可以重复相同的更改。

此行为于v8.2.4242(2022-01-28)并精炼于v8.2.4881(2022-05-06)。

或者如果你的肌肉记忆太强:

xnoremap p P

答案4

了解从"0寄存器粘贴很重要,但您经常需要多次替换。如果您将其设为可重复的操作,则可以使用运算.符,如 garyjohn 所提到的。解释如下在 vim wiki 上

yiw     yank inner word (copy word under cursor, say "first". Same as above).
...     Move the cursor to another word (say "second").
ciw<C-r>0   select "second", then replace it with "first" If you are at the start of the word then cw<C-r>0 is sufficient.
...     Move the cursor to another word (say "third").
.   select "third", then replace it with "first". 

相关内容