在我的日常工作中,很多时候我需要操作特定的功能,例如突出显示或搜索变量,但我从未设法限制编辑/搜索的范围。

vim中是否有一种方法可以有选择地说,找到这些括号内的所有对$color的引用,或这种折叠等。如果可能的话,最好是相对通用的,以便将其应用于编辑/替换文本。

作为示例:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;


此代码是一个相对较差的示例,但是,如果我需要替换的所有实例, $ color将如何在函数PickColor的上下文中执行此操作。再举一个例子,使用#*您可以转到该文本对象的下一个实例,如何将搜索范围限制为仅此功能(基本上是包裹搜索),而不是整个文件(可能跨越数千行)失去位置,或者错误地替换了您不应该使用的其他功能?

#1 楼

这是几种解决方法。

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;


我已经修改了您的示例以包括行号。

所以现在您可以替换$color的实例,例如$newColor,方法如下。

行号范围

:1,11s/$color/$newColor/g

这使替换操作在第1行上进行包含11。

相对行范围

将光标放在第1行,然后...

:.,11s/$color/$newColor/g

这表示范围从当前行开始,到第11行结束。

可视选择范围

转到第1行并按Shift+V然后按G。这将直观地选择第1行。然后...

:'<,'>:s/$color/$newColor/g

这将替换限制在所选内容覆盖的范围内。当您按'<,'>并处于活动状态时,Vim会自动为您插入:范围。

评论


我喜欢vim,总有一些需要学习和发现的东西,可以使生活更轻松,每天都可以:)

–凯尔·麦吉尔(Kyle Mcgill)
2015年2月3日在20:43

#2 楼

如果您愿意采用插件路线,则可以使用NrrwRgn。

您可以直观地选择一个块,然后运行:NR命令,该命令将打开一个带有选定文本的新缓冲区(拆分后)。您可以对此缓冲区进行修改,然后将其保存到原始文件中。

我认为,此插件很好地解决了问题,让您专注于您要执行的操作而无需重新考虑如何将其应用于特定范围。

评论


这是我发誓的插件之一。就像有一个暂存缓冲区,您可以将其提交回普通代码文件。

– Craigp
2015年2月4日在6:57

#3 楼

您选择在可视线模式(shift + v)中感兴趣的块,然后键入:和您的命令,该命令现在将应用于该块。

因此,如果要替换选择,您可以运行:s/string/replacement_string

评论


对;例如,VaB:s / \ $ color / replaced / g

– wchargin
15年2月3日在20:25

刚刚补充一点,好点:)

– Stefan Dorunga
15年2月3日在20:26

#4 楼

使用大括号文本对象'}',并在带有函数的开头大括号的行中用'i}'选择大括号:

$<C-V>i}:s/$color/$newColor/g


首先转到该行的末尾(将在大括号内或之内),然后进入可视选择,然后使用大括号文本对象进行选择。 'i}'位于大括号内'a}'位于大括号内。

对于缺少大括号的语言,Vim文本对象:权威指南建议了一些插件:


对于Python和CoffeeScript之类的语言,Indent Object提供基于缩进级别的文本对象:ai包括当前缩进级别和上面的行; ii包括当前的缩进级别(不包括上一行)。

基于存在ar关键字,Ruby Block添加了对文本对象irend的支持。