将操作限制为一段代码


10

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

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

举个例子:

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

这段代码是一个相对较差的示例,但是,如果我需要替换$ color的所有实例,那么如何在函数PickColor的上下文中执行此操作。再举一个例子,使用#*你可以去反对整个文件文本对象的下一个实例,你会如何限制了搜索只是这个功能(基本包搜索),其范围可以跨越成千上万行和输球您的位置,还是错误地替换了您不应该使用的其他功能?

Answers:


15

这里有几种方法。

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行)上进行。

相对线范围

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

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

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

视觉选择范围

进入1号线,然后按Shift+V然后G。这从视觉上选择了第1行。然后...

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

这会将替换限制在您选择的范围内。'<,'>当您按下:活动选项时,Vim会自动为您插入范围。


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

6

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

您可以从视觉上选择一个块,然后运行:NR命令,该命令将使用所选文本打开一个新缓冲区(拆分后)。您可以对该缓冲区进行修改,然后将其保存到该缓冲区中,同时也将其保存回原始文件中。

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


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


0

使用大括号文本对象'}',并在括号内选择'i}'

在函数的左花括号处:

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

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

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

  • 对于Python和CoffeeScript之类的语言,Indent Object提供基于缩进级别的文本对象:ai包括当前的缩进级别和上面的行;ii包括当前缩进级别(不包括上面的行)。
  • 红宝石座增加了对文本对象arir的基础上,存在end关键字。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.