Vim:如何在正则匹配后的一行开始语法折叠?(Python 函数)

4 投票
1 回答
722 浏览
提问于 2025-04-17 09:21

我想在使用Vim编辑器编写的Python代码中折叠函数定义。我在我的.vim/syntax/python.vim文件中添加了以下内容:

setlocal foldmethod=syntax
syn sync fromstart
syn region  pythonFunctionFostart="^\z(\s*\)\%(def\|class\) " skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

这样做是有效的;它还会把函数之间的空行也折叠起来(和foldmethod=indent不一样),这是我想要的。不过,我不想把“def function():”这一行也折叠起来。根据我对文档的理解,我可以这样做:

syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\) .*\n\zs." skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

但是这样会导致Vim根本不创建任何折叠。(我当然试过用普通搜索来找开始的正则表达式,它是有效的)。接下来这个也不行:

syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\) .*\n."ms=e skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

hs=e, rs=e也不行

我尝试的每一种方法,要么都包含了def这一行,要么根本不奏效。(我猜Vim不喜欢在我的语法正则表达式中使用换行符)。有没有什么简单的方法可以让语法折叠在正则表达式匹配的下一行开始?

编辑:我还尝试了以下内容:

syn match pythonFunctionFold "^\(\s*\)\%(def\|class\) .*\n\zs\(\s*\n\|\1\s\+.*\n\)\+" fold transparent

当我使用“/”搜索这个模式时,它正好匹配我想要折叠的区域,而“:help syntax”声称支持多行匹配。但我仍然没有得到任何折叠。

1 个回答

1

我担心这可能不太可能实现。在 syntax.txt 文件中,关于 :syn-multi-line 的部分提到:

当使用带有偏移量的起始模式时,匹配的开始位置不能在下一行开始。不过,突出显示可以在下一行开始。使用 "\zs" 这个项时,也要求匹配的开始位置不能移动到另一行。

撰写回答