因此,我经常发现自己将文本从一个点复制到另一个点,同时在粘贴新文本的地方覆盖旧文本:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
假设我对其进行了视觉标记newtext
和y
注释。现在我选择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
答案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".