diff --git a/eglot.el b/eglot.el index 3d1b19c9..b06827f7 100644 --- a/eglot.el +++ b/eglot.el @@ -618,6 +618,15 @@ treated as in `eglot-dbind'." (let ((b (cl-gensym))) `(let ((,b ,buf)) (if (buffer-live-p ,b) (with-current-buffer ,b ,@body))))) +(cl-defmacro eglot--eval-post-command (&rest body) + "Eval body in `post-command-hook'" + `(cl-labels + ((func + () + (remove-hook 'post-command-hook #'func nil) + ,@body)) + (add-hook 'post-command-hook #'func 'append nil))) + (cl-defmacro eglot--when-buffer-window (buf &body body) "Check BUF showing somewhere, then do BODY in it." (declare (indent 1) (debug t)) (let ((b (cl-gensym))) @@ -1041,16 +1050,12 @@ INTERACTIVE is t if called interactively." ;;;###autoload (defun eglot-ensure () "Start Eglot session for current buffer if there isn't one." - (let ((buffer (current-buffer))) - (cl-labels - ((maybe-connect - () - (remove-hook 'post-command-hook #'maybe-connect nil) - (eglot--when-live-buffer buffer - (unless eglot--managed-mode - (apply #'eglot--connect (eglot--guess-contact)))))) - (when buffer-file-name - (add-hook 'post-command-hook #'maybe-connect 'append nil))))) + (when buffer-file-name + (let ((buffer (current-buffer))) + (eglot--eval-post-command + (eglot--when-live-buffer buffer + (unless (eglot-current-server) + (apply #'eglot--connect (eglot--guess-contact)))))))) (defun eglot-events-buffer (server) "Display events buffer for SERVER. @@ -1213,9 +1218,9 @@ This docstring appeases checkdoc, that's all." ;; No need to pass SERVER as an argument: it has ;; been registered in `eglot--servers-by-project', ;; so that it can be found (and cached) from - ;; `eglot--maybe-activate-editing-mode' in any + ;; `eglot--maybe-activate-managed-mode' in any ;; managed buffer. - (eglot--maybe-activate-editing-mode))) + (eglot--maybe-activate-managed-mode))) (setf (eglot--inhibit-autoreconnect server) (cond ((booleanp eglot-autoreconnect) @@ -1711,20 +1716,23 @@ Use `eglot-managed-p' to determine if current buffer is managed.") "Eglot's `after-revert-hook'." (when revert-buffer-preserve-modes (eglot--signal-textDocument/didOpen))) -(defun eglot--maybe-activate-editing-mode () +(defun eglot--maybe-activate-managed-mode () "Maybe activate `eglot--managed-mode'. If it is activated, also signal textDocument/didOpen." - (unless eglot--managed-mode - ;; Called when `revert-buffer-in-progress-p' is t but - ;; `revert-buffer-preserve-modes' is nil. - (when (and buffer-file-name (eglot-current-server)) - (setq eglot--diagnostics nil) - (eglot--managed-mode) - (eglot--signal-textDocument/didOpen)))) - -(add-hook 'find-file-hook 'eglot--maybe-activate-editing-mode) -(add-hook 'after-change-major-mode-hook 'eglot--maybe-activate-editing-mode) + (let ((buffer (current-buffer))) + (eglot--eval-post-command + (eglot--when-live-buffer buffer + (unless eglot--managed-mode + ;; Called when `revert-buffer-in-progress-p' is t but + ;; `revert-buffer-preserve-modes' is nil. + (when (and buffer-file-name (eglot-current-server)) + (setq eglot--diagnostics nil) + (eglot--managed-mode) + (eglot--signal-textDocument/didOpen))))))) + +(add-hook 'find-file-hook 'eglot--maybe-activate-managed-mode) +(add-hook 'after-change-major-mode-hook 'eglot--maybe-activate-managed-mode) (defun eglot-clear-status (server) "Clear the last JSONRPC error for SERVER."