Python TextMate 2 中的文本折叠不折叠 lists/tuples/dictionaries

Python text-folding in TextMate 2 not folding lists/tuples/dictionaries

我有点落伍了,刚刚注意到 Textmate 2 的存在——我多年来一直在使用 1.5.10。

我正在尝试,Python 的代码折叠在某些方面得到了改进。 (在折叠 method/class 定义后,它不再吃掉一行空格)。但是,它不再折叠拆分为多行的列表、元组和字典。例如,下面的代码在 1.5.10 中有折叠箭头,但在 2.0.6 中没有:

foo = [
    1,
    2,
    3,
]

Python 包中的默认折叠设置为:

{   foldingStartMarker = '^\s*"""(?=.)(?!.*""")';
    foldingStopMarker = '^\s*"""\s*$';
}

默认折叠模式为:

{ foldingIndentedBlockStart = '^\s*(class|def|for|while|if|elif|else|with|try|finally|except)\b.*:\s*(#.*)?$'; }

我不完全确定这两者是如何协同工作的,尤其是因为我能找到的关于折叠定义的唯一文档是针对 TextMate 1.5 的,而且看起来已经过时了。我试过摆弄他们,到目前为止无济于事。有人有什么想法吗?

我弄清楚了正则表达式的工作原理。 foldingIndentBlockStart 负责大多数 Python 折叠,即所有基于缩进的内容。 foldingStartMarkerfoldingStopMarker 处理所有其他折叠,尽管捆绑包的默认模式仅折叠三引号文档字符串。

我写了一对模式来检查打开和关闭 {}()[],支持在同一行注释(以及后面的逗号,以防它是较长序列的一部分)。我用 | 将我的新模式添加到现有模式中,如下所示:

{   foldingStartMarker = '^\s*"""(?=.)(?!.*""")|(\{|\(|\[)\s*(#.*)?$';
    foldingStopMarker = '^\s*"""\s*$|^\s*(\}|\)|\]),?\s*(#.*)?$';
}

我可能遗漏了一些特殊情况,但到目前为止它似乎有效。