在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
在使用Vim时,我经常想用我刚拉出的代码块替换代码块。
但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。
那么,在Vim中替换文本的最灵活、最快的方法是什么呢?
是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?
当前回答
寄存器0到9是最新的东西你拉或削减等,不包括删除的东西等。所以如果你拉/切一些东西,它也在寄存器0中,即使你说在那之后删除了东西,寄存器0仍然是你拉/切的最后一个东西。
yiw#转到默认寄存器和寄存器0
它猛拉光标所在的单词
删除的东西等将去默认寄存器,但不是寄存器0
标准模式:
“0p#放入寄存器0的内容
插入模式:
Ctrl-r 0 #放入寄存器0的内容
我也有一个朋友,他总是猛拉/切来注册x,哈哈。
其他回答
我把以下内容放在我的vimrc中:
noremap y "*y
noremap Y "*Y
noremap p "*p
noremap P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*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,那么你必须使用不可见的标记,而不是视觉模式,他标记更多关于这个,我很抱歉,但我不太擅长这种不可见标记的东西,我很受视觉模式的污染。
你可以创建一个简单的宏: q " _dwq
现在要在不覆盖寄存器的情况下删除下一个单词,可以使用@d
为了强调EBGreen所说的:
如果在选择文本时进行粘贴,则所选文本将替换为粘贴的文本。
如果您想复制一些文本,然后将其粘贴到多个位置,请使用“0p”进行粘贴。编号为0的寄存器包含来自最近yank命令的文本。
此外,你可以列出所有寄存器的内容:
:registers
该命令使得在执行dbr应答之类的操作时更容易找出需要的寄存器。您还将看到/,%,#寄存器。(请参见:帮助寄存器)
最后,检查cW和cW来改变一个单词,包括和不包括尾随空格。(大写W包含标点符号。)
在windows版本中(可能也在Linux中),你可以使用“*y”(即在你的yank命令前加双引号和星号)插入系统的复制/粘贴缓冲区。
然后,您可以正常删除可替换的行,并使用“*p”粘贴复制的文本。