eglot-connect-hook and eglot-server-initialized-hook must run in a
buffer with properly setup directory-local variables for the project.
This is crucial for things like eglot-signal-didChangeConfiguration,
which needs a properly setup value of eglot-workspace-configuration to
succeed.
I could have chosen any of the buffers where Eglot is activating
itself, but the approach using
hack-dir-local-variables-non-file-buffer seems more correct, despite
the name.
* eglot.el (eglot--connect): Run connection hooks with proper
dir-locals.
GitHub-reference: fix https://github.com/joaotavora/eglot/issues/196
(lambda ()
(setf (eglot--inhibit-autoreconnect server)
(null eglot-autoreconnect)))))))
- (run-hook-with-args 'eglot-connect-hook server)
- (run-hook-with-args 'eglot-server-initialized-hook server)
+ (let ((default-directory (car (project-roots project)))
+ (major-mode managed-major-mode))
+ (hack-dir-local-variables-non-file-buffer)
+ (run-hook-with-args 'eglot-connect-hook server)
+ (run-hook-with-args 'eglot-server-initialized-hook server))
(eglot--message
"Connected! Server `%s' now managing `%s' buffers \
in project `%s'."