使用vim搜索功能,是否可以避免在注释块/行上进行匹配。
作为一个例子,我想匹配' image'在这个python代码中,但只在代码中,而不是在注释中:
# Export the image
if export_images and i + j % 1000 == 0:
export_image(img_mask, "images/image{}.png".format(image_id))
image_id += 1
使用正则表达式我会这样做:/^[^#].*(image).*/gm
但它似乎不适用于vim。
答案 0 :(得分:6)
您可以使用
/^[^#].*\zsimage\ze
\zs
and \ze
分别表示匹配的开始和结束。
- 设置匹配的开始和结束:
\zs \ze
请注意,这不会匹配一行中的几个“图像”,只是最后一个。
另外,或许,一个“消极的向前看”会比一开始时被否定的角色类更好:
/^#\@!.*\zsimage\ze
^^^^
#\@!
等于Python中的(?!#)
。
并且因为后视在Vim中是非固定宽度(like (?<=pattern)
in Perl, but Vim allows non-fixed-width patterns),所以您可以将所有出现的字符序列 image 与< / p>
/\(^#\@!.*\)\@<=image
最后在缩进的注释行上跳过匹配图片,您只需要匹配可选(零个或多个)空白符号( s)在行的开头:
\(^\(\s*#\)\@!.*\)\@<=image
^^^^^^^^^^^
此\(\s*#\)\@!
相当于Python (?!\s*#)
(匹配后如果没有后跟零或更多的空格,后跟#
)。
答案 1 :(得分:5)
This mailing list post建议使用folds:
仅在打开的折叠(展开的文字)中搜索:
:set fdo-=search
要折叠#
条评论,请调整this Vi and Vim post(其中给出了autocmd
的Python文件):
set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'
但是,默认情况下折叠仅适用于多行。您需要enable folding of a single line,才能排除单行注释:
set fml=0
折叠完所有内容后zM
,因为我没有其他任何内容需要折叠),搜索/image
与评论中的任何内容都不匹配。
答案 2 :(得分:0)
一种更通用的忽略行尾注释标记内的匹配的方法(这不能解决避免使用文字字符串定界符的更复杂的情况,如果需要,可以通过一种简单的情况来实现):
/\v%(^.{-}\/\/.{-})@<!<%(this|that|self|other)>
位置:
/
是用于执行搜索的 ex 命令(如果将正则表达式用作另一个命令或vimscript表达式的一部分,则删除。)\v
强制为此正则表达式使用"very magic"。\/\/
是行尾注释标记(已转义,因此/
字符不会被vim解释为正则表达式的结尾)。上面的示例适用于C / C ++,JavaScript,Node.JS等。(^.{-}\/\/.{-})@<!
是zero-width表达式,表示“此之后的表达式开头之前不应有任何注释”(请参阅vim's documentation for \@<!
)。在我们的例子中,该表达式只是试图在行中的任意点(因此^.{-}
)找到行尾注释令牌,并确保零-width 匹配可以终止于该表达式之后的正则表达式的第一个字符(由带括号的表达式末尾的.{-}
实现)。<%(this|that|self|other)>
可以用任何正则表达式替换。在这种情况下,这表明您可以在此时匹配任意表达式,而不必担心注释(由该注释之前的 zero-width 表达式处理)。作为示例,请考虑以下代码:
some.this = 'hello'
some.this = 'hello' + this.someother;
some.this = 'hello' + this.someother; // this is a comment, and this is another
上面的表达式将匹配所有this
个单词,但注释内的单词(或与此相关的任何其他//
前缀的注释除外)。
(注意:所有指向vim-7.0
reference documentation的链接,在撰写本文时,这些链接也应该(并且在我自己的测试中也是如此)在最新的vim和nvim版本中也有效)