如何根据起始折叠标记后的第一个空行制定 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.begin
和end
正则表达式是逐行应用的。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"
.您可以使其更加复杂,以保留部分之间的空白。