Vim搜索:避免评论中的匹配

tyr*_*na4 7 python regex vim

使用vim搜索功能,是否可以避免在注释块/行上进行匹配.

作为一个例子,我想在这个python代码中匹配'image',但只在代码中匹配,而不是在注释中:

# Export the image
if export_images and i + j % 1000 == 0:
export_image(img_mask, "images/image{}.png".format(image_id))
image_id += 1
Run Code Online (Sandbox Code Playgroud)

使用正则表达式我会做这样的事情:/^[^#].*(image).*/gm 但它似乎不适用于vim.

Wik*_*żew 6

您可以使用

/^[^#].*\zsimage\ze
Run Code Online (Sandbox Code Playgroud)

\zs\ze分别发送信号指示比赛的起点和终点.

  • 设置匹配的开始和结束: \zs \ze

请注意,这与一行中的几个"图像"不匹配,只是最后一个.

另外,或许,"负面前瞻"会比开头的否定角色类更好:

/^#\@!.*\zsimage\ze
  ^^^^
Run Code Online (Sandbox Code Playgroud)

#\@!等于(?!#)在Python.

而且,因为查找的屁股是无固定宽度的Vim((?<=pattern)在Perl,但是Vim允许使用非固定宽度的模式),可以匹配的字符序列中出现的所有图像

/\(^#\@!.*\)\@<=image
Run Code Online (Sandbox Code Playgroud)

最后,在缩进的注释行中跳过匹配的图像,您只需要在行的开头匹配可选的(零个或多个)空白符号:

\(^\(\s*#\)\@!.*\)\@<=image
   ^^^^^^^^^^^   
Run Code Online (Sandbox Code Playgroud)

\(\s*#\)\@!相当于Python (?!\s*#)(匹配如果没有后跟零或更多的空格后跟a #).


mur*_*uru 5

此邮件列表帖子建议使用折叠:

要仅在打开的折叠中搜索(展开的文本):

:set fdo-=search
Run Code Online (Sandbox Code Playgroud)

要折叠#注释,请修改此Vi和Vim帖子(autocmd给出Python文件的位置):

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'
Run Code Online (Sandbox Code Playgroud)

但是,默认情况下折叠仅适用于多行.您需要启用折叠单行,才能排除单行注释:

set fml=0
Run Code Online (Sandbox Code Playgroud)

折叠一切后(zM因为我没有其他任何东西要折叠),搜索/image与评论中的任何内容都不匹配.