VSCode:扩展:基于找到的第一个空白行或下一个类似部分的开头的折叠部分



如何根据起始折叠标记后的第一个空行制定 VSCode 扩展折叠策略?

## Some section   --|
Any text...         |  (this should fold)
...more text.     --|
                       (blank line)
## Another section     (next fold...)

我已经在language-configuration.json中尝试了很多正则表达式。

    "folding": {
        "markers": {
            "start": "^##",
            "end": "^\s*$"
    } },

如果我更改内容以使用空白(或空格(行以外的内容作为结束分隔符进行测试,它可以工作。不能使用下一个开始标记来标记最后一个开始标记的结束,或者它包含在折叠中(我尝试向前看正则表达式,但我认为正则表达式是逐行应用的,匹配不能跨行?

它类似于 Markdown 所需的折叠,VSCode 处理得很好(不知道这是否使用了更复杂的方法,如 https://code.visualstudio.com/api/references/vscode-api#FoldingRangeProvider(。

也许 [折叠] 修复中的某些内容不应该在函数与之相关后折叠空格。

我学到了什么:1.beginend正则表达式是逐行应用的。2. tmLanguage 开始/结束正则表达式将适用于空行,但目前语言配置折叠似乎不适用于空行。

由于在这种情况下,空白行是在下一个开始部分结束的黑客:

为了解决将一个部分折叠到下一个类似部分的问题,我使用了FoldingRangeProvider。

    disposable = vscode.languages.registerFoldingRangeProvider('myExt', {
        provideFoldingRanges(document, context, token) {
            //console.log('folding range invoked'); // comes here on every character edit
            let sectionStart = 0, FR = [], re = /^## /;  // regex to detect start of region
            for (let i = 0; i < document.lineCount; i++) {
                if (re.test(document.lineAt(i).text)) {
                    if (sectionStart > 0) {
                        FR.push(new vscode.FoldingRange(sectionStart, i - 1, vscode.FoldingRangeKind.Region));
                    }
                    sectionStart = i;
                }
            }
            if (sectionStart > 0) { FR.push(new vscode.FoldingRange(sectionStart, document.lineCount - 1, vscode.FoldingRangeKind.Region)); }
            return FR;
        }
    });

设置"editor.foldingStrategy": "auto" .您可以使其更加复杂,以保留部分之间的空白。

最新更新