From cac0a688b68eff950570f5a28fffb6be77aff6e4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 6 Jun 2024 17:08:28 -0500 Subject: [PATCH] Eglot: better fix for bug#70724 If the project's root is or destroyed , this may happen for a variety of reasons, including reasons affecting non-reconnection scenarios, so better to check in eglot--connect. An Eglot "reconnection" has always created as accurate a copy of the previous server object as possible, down to the 'eq'ness or the saved initargs, language ids, etc. So re-querying for projects is not the thing to do here. A new different server can be created with `M-x eglot` which will ask about shutting down the existing one. * lisp/progmodes/eglot.el (eglot-reconnect): Revert previous change. (eglot--connect): Do sanity check here (cherry picked from commit 6906ed28f1b4ac0cf0a2a725e7402290f33c26e2) --- lisp/progmodes/eglot.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 6b4c00fdb55..2dad6864429 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -1419,15 +1419,11 @@ INTERACTIVE is t if called interactively." (interactive (list (eglot--current-server-or-lose) t)) (when (jsonrpc-running-p server) (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers))) - (let* ((default-directory (project-root (eglot--project server))) - (project (eglot--current-project))) - (if (not project) - (eglot--error "Project in `%s' is gone!" default-directory) - (eglot--connect (eglot--major-modes server) - project - (eieio-object-class-name server) - (eglot--saved-initargs server) - (eglot--language-ids server)))) + (eglot--connect (eglot--major-modes server) + (eglot--project server) + (eieio-object-class-name server) + (eglot--saved-initargs server) + (eglot--language-ids server)) (eglot--message "Reconnected!")) (defvar eglot--managed-mode) ; forward decl @@ -1518,7 +1514,12 @@ Each function is passed the server as an argument") This docstring appeases checkdoc, that's all." (let* ((default-directory (project-root project)) (nickname (project-name project)) - (readable-name (format "EGLOT (%s/%s)" nickname managed-modes)) + (readable-name + (progn + (unless (file-exists-p default-directory) + ;; could happen because of bug#70724 or just because + (eglot--error "Project '%s' is gone!" nickname)) + (format "EGLOT (%s/%s)" nickname managed-modes))) server-info (contact (if (functionp contact) (funcall contact) contact)) (initargs -- 2.39.5