gpt4 book ai didi

visual-studio-code - 如何对语言服务器中的文件系统事件使用react

转载 作者:行者123 更新时间:2023-12-05 05:06:57 24 4
gpt4 key购买 nike

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

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

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

我们非常欢迎任何提示/建议。

谢谢!

最佳答案

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

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

关于visual-studio-code - 如何对语言服务器中的文件系统事件使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59530010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com