vscode plug-in fast food tutorial (8) - LSP text synchronizing

vscode plug-in fast food tutorial (8) - LSP text synchronizing

In this section we begin the introduction to the text synchronizing method by LSP.

File Open

We start with a simple start, the first to listen to open the file.
We look at the LSP protocol support for this part of the argument is DidChangeTextDocumentParams structure.
LSP_

Microsoft's SDK on the basis of the LSP is done on the package, we look at the interface after the package:
_API

Current, TextDocument provides four attributes:

  • uri: Bunken specific URI
  • version: the version number of the file
  • languageId: Programming Language
  • lineCount: How many rows are
    in addition to three functions:
  • getText (): Get the text
  • positionAt and offsetAt for conversion and offset Position

Let's look at an example:

documents.onDidOpen(
    (event: TextDocumentChangeEvent) => {
        logger.debug(`on open:${event.document.uri}`);
        logger.debug(`file version:${event.document.version}`);
        logger.debug(`file content:${event.document.getText()}`);
        logger.debug(`language id:${event.document.languageId}`);
        logger.debug(`line count:${event.document.lineCount}`);
    }
);

Let's look at a running example:

[2019-06-04T18:11:31.999] [DEBUG] lsp_demo - on open:file:///Users/ziyingliuziying/test.vb
[2019-06-04T18:11:31.999] [DEBUG] lsp_demo - file version:1
[2019-06-04T18:11:31.999] [DEBUG] lsp_demo - file content:dim a as integer;
TextView1
Javascript
Button3
Test2

[2019-06-04T18:11:31.999] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:11:32.000] [DEBUG] lsp_demo - line count:6

Monitor file changes

Listener listening to open the file with the file changes are substantially identical, as follows:

documents.onDidChangeContent(
    (e: TextDocumentChangeEvent) => {
        logger.debug('document change received.');
        logger.debug(`document version:${e.document.version}`);
        logger.debug(`text:${e.document.getText()}`);
        logger.debug(`language id:${e.document.languageId}`);
        logger.debug(`line count:${e.document.lineCount}`);
    }
);
[2019-06-04T18:30:34.329] [DEBUG] lsp_demo - document change received.
[2019-06-04T18:30:34.329] [DEBUG] lsp_demo - document version:1
[2019-06-04T18:30:34.329] [DEBUG] lsp_demo - text:dim a as integer;
TextView1
Javascript
Button3
Test2

[2019-06-04T18:30:34.329] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:30:34.329] [DEBUG] lsp_demo - line count:6

[2019-06-04T18:30:39.457] [DEBUG] lsp_demo - document change received.
[2019-06-04T18:30:39.457] [DEBUG] lsp_demo - document version:2
[2019-06-04T18:30:39.457] [DEBUG] lsp_demo - text:

[2019-06-04T18:30:39.457] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:30:39.458] [DEBUG] lsp_demo - line count:2

[2019-06-04T18:30:41.576] [DEBUG] lsp_demo - document change received.
[2019-06-04T18:30:41.576] [DEBUG] lsp_demo - document version:3
[2019-06-04T18:30:41.577] [DEBUG] lsp_demo - text:b
[2019-06-04T18:30:41.577] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:30:41.577] [DEBUG] lsp_demo - line count:1

[2019-06-04T18:30:41.949] [DEBUG] lsp_demo - document change received.
[2019-06-04T18:30:41.949] [DEBUG] lsp_demo - document version:4
[2019-06-04T18:30:41.949] [DEBUG] lsp_demo - text:u
[2019-06-04T18:30:41.949] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:30:41.949] [DEBUG] lsp_demo - line count:1

[2019-06-04T18:30:42.447] [DEBUG] lsp_demo - document change received.
[2019-06-04T18:30:42.447] [DEBUG] lsp_demo - document version:5
[2019-06-04T18:30:42.447] [DEBUG] lsp_demo - text:Button5
[2019-06-04T18:30:42.447] [DEBUG] lsp_demo - language id:vb
[2019-06-04T18:30:42.447] [DEBUG] lsp_demo - line count:1

Text listening mode

The above embodiment is an incremental listener listening, using TextDocumentSyncKind.Incremental mode, as follows:

connection.onInitialize((params: InitializeParams) => {
    return {
        capabilities: {
            textDocumentSync: {
                openClose: true,
                change: TextDocumentSyncKind.Incremental
            },
            completionProvider: {
                resolveProvider: true
            }
        }
    };
});

Incremental mode is a time varying transmission part.
Here we can see the difference between its pass mode full amount of:

connection.onInitialize((params: InitializeParams) => {
    return {
        capabilities: {
            textDocumentSync: {
                openClose: true,
                change: TextDocumentSyncKind.Full
            },
            completionProvider: {
                resolveProvider: true
            }
        }
    };
});

Full amount mode, each time the full amount after the change will be passed over by the news, we look at an example:

[2019-06-04T19:52:12.305] [DEBUG] lsp_demo - document change received.
[2019-06-04T19:52:12.305] [DEBUG] lsp_demo - document version:1
[2019-06-04T19:52:12.305] [DEBUG] lsp_demo - text:dim a as integer;
TextView1
Javascript
Button3
Test2
Button5

[2019-06-04T19:52:12.305] [DEBUG] lsp_demo - language id:vb
[2019-06-04T19:52:12.305] [DEBUG] lsp_demo - line count:7
[2019-06-04T19:52:19.442] [DEBUG] lsp_demo - document change received.
[2019-06-04T19:52:19.442] [DEBUG] lsp_demo - document version:2
[2019-06-04T19:52:19.442] [DEBUG] lsp_demo - text:dim a as integer;
TextView1
Javascript
Button3
Test2
Button5
T
[2019-06-04T19:52:19.443] [DEBUG] lsp_demo - language id:vb
[2019-06-04T19:52:19.443] [DEBUG] lsp_demo - line count:7
[2019-06-04T19:52:19.443] [DEBUG] lsp_demo - onCompletion
[2019-06-04T19:52:19.787] [DEBUG] lsp_demo - document change received.
[2019-06-04T19:52:19.787] [DEBUG] lsp_demo - document version:5
[2019-06-04T19:52:19.787] [DEBUG] lsp_demo - text:dim a as integer;
TextView1
Javascript
Button3
Test2
Button5
Test
[2019-06-04T19:52:19.787] [DEBUG] lsp_demo - language id:vb
[2019-06-04T19:52:19.787] [DEBUG] lsp_demo - line count:7
[2019-06-04T19:52:19.788] [DEBUG] lsp_demo - onCompletion
[2019-06-04T19:52:21.877] [DEBUG] lsp_demo - document change received.
[2019-06-04T19:52:21.877] [DEBUG] lsp_demo - document version:6
[2019-06-04T19:52:21.877] [DEBUG] lsp_demo - text:dim a as integer;
TextView1
Javascript
Button3
Test2
Button5
Test

[2019-06-04T19:52:21.877] [DEBUG] lsp_demo - language id:vb
[2019-06-04T19:52:21.877] [DEBUG] lsp_demo - line count:8

You can also choose TextDocumentSyncKind.None mode, this time out of sync text messages.

Guess you like

Origin yq.aliyun.com/articles/704740