Eglot: beware activation in fundamental-mode
In the specific situation of visiting a buffer via M-. with eglot-extend-to-xref set to t, it was found that buffer was first visited in fundamental mode, running after-change-major-mode-hook, and then again in the proper major mode for the file. The call to eglot-current-server of the first visit returned non-nil which cause two didOpen notifications to be issued for the same file. Furthermore, in the first call, eglot--languageId to returned nil, prompting an error from servers such as rust-analyzer. See also: https://github.com/joaotavora/eglot/discussions/1330 * lisp/progmodes/eglot.el (eglot-current-server): Watch out for fundamental-mode.
This commit is contained in:
@@ -2034,13 +2034,15 @@ Use `eglot-managed-p' to determine if current buffer is managed.")
|
||||
"Return logical Eglot server for current buffer, nil if none."
|
||||
(setq eglot--cached-server
|
||||
(or eglot--cached-server
|
||||
(cl-find-if #'eglot--languageId
|
||||
(gethash (eglot--current-project)
|
||||
eglot--servers-by-project))
|
||||
(and eglot-extend-to-xref
|
||||
buffer-file-name
|
||||
(gethash (expand-file-name buffer-file-name)
|
||||
eglot--servers-by-xrefed-file)))))
|
||||
(and (not (eq major-mode 'fundamental-mode)) ; gh#1330
|
||||
(or
|
||||
(cl-find-if #'eglot--languageId
|
||||
(gethash (eglot--current-project)
|
||||
eglot--servers-by-project))
|
||||
(and eglot-extend-to-xref
|
||||
buffer-file-name
|
||||
(gethash (expand-file-name buffer-file-name)
|
||||
eglot--servers-by-xrefed-file)))))))
|
||||
|
||||
(defun eglot--current-server-or-lose ()
|
||||
"Return current logical Eglot server connection or error."
|
||||
|
||||
Reference in New Issue
Block a user