VSCode:扩展:根据找到的第一个空白行或下一个相似部分的开头折叠部分

时间:2019-06-08 19:13:11

标签: visual-studio-code vscode-extensions folding blank-line

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

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

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

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

如果我更改测试内容而不使用空白(或空格)行作为结束定界符,那么它将起作用。无法使用下一个开始标记来标记最后一个的结束或将其包括在折叠中(我尝试过正则表达式,但是我认为正则表达式是逐行应用的,并且匹配项不能跨行吗?)< / p>

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

也许[folding] should not fold white space after function的修复程序中有某些问题。

1 个答案:

答案 0 :(得分:0)

我学到的知识: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"。您可以使其更加复杂,以保留节之间的空白。