Как получить весь текст документа в onDidChangeTextDocument при реализации vscode Language Server?

Я хочу анализировать файл всегда, когда пользователь его меняет, поэтому я реализую метод onDidChangeTextDocument из connection.

Но это событие просто дает мне URI и изменения содержимого. Как я могу получить весь документ?

Обзор: я также пытался реализовать onDidChangeContent из documents, но он так и не был вызван.


person thur    schedule 17.09.2016    source источник


Ответы (2)


Документ находится в событии, переданном в onDidChangeTextDocument. Вот как я с этим справляюсь:

var changeTimeout;
vscode.workspace.onDidChangeTextDocument(function (event) {
    if (changeTimeout != null)
        clearTimeout(changeTimeout);
    changeTimeout = setInterval(function () {
        clearTimeout(changeTimeout);
        changeTimeout = null;
        backend.reparse(event.document.fileName, event.document.getText());
        processDiagnostic(event.document);
    }, 500);
});

Это то, что MS пишет в документации:

// The content of a text document has changed. This event is emitted
// when the text document first opened or when its content has changed.
documents.onDidChangeContent((change) => {
    let diagnostics: Diagnostic[] = [];
    let lines = change.document.getText().split(/\r?\n/g);
    lines.forEach((line, i) => {
        let index = line.indexOf('typescript');
        if (index >= 0) {
            diagnostics.push({
                severity: DiagnosticSeverity.Warning,
                range: {
                    start: { line: i, character: index},
                    end: { line: i, character: index + 10 }
                },
                message: `${line.substr(index, 10)} should be spelled TypeScript`,
                source: 'ex'
            });
        }
    })
    // Send the computed diagnostics to VS Code.
    connection.sendDiagnostics({ uri: change.document.uri, diagnostics });
});

поэтому документ (и, следовательно, текст) должен быть доступен в событии.

person Mike Lischke    schedule 17.09.2016
comment
Вы делаете это на языковом сервере или в расширении клиента? - person thur; 17.09.2016
comment
Ах, простите, да, это клиентское расширение, а не языковой сервер. Там по-другому? - person Mike Lischke; 17.09.2016
comment
Я так думаю, потому что я не получил этот event.document... просто params.contentChanges, который является массивом... но я обнаружил, что этот массив возвращает мне весь файл, но я не уверен, что это правильно способ сделать это. - person thur; 17.09.2016
comment
Но эта документация относится к onDidChangeContent, в моем случае, когда я описываю, это событие никогда не вызывается... Поэтому я использую onDidChangeTextDocument, у которого нет того же самого change.document - person thur; 17.09.2016
comment
Тогда мой ответ не подходит, и вы должны попытаться выяснить, почему вы не получаете событие изменения. Однако я сохраню его, на случай, если кто-то ищет подобную информацию. - person Mike Lischke; 17.09.2016

Обс.: я также пытался реализовать onDidChangeContent из документов, но он так и не был вызван.

Мне интересно, почему onDidChangeContent перестает вызываться при использовании любого из них: onDidChangeTextDocument, onDidOpenTextDocument, onDidCloseTextDocument. Кажется, мы можем использовать только один способ или другой.

Итак, то, что вы ищете, это:

documents.onDidChangeContent(change => {
  connection.console.log(change.document.getText())
})

Все change.document участники: uri,languageId,version,getText,update,getLineOffsets,positionAt,offsetAt,lineCount

person Theadd    schedule 14.11.2016