我正在尝试将 vim 折叠到现有的喷泉.io 标记语言的语法文件中。现有的语法文件在这里:http ://www.vim.org/scripts/script.php?script_id=3880
但无论我做什么,我的折叠区域都不会在我期望的地方结束。当我在搜索中测试它们时,正则表达式工作得很好。但是当在语法区域中使用时,它们会创建一系列嵌套折叠。折叠从适当的行开始,然后在现有折叠内创建下一个折叠。本质上,我尝试执行以下操作,以便折叠从任何以 INT 或 EXT 开头的行开始,并在一行以 TO: 结尾或以 > 开头的行结束后结束:
syn region fountainScene start="^\(INT\|EXT\)" end="^\(\(\L\)* TO:\|\s*>\(.*\)\)$" fold transparent contains=fountainCharacter,fountainDialogue,fountainParenthetical,fountainSceneHeading,fountainTransition
更奇怪的是,如果我在我的 'end' 参数上使用 \ze 来获取匹配行之前的行,它会按您的预期工作。它在匹配上方的线上停止折叠,将最后一行留在折叠之外。以下内容将停止折叠到“CUT TO:”行上方
\n\ze\(\L\)* TO:\n
为了排除故障,我基本上是从头开始重建语法文件。这是到目前为止文件中的内容(减去 hi 命令)我已经广泛修改了正则表达式以防止它们相互重叠。原来的正则表达式有这个问题,我认为这可能是原因:
syn match fountainCharacter "^\(\s\)*\n\zs\(INT\|EXT\)\@!\(\L\)*[^:]$"
syn region fountainDialogue matchgroup=fountainCharacter start="^\(\s\)*\n\zs\(INT\|EXT\)\@!\(\L\)*[^:]$" end="^\s*$" contains=fountainCharacter,fountainParenthetical
syn match fountainParenthetical "^\s*\((.*)\)$"
syn region fountainSceneHeading start="^\(INT\|EXT\)" end="$" contains=fountainSceneNumber,fountainBoneyard,fountainNotes
syn match fountainTransition "^\(\L\)* TO:$"
syn region fountainScene start="^\(INT\|EXT\)" end="\n\ze\(\L\)* TO:\n" fold transparent contains=fountainCharacter,fountainDialogue,fountainParenthetical,fountainSceneHeading
感谢您提供的任何帮助,如果我有任何不清楚的地方,请告诉我。我正在使用带有 python 支持的自定义编译的 MacVim 版本 7.3.646。