VSCode: Extension: сворачивание раздела на основе первой найденной пустой строки или до начала следующего аналогичного раздела - PullRequest
0 голосов
/ 08 июня 2019

Как я могу создать стратегию свертывания расширений 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).

Возможно, что-то исправлено в [fold] не должен складывать пробелы после того, как функция имеет к ней какое-то отношение.

1 Ответ

0 голосов
/ 24 июня 2019

Что я узнал: 1. Регулярные выражения begin и end применяются построчно. 2. Регулярное выражение tmLanguage start / end будет работать на пустых строках, но в настоящее время свертывание языковой конфигурации не работает на пустых строках.

И так как пустые строки в этом случае являются хаком для окончания в следующем разделе начала:

Чтобы решить проблему сворачивания раздела в следующий аналогичный раздел, я использовал 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;
        }
    });

Set "editor.foldingStrategy": "auto". Вы можете сделать его более сложным, чтобы сохранить пустое пространство между разделами.

...