如何对语言服务器中的文件系统事件做出反应



我正在为 VS Code 的自定义语言编写语言服务器协议扩展。我正在使用OmniSharp语言服务器API用C#编写服务器部分。

我在实现 DidChangeWatchedFile 功能时遇到问题。即使我实现了IDidChangeWatchedFilesHandler接口,也不会从客户端或服务器发送通知。

根据规范,应该有一个DidChangeWatchedFilesRegistrationOptions接口,可以在其中注册自定义文件事件,但我在OmniSharp的任何地方都找不到这个接口。我希望能够对在工作区中更改/添加/删除特定文件并且文件未在编辑器中打开的情况做出反应(因此不由DidChangeTextDocument处理程序处理(。

任何提示/建议将非常受欢迎。

谢谢!

我只需要自己弄清楚这一点!这来自两个地方,假设您有一个扩展主机和语言服务器:

  1. 在扩展主机 (extension.ts( 中,需要创建语言客户端选项并设置synchronize属性。下面是一个直接来自 vscode 扩展示例的示例:

    https://github.com/microsoft/vscode-extension-samples/blob/master/lsp-sample/client/src/extension.ts#L39-L46

  2. 在您的服务器(server.ts(中,只需为onDidChangeWatchedFiles添加一个回调,该回调也来自扩展示例:

    https://github.com/microsoft/vscode-extension-samples/blob/master/lsp-sample/server/src/server.ts#L173-L176

如果添加或删除文件系统观察程序捕获的文件,则应看到弹出的事件。

唯一值得注意的另一件事是,您会收到一系列更改,并且必须处理每个更改。以下是我如何处理我的扩展。

import { FileChangeType } from 'vscode-languageserver';
connection.onDidChangeWatchedFiles(async _change => {
// Monitored files have change in VSCode
connection.console.log('We received an file change event');
// process each change
for (let i = 0; i < _change.changes.length; i++) {
const change = _change.changes[i];
switch (change.type) {
case FileChangeType.Created:
await idl.addDocumentSymbols(change.uri);
break;
case FileChangeType.Deleted:
await idl.removeDocumentSymbols(change.uri);
break;
case FileChangeType.Changed:
await idl.updateDocumentSymbols(change.uri);
break;
default:
// do nothing
break;
}
}
// detect and send problems
idl.detectProblems(true);
});

最新更新