在Vim中,有没有一种方法可以删除而不在寄存器中输入文本?

时间:2020-03-05 18:50:47  来源:igfitidea点击:

使用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)

最后,检查cWcW来更改包含和不包含尾随空格的单词。 (使用大写字母" W"包括标点符号。)