【问题标题】:How to react to file-system events in the language server如何对语言服务器中的文件系统事件做出反应
【发布时间】:2019-12-30 11:23:41
【问题描述】:

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

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

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

欢迎任何提示/建议。

谢谢!

【问题讨论】:

    标签: visual-studio-code filesystemwatcher omnisharp language-server-protocol


    【解决方案1】:

    我只需要自己解决这个问题!这来自两个地方,假设您有一个扩展主机和语言服务器:

    1. 在您的扩展主机 (extension.ts) 中,您需要创建 LanguageClientOptions 并设置 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);
    });
    

    【讨论】:

    • 为我节省了很多时间!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多