在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
我发现从一开始就更容易插入'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 "的内容没有改变。
对于你给出的具体例子,如果我理解了问题,那么这可能是可行的:
*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)
如果你用的是Vim,你会有视觉模式,就像选择,但有分离模式,这是vi/ Vim的基础。
您要做的是使用可视模式选择源,然后弹出,然后再次使用可视模式选择目标范围,然后粘贴到默认缓冲区中的文本。
例子:
在文本文件中使用:
1| qwer 2| asdf 3| zxcv 4| poiu
使用以下序列:ggVjyGVkp,你将以:
1| qwer 2| asdf 3| qewr 4| asdf
解释道:
gg: go to first line V: start visual mode with whole lines j: go down one line (with the selection started on the previous lines this grows the selection one line down) y: yank to the default buffer (the two selected lines, and it automatically exits you from visual mode) G: go to the last line V: start visual mode (same as before) k: go up one line (as before, with the visual mode enabled, this grows the selection one line up) p: paste (with the selection on the two last lines, it will replace those lines with whatever there is in the buffer -- the 2 first lines in this case)
这有一点不方便,把最后一个块放在缓冲区,所以它不需要重复粘贴相同的东西,所以你会想要保存源代码到一个命名缓冲区,如“ay”(缓冲区称为“a”)和粘贴,如“ap”(但如果你在编程,你可能不想多次粘贴而是创建一个函数并调用它,对吗?对吧?)。
如果你只使用vi,那么你必须使用不可见的标记,而不是视觉模式,他标记更多关于这个,我很抱歉,但我不太擅长这种不可见标记的东西,我很受视觉模式的污染。
是的。这比先删除“旧”文本稍微复杂一些,但是:
我从。开始。
line1
line2
line3
line4
old1
old2
old3
old4
shift+v选择line1, line2, line3和line4,然后用d命令删除它们
然后用同样的方法删除原来的1-4行。
然后,做
"2p
这将粘贴倒数第二行(第1-4行)。“3p会做倒数第三,以此类推。
最后得到
line1
line2
line3
line4
参考: 编号寄存器上的Vim文档
有一个简单的映射是很方便的,它可以让你用缓冲区替换当前选择。
例如,当你把这个放在你的。vimrc
" it's a capital 'p' at the end
vmap r "_dP
然后,在复制一些东西到寄存器(即用“y”)后,你可以选择你想要替换的文本,并简单地敲击键盘上的“r”。所选内容将被当前寄存器替换。
解释:
vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste