首页 > 解决方案 > vscode中如何强制更新code lens

问题描述

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

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

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

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

标签: visual-studio-codevscode-extensionslanguage-server-protocol

解决方案


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

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


推荐阅读