2016-09-17 1 views
0

Ich möchte eine Datei immer parsen, dass der Benutzer es ändern, also implementiere ich die onDidChangeTextDocument Methode von connection.Wie erhält man den Text des Textdokuments im Ereignis onDidChangeTextDocument auf vscode Language Server-Implementierung?

Aber dieses Ereignis gibt mir nur die URI und der Inhalt ändert sich. Wie kann ich das Dokument erhalten?

Obs .: Ich habe auch versucht die onDidChangeContent von documents zu implementieren, aber es wurde nie genannt.

Antwort

0

Das Dokument wird an onDidChangeTextDocument übergeben. Dies ist, wie ich damit umgehen:

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); 
}); 

Dies ist, was MS writes in the documentation:

// 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 }); 
}); 

so das Dokument (und damit der Text) sollen in der Veranstaltung zur Verfügung.

+0

Sie tun dies in einer Sprache-Server oder in der Client-Erweiterung? – thur

+0

Ah, tut mir leid, ja, das ist eine Client-Erweiterung, kein Sprachserver. Ist es anders dort? –

+0

Ich denke schon, weil ich dieses Event.document nicht erhalten habe .. nur ein params.contentChanges das ist ein Array .. aber ich finde, dass dieses Array mir die Eniry-Datei zurückgibt, aber ich bin mir nicht sicher, ob das das ist richtige Weise, das zu tun. – thur

0

Obs .: Ich habe auch versucht, den onDidChangeContent aus Dokumenten zu implementieren, aber es wurde nie aufgerufen.

Was ich frage mich, weshalb onDidChangeContent Anschläge genannt wird, wenn irgendwelche von denen mit: onDidChangeTextDocument, onDidOpenTextDocument, onDidCloseTextDocument. Es scheint, wir können nur auf die eine oder andere Weise arbeiten.

Also, was Sie suchen, ist dies:

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

Alle change.document Mitglieder: uri,languageId,version,getText,update,getLineOffsets,positionAt,offsetAt,lineCount

Verwandte Themen