在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
你可以创建一个简单的宏: q " _dwq
现在要在不覆盖寄存器的情况下删除下一个单词,可以使用@d
其他回答
我的情况:在普通模式下,当我使用x键删除字符时,这些删除会覆盖我的最新寄存器——当我想使用x删除字符并粘贴我在最近寄存器中的内容时(例如,在两个或多个位置粘贴相同的文本),这会使编辑复杂化。
我尝试了被接受的答案(“_d”)中的建议,但它不起作用。
然而,从https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-register上接受的回答/评论中,我把这个添加到我的~/中。vimrc,工作(你可能需要重新启动Vim):
nnoremap x "_x
也就是说,我现在可以执行普通的yank (y)、delete (d)和paste (p)命令——使用x删除的字符不再填充最新的寄存器。
Noremap mm m
and
Noremap mx "_x
是我的处理方式。
我发现从一开始就更容易插入'p'缓冲区。
复制(又名:yank)
# highlight text you want to copy, then:
"py
粘贴
# delete or highlight the text you want to replace, then:
"pp
优点(相对于删除到特定寄存器):
“pp很容易上手 不会在删除时意外覆盖粘贴缓冲区。
主要问题是在可视模式下使用p。下面的函数将恢复未命名寄存器的内容后,你粘贴的东西在视觉模式。
function! MyPaste(ex)
let save_reg = @"
let reg = v:register
let l:count = v:count1
let save_map = maparg('_', 'v', 0, 1)
exec 'vnoremap _ '.a:ex
exec 'normal gv"'.reg.l:count.'_'
call mapset('v', 0, save_map)
let @" = save_reg
endfunction
vmap p :<c-u>call MyPaste('p')<cr>
vmap P :<c-u>call MyPaste('P')<cr>
用法和以前一样,register "的内容没有改变。
对于'replace word',请在正常模式下尝试cw。
对于“替换段落”,尝试在正常模式下使用cap。