在使用Vim时,我经常想用我刚拉出的代码块替换代码块。

但是当我删除要替换的代码块时,该代码块本身就会进入寄存器,它会擦除我刚刚删除的代码块。所以我已经养成了拉拽,然后插入,然后删除我不想要的东西的习惯,但对于大块的代码,这变得很混乱,试图保持插入的块和要删除的块分开。

那么,在Vim中替换文本的最灵活、最快的方法是什么呢?

是否有一种方法可以删除文本而不将其放入寄存器? 有一种说法吗?“替换下一个单词”或“替换到下一段” 还是使用多寄存器特性的最佳方式?


当前回答

我发现从一开始就更容易插入'p'缓冲区。

复制(又名:yank)

# highlight text you want to copy, then:
"py

粘贴

# delete or highlight the text you want to replace, then:
"pp

优点(相对于删除到特定寄存器):

“pp很容易上手 不会在删除时意外覆盖粘贴缓冲区。

其他回答

要删除某些内容而不将其保存在寄存器中,你可以使用“黑洞寄存器”:

"_d

当然,您也可以使用其他任何不包含您感兴趣的任何内容的寄存器。

是的。这比先删除“旧”文本稍微复杂一些,但是:

我从。开始。

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文档

如果你用的是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,那么你必须使用不可见的标记,而不是视觉模式,他标记更多关于这个,我很抱歉,但我不太擅长这种不可见标记的东西,我很受视觉模式的污染。

对于'replace word',请在正常模式下尝试cw。

对于“替换段落”,尝试在正常模式下使用cap。

Noremap mm m

and

Noremap mx "_x

是我的处理方式。