【问题标题】:Can vim replace a text object with the default register?vim 可以用默认寄存器替换文本对象吗?
【发布时间】:2011-12-06 12:58:00
【问题描述】:

示例:我有一些文本,比如这个 php 代码

if(empty($condition)) {
    // work here...
}

我的默认寄存器包含字符串“$NewCondition”。

我想将光标放在第一组括号 (...) 中并执行一个命令,结果如下:

if($NewCondition) {
    // work here...
}

所以我的问题是:有没有办法使用默认寄存器替换括号内的文本?

我发现的大多数建议 such as this one 在嵌套括号时都会失败。

我也知道我可以命名寄存器,例如 "ayi( 以将括号中的所有文本提取到寄存器 a 中,但我不想每次提取时都输入两个额外的字符。这就是我询问默认寄存器的原因。

在理想的解决方案中,当替换完成时,默认寄存器仍将包含“$NewCondition”。

【问题讨论】:

    标签: vim


    【解决方案1】:
    vi)p
    

    不幸的是,这也会将旧文本放入默认寄存器中。

    【讨论】:

    【解决方案2】:

    试试这个:"_ci)<c-r>"<esc>

    这里有一些详细的解释:"_ 表示为以下命令选择“黑洞”寄存器。因此,在您的下一个操作中被删除的文本将被简单地丢弃并且不会被放入任何寄存器中。 ci) 表示“更改内括号”,它将删除当前级别括号对内的所有文本,然后进入插入模式。插入模式下的<c-r> 表示将指定寄存器中的文本插入到当前光标位置," 选择“默认寄存器”。最后,我们使用<esc> 让我们回到正常模式。

    确实有很多按键!如果你经常使用这样的操作,你可以考虑为它创建一个键盘映射。详情请见:help map

    【讨论】:

      【解决方案3】:
      vi("_dP
      
      • vi( 选择empty($condition)
      • "_d删除到黑洞寄存器中
      • P 将默认寄存器的内容放在光标之前,光标现在位于最后一个 )

      我经常使用这个,所以我有这个映射来使整个事情更短:

      vnoremap <Leader>p "_dP
      

      所以(以, 作为地图领队)我愿意vi(,p

      附带说明一下,如果您的光标在第二组括号中,您可以使用vi(i( 向上一级,依此类推。

      【讨论】:

      • 不知道用i(i(上一级,很有用。
      猜你喜欢
      • 2020-12-16
      • 2020-10-03
      • 2012-12-30
      • 1970-01-01
      • 2021-09-13
      • 2021-02-01
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多