使用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.
您可以使用
/^[^#].*\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 #).
要仅在打开的折叠中搜索(展开的文本):
Run Code Online (Sandbox Code Playgroud):set fdo-=search
要折叠#注释,请修改此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与评论中的任何内容都不匹配.