From: João Távora Date: Thu, 14 Dec 2023 16:32:54 +0000 (+0000) Subject: Eglot: beware activation in fundamental-mode X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=af1fe69f05d803a6958f9d8a045d1013e2ce785c;p=emacs.git 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. --- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 608389f1c05..84c5e6639df 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -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."