vim可以用默认寄存器替换文本对象吗?

时间:2011-10-12 22:41:04

标签: vim

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

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

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

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

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

所以我的问题:是否有某种方法可以使用默认寄存器替换parens中的文本?

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

我也知道我可以命名寄存器,例如"ayi(将parens中的所有文本拖入寄存器a,但我不希望每次我都要输入两个额外的字符猛拉。这就是我要问默认寄存器的原因。

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

3 个答案:

答案 0 :(得分:4)

vi)p

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

答案 1 :(得分:2)

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

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

vnoremap <Leader>p "_dP

所以(使用,作为mapleader)我做vi(,p

作为旁注,如果您的光标在第二组括号中,您可以vi(i(向上升级,依此类推。

答案 2 :(得分:1)

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

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

确实有很多关键击球!如果您经常使用此类操作,则可以考虑为其创建键盘映射。有关详细信息,请参阅:help map