Vim - 更改至包括搜索字符串

4
假设我有以下代码:
bool myCopiedFunc() {
    Some code that I've written;
    The cursor is on this line; <<<<<<<<<<<<<<
    if (something) {
        bool aValue;
        some of this is inside braces;
        return aValue;
    }
    if (somethingElse) {
        this is also inside braces;
        bool anotherValue;
        {
            more braces;
        }
        return anotherValue;
    }
    return false;
}

我决定重写函数的剩余部分,从光标所在行开始。

要替换同一行上到某个字符为止的内容,可以使用ct<char>,例如ct;
要替换同一行上到某个字符及其本身的内容,可以使用cf<char>,例如cf;
要替换跨越多行的某个字符串的内容,则可以使用c/<string>,例如c/return false
要替换跨越多行的某个字符串及其本身的内容,则可以使用... ?? 例如 ??

不能只搜索分号,因为光标和函数结尾之间有未知数量的分号,而计算它们会很慢。 也不能只搜索闭合括号,因为光标和函数结尾之间有多个块,而计算所有闭合括号会很慢。 通过代码高亮,我可以轻松看到我可以搜索的唯一字符串是return false

是否有一种优雅的方法来删除或更改到某个字符串模式的内容(包括它本身)?

我已经查看了几个相关的问题。

使Vim将正向搜索视为“包括”有一个被接受的答案,但它并没有回答我的问题。

在我的情况下,我选择删除到搜索字符串,然后分别删除到分号,但感觉效率低下,最好直接用鼠标解决。 #第一世界的问题

2个回答

4

如果要替换跨越多行的字符串,我可以使用...?? 例如 ??

/ 支持偏移量。

在您的情况下,您需要使用 e 偏移量,即 c/foo/e

您可能想了解更多关于 "搜索偏移量" 的详细信息:

:h offset

非常准确 - 我原以为 'e' 只会偏移字符串的第一个单词(即 return)。我在 Eclipse 中使用 Vrapper,所以 :h 不起作用,但是当我尝试实际使用 vim 时,它给出了页面未找到的错误。我安装了 vim-doc 包,但仍然找不到,但这是另一个完全不同的问题... - M_M
@M_M 我从2014年之前就用了大约十年的eclipse。vi-plugin、vrapper...它们都不如intellij中的ideavim好。尽管ideavim无法与真正的vim相比,但至少它是“可用的”。这里也有在线vim文档,你可以通过谷歌搜索获得。但标准的vim安装应该包含文档。 - Kent
@M_M偏移量通常相对于整个匹配,因此/e表示匹配的结尾。 - D. Ben Knoble
我尝试了一下,很高兴看到/e匹配整个字符串的结尾。因此,我问题中粗体的那一行应该写成:**要替换跨越多行的字符串(包括该字符串本身),可以使用c/<string>/e,例如c/return false/e**。这个答案提供了这个信息,所以我已经将其标记为接受的答案,但我不确定是否要将这一行重新加入问题中,使其成为一个更有用的资源。foo的例子并没有展示出/e如何处理多个单词而不需要数字参数,与命令模式中的e不同。 - M_M
@M_M 谢谢您接受这个答案。我不明白您的要求。您是想从>>>>>cursor行到return false;行(包括这两行)删除吗?为什么/e偏移量对您无效?您是指您的文件中有多个return false;语句吗? - Kent
@Kent:你的答案是正确的,/e 偏移对我也起作用。唯一的问题是是否更新问题,在适当的位置包含答案。 - M_M

1
如果你将当前范围相关的右半括号替换为 c]}
如果你正在寻找函数的结尾,即使这意味着跨到上层范围,如果函数可能不是0缩进,那么你需要一个插件,就像在C++、Java等语言中一样。请参见相关的vi.SE上的Q/A

2
这并没有回答问题,但是我会点赞你的回答,因为你理解了我的意图。我原本是通过查找唯一字符串并尝试替换它及其之前的内容(但保留分号以节省输入时间;也许我误以为我不需要输入分号,但实际上我还是会出于习惯而输入的)。被采纳的答案提供了一种适用于其他情况的方法,但你说得对,在这种情况下,我想要替换到当前作用域的末尾。如果我当时就这样考虑的话,那么你的回答就完全符合我的需求了。 - M_M

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