1

我正在尝试将 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。

4

1 回答 1

0

我终于想通了。我的元素之一是超出了“结束”的论点。我不得不在我的 syn 区域中使用“keeppend”参数。

这条线修复了一切:

syn region fountainScene start="^\s*\(\.\|INT\. \|EXT\. \|INT\./EXT\. \|INT/EXT\. \|INT \|EXT \|INT/EXT \|I/E \|int\. \|ext\. \|int\./ext\. \|int/ext\. \|int \|ext \|int/ext \|i/e \)" end="^\(\(\L\)* TO:\|\s*>[^<]*\)$" fold transparent keepend

有关更多详细信息,请参阅:he keepend

于 2013-02-26T23:06:47.877 回答