在不使用视觉选择的情况下粘贴内部分隔符

时间:2014-03-02 11:08:12

标签: vim

在Vim中,假设我想用一个String的内容替换另一个String的内容。

原始输入

var1 = "January"
var2 = "February"

所需的输出

var1 = "January"
var2 = "January"

我通常会做的是:

  • 将光标移动到第1行
  • y i "(猛烈的内部引语)
  • 将光标移动到第2行的目的地报价
  • v i " p(视觉选择内部引号,粘贴)

虽然效果很好,但我通常尽量避免使用视觉模式,所以我对第4步(v i " p)并不完全满意

有没有办法在不使用可视模式的情况下指定“目标粘贴区域”?我怀疑它可能是g的链接,但我想不出任何东西。

5 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,但使用视觉模式是最简单的。

  • 使用黑洞寄存器删除内容然后粘贴。例如"_di"P
  • ci"<c-r>0<c-r>插入寄存器的内容
  • 只需粘贴然后移动一个字符并删除旧文本即可。例如pldt"

然而,视觉模式仍然有我的投票。我发现大多数人的担忧是使用可视模式+粘贴是默认寄存器与所选文本交换,并且不能很好地重复。大家好消息! 0寄存器始终存储最后一个yank。坏消息是视觉模式仍然不能很好地重复。有关详细信息,请查看此vimcast剧集Pasting from Visual mode。它提到了一些有助于此的插件。

答案 1 :(得分:2)

这不是特别漂亮,但这里有:

  1. 转到第一行和yi"
  2. 转到第二行
  3. 输入"_di"hp
  4. 删除引号中的内容,但将删除的文本发送到黑洞寄存器。然后它将光标向后移动一个,并粘贴你从第一行拉出的东西。

    总而言之,您可以从第一行开始并输入yi"j"_di"hp。为什么人们发现vim令人生畏? ;)

    或者,将第一行拉到正常位置,然后放到第二行并输入ci"<Ctrl+p>并从菜单中选择之前被拉出的文本。

答案 2 :(得分:2)

摘自我的.vimrc:

" Delete to 'black hole' register
nnoremap <leader>d "_d
vnoremap <leader>d "_d

因此,您只需\di"P作为最后一步(假设您使用\作为<leader>)。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

有一个插件可以准确地解决这个问题。它可能是出于你所感受到的同样的感觉,即视觉模式通常对高级Vim用户来说感觉不太理想。

  

operator-replace - 用注册内容替换文本的运算符

安装了操作员替换后,替换就像这样。

  1. 将这个词放在引号内。

    yi"
    
  2. 移至目标线

    j
    
  3. 用引号文本替换引号内部。 (我已将gr设置为替换运算符::map gr <Plug>(operator-replace)。选择您自己的映射。)

    gri"
    
  4. 看看吧!这是真正优秀的textobj / operator框架的一部分。没有他们我就无法工作。