3

我正在使用Metals(Scala 语言服务器)中的代码镜头进行“运行代码”操作。在我们的用例中,我们只能在编译完成后提供这些代码镜头。如果用户在编译过程中或编译后没有修改源文件,vscode 不会发送代码镜头请求。这可能会导致编译前出现“陈旧代码镜头”的丑陋状态。

深入了解 vscode-languageserver-node 的内部结构,我注意到 CodeLensProvider 可以发出 onDidChangeCodeLenses 事件,但它并未反映在 LSP 中(https://github.com/microsoft/language-server-protocol/issues/192) ,因此我无法将此事件发送到 vscode。

可能会强制重新加载代码镜头的另一件事是 ICodeEditor::setModel 方法,但我不确定这是否可以直接从 vscode 扩展中完成,因为我无法获得对代码编辑器的引用。

如何通过语言服务器或 vscode 扩展来完成这项工作?还是有另一种首选方式?

4

2 回答 2

1

不幸的是,语言服务器协议确实还不支持这一点。我刚才打开的相应功能请求可以在这里找到。

我能够通过在扩展端为相同的语言 ID实现一个虚拟CodeLensProvider对象来解决这个问题(VSCode API 通常允许为语言功能注册多个提供程序)。它只是在必要时调用事件,实际实现仍然在语言服务器端。onDidChangeCodeLenses

于 2019-08-13T20:28:01.530 回答
0

两年后,看起来仍然没有实施。

我设法通过处理 codelens 提供程序并立即在我的命令(由 Codelens 运行)中再次注册它来解决这个问题。

// NOTE: this is a hack to force the codelens to update
codelensDisposable.dispose();
codelensDisposable = vscode.languages.registerCodeLensProvider('*', codelensProvider);

编辑:我刚刚发现这似乎破坏了 GitLens 扩展,当我的扩展也在运行时,Codelens 操作也丢失了......

于 2021-09-14T10:06:12.640 回答