vscode插件快餐教程(8) - LSP文本同步
這一節(jié)開始我們介紹下通過LSP進(jìn)行文本同步的方法。
文件打開
我們先從簡單的做起比驻,先監(jiān)聽文件的打開。
我們看一下LSP協(xié)議中對此部分的支持邓梅,參數(shù)是DidChangeTextDocumentParams結(jié)構(gòu)蚀之。
微軟的SDK在LSP的基礎(chǔ)上是做了封裝的,我們看下封裝后的接口:
當(dāng)前翅睛,TextDocument提供了4個屬性:
- uri: 文件的URI
- version: 文件的版本號
- languageId: 編程語言
- lineCount: 有多少行
另外還有3個函數(shù): - getText(): 獲取文本
- positionAt和offsetAt用于Position和offset的轉(zhuǎn)換
我們來看個例子:
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}`);
}
);
我們來看一個運(yùn)行的例子:
[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
監(jiān)聽文件變化
監(jiān)聽文件變化與監(jiān)聽打開文件基本上是一模一樣的声搁,代碼如下:
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
文本監(jiān)聽模式
上面的監(jiān)聽方式是增量監(jiān)聽黑竞,使用TextDocumentSyncKind.Incremental模式,代碼如下:
connection.onInitialize((params: InitializeParams) => {
return {
capabilities: {
textDocumentSync: {
openClose: true,
change: TextDocumentSyncKind.Incremental
},
completionProvider: {
resolveProvider: true
}
}
};
});
增量模式是每次只傳變化的部分疏旨。
下面我們可以看看傳全量模式與其的區(qū)別:
connection.onInitialize((params: InitializeParams) => {
return {
capabilities: {
textDocumentSync: {
openClose: true,
change: TextDocumentSyncKind.Full
},
completionProvider: {
resolveProvider: true
}
}
};
});
全量模式下很魂,每次變化后的全量都會通過消息傳遞過來,我們看個例子:
[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
還可以選擇TextDocumentSyncKind.None模式充石,這時候不同步文本信息莫换。