diff options
| author | João Távora | 2024-06-06 17:08:28 -0500 |
|---|---|---|
| committer | João Távora | 2024-06-06 17:13:57 -0500 |
| commit | 6906ed28f1b4ac0cf0a2a725e7402290f33c26e2 (patch) | |
| tree | 942f0d5c8359424517e737c08579dea38af0f0d5 | |
| parent | b571c6571c8bc4c34569650104aee273c19cbfd4 (diff) | |
| download | emacs-6906ed28f1b4ac0cf0a2a725e7402290f33c26e2.tar.gz emacs-6906ed28f1b4ac0cf0a2a725e7402290f33c26e2.zip | |
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
| -rw-r--r-- | lisp/progmodes/eglot.el | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index f58a895a3f1..03da5c7b22a 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el | |||
| @@ -1419,15 +1419,11 @@ INTERACTIVE is t if called interactively." | |||
| 1419 | (interactive (list (eglot--current-server-or-lose) t)) | 1419 | (interactive (list (eglot--current-server-or-lose) t)) |
| 1420 | (when (jsonrpc-running-p server) | 1420 | (when (jsonrpc-running-p server) |
| 1421 | (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers))) | 1421 | (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers))) |
| 1422 | (let* ((default-directory (project-root (eglot--project server))) | 1422 | (eglot--connect (eglot--major-modes server) |
| 1423 | (project (eglot--current-project))) | 1423 | (eglot--project server) |
| 1424 | (if (not project) | 1424 | (eieio-object-class-name server) |
| 1425 | (eglot--error "Project in `%s' is gone!" default-directory) | 1425 | (eglot--saved-initargs server) |
| 1426 | (eglot--connect (eglot--major-modes server) | 1426 | (eglot--language-ids server)) |
| 1427 | project | ||
| 1428 | (eieio-object-class-name server) | ||
| 1429 | (eglot--saved-initargs server) | ||
| 1430 | (eglot--language-ids server)))) | ||
| 1431 | (eglot--message "Reconnected!")) | 1427 | (eglot--message "Reconnected!")) |
| 1432 | 1428 | ||
| 1433 | (defvar eglot--managed-mode) ; forward decl | 1429 | (defvar eglot--managed-mode) ; forward decl |
| @@ -1518,7 +1514,12 @@ Each function is passed the server as an argument") | |||
| 1518 | This docstring appeases checkdoc, that's all." | 1514 | This docstring appeases checkdoc, that's all." |
| 1519 | (let* ((default-directory (project-root project)) | 1515 | (let* ((default-directory (project-root project)) |
| 1520 | (nickname (project-name project)) | 1516 | (nickname (project-name project)) |
| 1521 | (readable-name (format "EGLOT (%s/%s)" nickname managed-modes)) | 1517 | (readable-name |
| 1518 | (progn | ||
| 1519 | (unless (file-exists-p default-directory) | ||
| 1520 | ;; could happen because of bug#70724 or just because | ||
| 1521 | (eglot--error "Project '%s' is gone!" nickname)) | ||
| 1522 | (format "EGLOT (%s/%s)" nickname managed-modes))) | ||
| 1522 | server-info | 1523 | server-info |
| 1523 | (contact (if (functionp contact) (funcall contact) contact)) | 1524 | (contact (if (functionp contact) (funcall contact) contact)) |
| 1524 | (initargs | 1525 | (initargs |