Vim 粘贴内部分隔符而不使用视觉选择

Vim 粘贴内部分隔符而不使用视觉选择,vim,Vim,在Vim中,假设我想用另一个字符串的内容替换一个字符串的内容 原始输入 var1 = "January" var2 = "February" var1 = "January" var2 = "January" 所需输出 var1 = "January" var2 = "February" var1 = "January" var2 = "January" 我通常会做的是: 将光标移到第1行 yi“(yank内部引号) 将光标移动到第2行中的目标报价 vi”p(可视化选择内部引号,粘贴)

在Vim中,假设我想用另一个字符串的内容替换一个字符串的内容

原始输入

var1 = "January"
var2 = "February"
var1 = "January"
var2 = "January"
所需输出

var1 = "January"
var2 = "February"
var1 = "January"
var2 = "January"
我通常会做的是:

  • 将光标移到第1行
  • y
    i
    (yank内部引号)
  • 将光标移动到第2行中的目标报价
  • v
    i
    p
    (可视化选择内部引号,粘贴)

虽然这很有效,但我通常尽量避免使用可视模式,因此我对第4步并不完全满意(
v
I
p


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

它不是特别漂亮,但下面是:

  • 转到第一行并
    yi“
  • 移到第二行
  • 键入
    “\u di”hp
  • 这会删除引号中的内容,但会将删除的文本发送到黑洞寄存器。然后它将光标向后移动一次,并粘贴从第一行拖动的内容

    总而言之,您可以从第一行开始,键入
    yi“j”\u di“hp
    。为什么人们会觉得vim很吓人?;)


    或者,将第一行正常拖动,然后下降到第二行,键入
    ci“
    ,然后从菜单中选择先前拖动的文本。

    摘自my.vimrc:

    " Delete to 'black hole' register
    nnoremap <leader>d "_d
    vnoremap <leader>d "_d
    
    “删除到“黑洞”寄存器
    nnoremap d“\u d
    vnoremap d“\u d
    

    因此,您只需将
    \di“p
    作为最后一步(假设您将
    \
    用作
    )。

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

    • 使用黑洞寄存器删除内容,然后粘贴。e、 g.
      “\u di”P
    • Do
      ci“0
      插入寄存器的内容
    • 只需粘贴一个字符,然后移动到该字符上并删除旧文本。例如
      pldt“

    然而,视觉模式仍然有我的投票权。我发现大多数人担心的是,使用VisualMode+paste时,默认寄存器与所选文本交换,并且不会很好地重复。大家好消息!
    0
    寄存器始终存储最后一个yank。坏消息是视觉模式仍然不能很好地重复。更多信息,请看这一vimcast插曲。它提到了一些有助于解决这个问题的插件。

    有一个插件正好解决了这个问题。它可能是出于与您的感受相同的原因,即对于高级Vim用户来说,视觉模式通常感觉不太理想

    –操作员用寄存器内容替换文本

    安装了operator replace后,更换过程如下所示

  • 在引号里猛拉这个词

    yi"
    
  • 移动到目标线

    j
    
  • 用拉长的文本替换引号内的内容。(我已将
    gr
    设置为替换操作符:
    :映射gr(operator replace)
    。选择您自己的映射。)


  • 看看!这是真正优秀的/框架的一部分。没有它们我无法工作。

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


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

    black hold register+1“我通常会尽可能避免使用视觉模式”。。。如果您不介意我问一下,为什么?使用操作员动作更改文本比使用视觉模式更可取,因为只有前者可以在
    中可靠地重复。Drew Neil称之为“点公式”。对于第二种方法,我认为您应该像第一种方法一样使用黑洞寄存器(
    “\u ci”“
    ),或者使用0寄存器(
    ci“0
    )。对于第三种方法,您必须从开始引用开始,而不是从内部开始,并且它不能满足可重复使用
    (第一种方法也不能)。我猜那个进球是在@PeterRincker的回答之后加上的。@benjifisher谢谢。我已经纠正了第二个选项。我认为,如果通过
    实现重复能力是最终目标,那么第二种方法可能是vim的最佳选择。然而,使用像Ingo Karkat这样的插件(在Vimcast一集中提到过)可能是维护
    重复能力的最简单的解决方案。