VSCode不会向语言服务器发出DidRameFiles通知



我目前正在我的语言服务器中实现用于文件操作的新事件,该事件已在LSP协议3.16版本中引入。我的服务器应该能够对didRename、didDelete等做出反应,但到目前为止,我无法从VSCode获得这些通知。

首先,在我的服务器的功能中,我列出了文件操作,告诉客户我对这些事件感兴趣:

"capabilities": {
...
"workspace": {
"fileOperations": {
"didDelete": {
"filters": [
{
"pattern": {
"glob": "**​/*.{rs,rd}"
}
}
]
},
"didRename": {
"filters": [
{
"pattern": {
"glob": "**​/*.{rs,rd}"
}
}
]
}
}
}
}

此外,在初始化完成后,服务器向客户端发送registerCapability请求,该请求由VSCode确认。我单独注册这些功能,因为在init消息中,VSCode表示应使用文件操作的dynamicRegistration。

{
"id": "register_caps",
"jsonrpc": "2.0",
"method": "client/registerCapability",
"params": {
"registrations": [
{
"id": "dhjas88-asdhjkahsd89as-dhas89",
"method": "workspace/didRenameFiles",
"registerOptions": {
"filters": [
{
"pattern": {
"glob": "**​/*.{rs,rd}"
}
}
]
}
},
{
"id": "dhjas88-asdhjkahsd89as-dhas90",
"method": "workspace/didDeleteFiles",
"registerOptions": {
"filters": [
{
"pattern": {
"glob": "**​/*.{rs,rd}"
}
}
]
}
}
]
}
}

确认:

{"jsonrpc":"2.0","id":"register_caps","result":null}

根据LSP的规范,我现在希望一旦在VSCode中重命名了与glob匹配的文件,VSCode就会发送例如didRrename通知。不幸的是,我从未收到它。通知不是由VSCode发送的。

有什么想法或线索,这里还缺少什么?我错过了协议的哪一部分,它阻止VSCode发送文件操作通知?

您能找到您的问题吗?

我也处于同样的情况,我发现了一些关于服务器通知的问题

  • VS Code允许在扩展中定义synchronize选项。如果设置了这些通知,则无法通过LSP注册某些通知。。。移除这些有帮助
  • 确保不要错过glob模式开头的**/,否则它们将不匹配
  • 如果已经静态注册,则无需动态注册didRename等,但如果您这样做了,请确保在收到initialized事件之后而不是之前发送注册
  • 我使用了多个模式——每个扩展一个——而不是大括号

我仍然不确定你到底做错了什么。。。

最新更新