Vim能否使用默认寄存器替换文本对象?

3
例子:我有一些文本,就像这个php代码。
if(empty($condition)) {
    // work here...
}

我的默认注册表包含字符串"$NewCondition"。

我想把光标放在第一组圆括号(...)内,并执行一个命令,使其变成这样:

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

所以我的问题是:是否有一种方法可以使用默认寄存器替换括号内的文本?
大多数建议,例如这个, 在有嵌套括号时会失败。
我也知道我可以命名寄存器,例如"ayi(将所有括号中的文本复制到寄存器a中,但我不想每次复制时都要输入两个额外的字符。这就是为什么我问默认寄存器的原因。
在理想的解决方案中,当替换完成时,默认寄存器仍将包含"$NewCondition"。
3个回答

4
vi)p

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


覆盖默认寄存器的问题可以通过以下方式解决:https://dev59.com/5nVC5IYBdhLWcg3wcwsm - Luc Hermitte

2
vi("_dP
  • vi( 选择 empty($condition)
  • "_d 将其删除到黑洞寄存器中
  • P 将默认寄存器的内容放置在光标前,光标现在位于最后一个 ) 之前

我经常使用这个映射来使整个过程更加简短:

vnoremap <Leader>p "_dP

所以(将 , 设置为地图首领),我执行 vi(,p

顺便说一下,如果光标在第二个括号中,您可以执行 vi(i( 来向上一级,以此类推。


我不知道使用 i(i( 来返回上一级,非常有用。 - Jonathan Beebe

1

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

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

确实需要很多按键!如果您经常使用此操作,可以考虑为其创建一个键映射。有关更多详细信息,请参见 :help map


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接