branch: externals/elpa
commit c948713b050fe209572b362799ae688d1c0629f6
Author: João Távora <joaotav...@gmail.com>
Commit: João Távora <joaotav...@gmail.com>

    Auto-reconnect on unexpected connection loss
    
    * eglot.el (eglot-reconnect): Only quit if indeed not quit
    already.
    (eglot-new-process): Burn the command in the bootstrap fn.
    (eglot--process-sentinel): Automatically reconnect if closed
    unexpectedly.
    (eglot--warn): Also message to *Messages*
---
 eglot.el | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/eglot.el b/eglot.el
index aa23252..71dab80 100644
--- a/eglot.el
+++ b/eglot.el
@@ -162,7 +162,8 @@ Call SUCCESS-FN with no args if all goes well."
   "Reconnect to PROCESS.
 INTERACTIVE is t if called interactively."
   (interactive (list (eglot--current-process-or-lose) t))
-  (eglot-quit-server process 'sync interactive)
+  (when (process-live-p process)
+    (eglot-quit-server process 'sync interactive))
   (eglot--connect (eglot--short-name process)
                   (eglot--bootstrap-fn process)
                   (lambda ()
@@ -174,7 +175,12 @@ INTERACTIVE is t if called interactively."
   (interactive (list t))
   (let ((project (project-current)))
     (unless project (eglot--error "(new-process) Cannot work without a current 
project!"))
-    (let ((current-process (eglot--current-process)))
+    (let ((current-process (eglot--current-process))
+          (command (let ((probe (cdr (assoc major-mode eglot-executables))))
+                     (unless probe
+                       (eglot--error "Don't know how to start EGLOT for %s 
buffers"
+                                     major-mode))
+                     probe)))
       (cond ((and current-process
                   (process-live-p current-process))
              (eglot--message "(new-process) Reconnecting instead")
@@ -187,11 +193,7 @@ INTERACTIVE is t if called interactively."
               (lambda (name)
                 (eglot-make-local-process
                  name
-                 (let ((probe (cdr (assoc major-mode eglot-executables))))
-                   (unless probe
-                     (eglot--error "Don't know how to start EGLOT for %s 
buffers"
-                                   major-mode))
-                   probe)))
+                 command))
               (lambda ()
                 (eglot--message "Connected")
                 (dolist (buffer (buffer-list))
@@ -221,8 +223,10 @@ INTERACTIVE is t if called interactively."
            (eglot--message "(sentinel) Moribund process exited with status %s"
                            (process-exit-status process)))
           (t
-           (eglot--warn "(sentinel) Process unexpectedly changed to %s"
-                        change)))
+           (eglot--warn
+            "(sentinel) Reconnecting after process unexpectedly changed to %s."
+            change)
+           (eglot-reconnect process)))
     (delete-process process)))
 
 (defun eglot--process-filter (proc string)
@@ -633,6 +637,7 @@ running.  INTERACTIVE is t if called interactively."
 
 (defun eglot--warn (format &rest args)
   "Warning message with FORMAT and ARGS."
+  (apply #'eglot--message (concat "(warning) " format) args)
   (let ((warning-minimum-level :error))
     (display-warning 'eglot
                      (apply #'format format args)

Reply via email to