我经常遇到的一种编辑模式如下:我想在引号或方括号内插入一段文本,然后在另一对引号/方括号内替换该文本。

例如我想复制类名foo bar并将其粘贴到其他地方:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">


我知道的是:如果我在span的类中移动,则使用yi"来在引号中插入文本。

现在我已将其保存在寄存器中,因此我应该能够用它替换div的类内容。但是我找不到方便的方法。

如果我使用ciw,最终将覆盖我的寄存器,并更改了内容,因此我松开了被拉下的文本。

我能想到的最好的方法是移至div班级的第一引号,击中p,然后用dt"删除至下一个引号。

通常,我通常会弄乱自己的位置,然后我将其粘贴到合并两个字符串的引号中的某处,这会使事情变得混乱。

我希望可以通过某种方式来“将内部文本替换为我想要的内容”组合这更容易。

#1 楼

您可以在vi"p内使用""。这可以替换yank寄存器中的文本,因此,当您想多次使用原始的yanked文本时,这一点很重要。

EDIT:
Octaviour注释中的有关使其可重复使用多次的其他信息:


为此,我将拉到一个命名寄存器,如果使用寄存器"ayi",它将发出两个命令:vi""apa


评论


我将详细介绍该解决方案。首先,您要提取要复制的文本。然后,转到要粘贴的位置,使用vi“进行直观选择。粘贴命令现在将同时将未命名寄存器的内容放在光标上,并删除所选文本。因此,vi” p可以完全完成您想要的操作,但是它确实会替换未命名寄存器的内容,从而使您无法粘贴相同的文本两次。为了做到这一点,我将拉到一个命名寄存器,如果使用寄存器a,它将产生两个命令:“ ayi”和vi“” ap。

–职业
16年11月4日在10:59

感谢您的阐述。它有助于通过vim动作将内容拼出,使以后记起来更容易。它仍然不像我希望的那样容易,但是以vim的方式有意义。使用dot命令使其重复并快速替换第二遍似乎不起作用。我希望这是捷径。 :)

– jurgenb
16年11月7日在9:19

#2 楼

您可以使用编号寄存器。首先用yi"拉动“ foo-bar”,它将填充"0寄存器,请参阅:h "0。然后执行ci"<c-r>0替换为寄存器0的内容。

有关最后一部分的说明,请参见:h i_CTRL-R

评论


为什么不简单地将其拉到未命名的寄存器(yi“)中,并在删除要更改的文本(ci” 0)之后从存储在寄存器0中将其粘贴呢?就vimgolf而言,您赢了2次击键,而且您不会弄乱寄存器。

–statox♦
16年11月4日在10:29

我一按“ a”就进入编辑模式,但不会复制到寄存器中

– jurgenb
16-11-4在10:36



@ n3wjack这可能是因为您没有在a之前按CTRL + r,这就是的意思。

–statox♦
16年11月4日在10:44

@karlYngveLervåg实际上ciw确实将已删除的文本放在未命名的寄存器中,但是寄存器已移位,这就是为什么必须使用 0而不是”的原因。请参见:h quote_number。

–statox♦
16年11月4日在10:48

我想,更具体地说,这里的重点不是关于未命名的寄存器,而是关于编号的寄存器。 “ 0寄存器仅由yank命令填充,不会受到例如c的干扰。

– Karl YngveLervåg
16年11月4日在10:49

#3 楼

我经常需要它,我写了一个插件来简化并允许最大速度:ReplaceWithRegister。

此插件提供了二合一的gr命令,用于替换{motion} /文本对象所覆盖的文本,整行或当前选择以及寄存器的内容;旧文本将被删除到黑洞寄存器中,即已消失。它透明地处理许多极端情况,并允许通过标准.命令进行快速重复。如果您不喜欢它,它的页面上有其他链接。

评论


大!这应该是香草vim。

– Philipp Moers
16年11月6日在10:32

太棒了! 👍我也经常需要这样做,这就是为什么我一直在寻找最快的方法。

– MaxGyver
20-10-7的18:00

#4 楼

这是另一种解决方案。就Vimgolf而言,这并不是最好的方法,但是它使用了黑洞寄存器:

一旦使用了foo bar字符串,就可以使用yi"正常将其拉出。

然后在括号内进行更改:"_di"P

哪个是:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text


黑洞寄存器的优点是它不会弄乱别人寄存器。有关更多详细信息,请参见:h quote_

(请注意,此答案仅是在这里讨论遮光寄存器。我个人使用@grodzik建议的视觉选择。)

评论


我认为您需要一个大写的P。当您使用di“时,您的光标将留在最后的引号上,p将粘贴在后面,而P则粘贴在当前位置之前。

–jecxjo
16年11月4日在14:38

@jecxjo是的,我编辑了答案,谢谢!

–statox♦
16年11月4日在14:40