在Vim中,有没有一种方法可以删除而不在寄存器中输入文本?
使用Vim,我经常想用我刚刚拉过的代码块替换代码块。
但是,当我删除要替换的代码块时,该代码块本身进入寄存器,该寄存器将擦除我刚刚提取的代码块。因此,我习惯于拉动,然后插入,然后删除我不想要的内容,但是对于大型代码块,尝试将插入的块和要删除的块分开是很麻烦的。
那么,在Vim中替换文字的最流畅最快的方法是什么?
- 有没有办法删除文本而不将其放入寄存器?
- 有没有办法说例如"替换下一个单词"或者"替换到下一个段落"
- 还是以某种方式使用多重注册功能的最佳方法?
解决方案
回答
好吧,首先执行以下命令:
:h d
然后,我们将意识到可以删除特定的寄存器。这样,我们将不会更改默认寄存器中的内容。
回答
对于我们给出的特定示例,如果我理解这个问题,那么这可能会起作用:
*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:转到第一行
V
:以整行开始可视模式j
:下移一行(选择从前几行开始,这会使选择向下移动一行)- y:拉到默认缓冲区(选中的两行,它会自动退出可视模式)
- G:转到最后一行
V
:启动可视模式(与以前相同)k
:向上一行(与以前一样,在启用可视模式的情况下,此选项将向上一行增加)p
:粘贴(在最后两行中进行选择,它将用缓冲区中的任何内容替换这些行-在这种情况下为前两行)
将最后一个块放在缓冲区上会带来一些不便,因此以某种方式重复粘贴同一件事是不希望的,因此,我们需要将源保存到带有" ay"(到缓冲区" a")并粘贴类似" ap"(但是如果我们正在编程,则可能不想粘贴几次,而是创建一个函数并调用它,对吗?对吗?)。
如果我们仅使用vi,那么我们将不得不使用不可见标记来代替可视模式,:he mark
以获得更多信息,对不起,但是我对这个不可见标记的东西不太满意,我很高兴受到视觉模式的污染。
回答
要删除某些内容而不将其保存在寄存器中,可以使用"黑洞寄存器":
"_d
当然,我们也可以使用其他任何不包含我们感兴趣的寄存器的寄存器。
回答
在插入模式下删除的文本不会进入默认寄存器。
回答
对于"替换词",请在正常模式下尝试使用" cw"。
对于"替换段落",请在正常模式下尝试使用" cap"。
回答
是的。与先删除"旧"文本相比,它有些复杂,但是:
我从开始。
line1 line2 line3 line4 old1 old2 old3 old4
我用Shift + v选择第1行,第2、3和4行,并用d命令删除它们
然后我以同样的方式删除旧的1-4行。
然后做
"2p
这将粘贴倒数第二行的线条(第1-4行)。 " 3p"将从倒数第三开始执行,依此类推。
所以我最终
line1 line2 line3 line4
参考:
编号寄存器上的Vim文档
回答
在Windows版本中(也可能在Linux中),我们可以使用" * y"(即,在yank命令前加双引号和星号)来提取系统的复制/粘贴缓冲区。
然后,我们可以正常删除可替换的行,并使用" * p"粘贴复制的文本。
回答
VIM文档:编号为0的寄存器包含来自最新yank命令的文本,
除非命令用[" x]指定另一个寄存器。
例如。我们猛拉" foo"并删除" bar",注册表0仍包含" foo"!因此,可以使用" 0p"粘贴" foo"
回答
具有简单的映射非常方便,该映射使我们可以将当前选择替换为缓冲区。
例如,当我们将其放入.vimrc中时
vmap r "_dP // it's a capital 'p' on the end
然后,将某些内容复制到寄存器中(即带有" y")后,我们只需选择要替换的文本,然后在键盘上按" r"即可。选择内容将替换为我们当前的寄存器。
解释:
vmap - mapping for visual mode "_d - delete current selection into "black hole register" P - paste
回答
我在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
现在,我从剪贴板寄存器移入并移出,而不必关心默认寄存器会发生什么。另一个好处是,我可以轻松地从其他应用程序粘贴。我知道我失去了一些功能,但是无论如何我都无法跟踪多个寄存器/剪贴板。
回答
在遵循以下命令时,我经常会犯一个错误:'y'ank然后'" _d'进入黑洞,然后'p'aste。我更喜欢'y'ank,然后删除,但我喜欢,然后从0寄存器,这是最后复制的文本被推送到的位置。
回答
为了强调EBGreen所说的话:
如果在选择文本时粘贴,则所选文本将替换为粘贴的文本。
如果要复制一些文本然后将其粘贴到多个位置,请使用" 0p"进行粘贴。编号为0的寄存器包含来自最新yank命令的文本。
另外,我们可以列出所有寄存器的内容:
:registers
使用该命令可以更轻松地确定执行dbr之类的答案时所需的寄存器。我们还将看到/,%,寄存器。 (另见:help register
)
最后,检查cW
和cW
来更改包含和不包含尾随空格的单词。 (使用大写字母" W"包括标点符号。)