vim语法折叠(无意中)创建嵌套折叠

时间:2013-02-26 02:20:30

标签: regex vim folding vim-syntax-highlighting

我正在尝试将vim折叠实现为fountain.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

感谢您提供的任何帮助,如果我不清楚,请告诉我。我正在使用MacVim版本7.3.646自定义编译与python支持。

1 个答案:

答案 0 :(得分:0)

我终于弄明白了。我的一个要素是超越“结束”论点。我不得不在我的syn区域使用“keepend”参数。

这一行解决了所有问题:

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