Vim:替换函数体内的文本

时间:2011-03-30 09:20:44

标签: vim replace

我有一些非常有用的插件可以通过文件查找和替换文本(请参阅EasyGrep vim脚本 - 这对程序员非常有帮助)。我甚至可以只在当前缓冲区中替换文本 - 使用插件或:%s ...。但是如果我只想在当前函数体中替换文本呢?

考虑以下示例:

void f0()
{
     int foo = 0;
     // ...
}

// 99 other functions that uses foo as local variable.

void f100()
{
     int foo = 0;  // I want to replace foo with bar only in this function
     // 1000 lines of code that uses foo goes below
     // ...
}

当然,我可以使用带有:%s ...标记的c进行确认,但我相信有更快的方法可以做到这一点。

感谢。

3 个答案:

答案 0 :(得分:14)

您可以使用%或选择对整个文件应用替换。

创建选择

以可视模式Linewise为例,使用Shift+v,选择几行,然后输入:

您的提示将如下所示: :'<,'>表示:当前选择

然后输入s/foo/bar/g,它将在当前选定的行中用bar替换foo。

选择函数内容的更好方法是使用游标进入函数并输入: vi}它会选择{}之间的所有内容。

有关选择的更多提示,请参阅:help text-objects

答案 1 :(得分:5)

您可以使用V标记该功能。然后当您在:中键入命令时,它将自动加上前缀并且仅在标记区域中执行。

可能有一个跳转到函数开头和函数结束的命令,所以你可以很快地做开始函数,V,结束函数,替换。但不知道那些命令。

答案 2 :(得分:1)

我总是使用[[跳转到函数的开头,然后使用%跳转到函数的结尾。我使用 mt mb 分别标记函数的顶部和底部。然后在标记的顶部和底部搜索并替换:&#39; t,/ pattern / newpattern / g 。这一直对我有用。我确定你可以为此创建一个宏。

视觉选择(vi)更容易,更快捷。它知道光标位置。因此,如果光标位于fucntion子块内,则vi}选择该块中的所有行。如果要选择整个函数,需要将光标放在子块之外,然后执行vi}。这适用于适合当前窗口的功能块。对于跨越当前窗口的函数,向上滚动后选择将丢失。

我非常喜欢vi}的视觉选择,因为它更容易和更快,但我不得不采用旧式的方法。