eglot 可以补全,但是code-actions 都报错。

各位大佬: 在使用eglot客户端版本号:eglot-20221020.1010,lsp server版本号jdt-language-server-1.18.0-202212011657,lsp server通过本地bat脚本启动。 代码提示可以正常使用,但是执行code-actions时报错,具体日志如下,大神帮看看,或者给个排查思路,谢谢

[eglot] Connected! Server EGLOT (Test/(java-mode))' now managing (java-mode)’ buffers in project `Test’.

[eglot] (warning) Server tried to register unsupported capability `workspace/didChangeWorkspaceFolders’

jsonrpc-error: “request id=11 failed:”, (jsonrpc-error-code . -32601), (jsonrpc-error-message . “No delegateCommandHandler for java.apply.workspaceEdit”), (jsonrpc-error-data)

jsonrpc-error: “request id=16 failed:”, (jsonrpc-error-code . -32601), (jsonrpc-error-message . “No delegateCommandHandler for java.apply.workspaceEdit”), (jsonrpc-error-data)

看起来是 eglot 没有实现 java.apply.workspaceEdit 这个操作

java.apply.workspaceEdit is not related to delegateCommandHandlers actually (those are server side extensions). It’s a command that needs to be implemented by clients. See how it’s done in vscode-java:

Basically, the server sends workspace edits to the client, and the client is responsible for applying them.

感谢回复,这个帖子我也看到了。从回复看,需要通过扩展实现,但是查阅了eglot的文档,没看到有类似的扩展。

翻了eglot issue ,找到作者建议的方案。

(cl-defmethod eglot-execute-command (_server (_cmd (eql java.apply.workspaceEdit)) arguments) “Eclipse JDT breaks spec and replies with edits as arguments.” (mapc #'eglot–apply-workspace-edit arguments))

原问题地址:

直接复制这段代码么,我看并没有解决这个 warning,而且示例代码写成了 cll-defmethod

我看你在这里 Fix code actions on Eclipse JDT Language server 留言了,这个是我验证的结果,master分支,不需要那个补丁了,原因是 Eglot 实现了:codeAction/resolve,之前执行命令的代码重写了。

而且master分支里eglot-execute-command命令已经废弃了。

(cl-defgeneric eglot-execute-command (_ _ _)
  (declare (obsolete eglot-execute "30.1"))
  (:method
   (server command arguments)
   (eglot--request server :workspace/executeCommand
                   `(:command ,(format "%s" command) :arguments ,arguments))))

我本地操作:


  1. codeAction 实现方法

感谢回复,那么你用的什么 debug 呢,或者说你的 java 开发在 emacs 里的工作流是什么样子的啊,目前正在从 idea 我迁移到 emacs。