From: João Távora Date: Mon, 25 Jun 2018 16:37:43 +0000 (+0100) Subject: Cache buffer's managing server X-Git-Tag: emacs-29.0.90~1616^2~524^2~4^2~483 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=973b0255229f0d5fa9aaf141743584c969293d05;p=emacs.git Cache buffer's managing server * eglot.el (eglot--cached-current-server): New variable. (eglot--managed-mode-onoff): Set it. (eglot--current-server): Read it. (eglot--maybe-activate-editing-mode): Add assertion. GitHub-reference: close https://github.com/joaotavora/eglot/issues/32 --- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 88746a72823..01658f9343e 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -708,23 +708,33 @@ If optional MARKERS, make markers." (remove-function (local 'imenu-create-index-function) #'eglot-imenu) (setq eglot--current-flymake-report-fn nil)))) +(defvar-local eglot--cached-current-server nil + "A cached reference to the current EGLOT server. +Reset in `eglot--managed-mode-onoff'.") + (defun eglot--managed-mode-onoff (server arg) "Proxy for function `eglot--managed-mode' with ARG and SERVER." (eglot--managed-mode arg) (let ((buf (current-buffer))) - (if eglot--managed-mode - (cl-pushnew buf (eglot--managed-buffers server)) - (setf (eglot--managed-buffers server) - (delq buf (eglot--managed-buffers server)))))) + (cond (eglot--managed-mode + (setq eglot--cached-current-server server) + (cl-pushnew buf (eglot--managed-buffers server))) + (t + (setq eglot--cached-current-server nil) + (setf (eglot--managed-buffers server) + (delq buf (eglot--managed-buffers server))))))) (add-hook 'eglot--managed-mode-hook 'flymake-mode) (add-hook 'eglot--managed-mode-hook 'eldoc-mode) (defun eglot--current-server () "Find the current logical EGLOT server." - (let* ((probe (or (project-current) `(transient . ,default-directory)))) - (cl-find major-mode (gethash probe eglot--servers-by-project) - :key #'eglot--major-mode))) + (or + eglot--cached-current-server + (let* ((probe (or (project-current) + `(transient . ,default-directory)))) + (cl-find major-mode (gethash probe eglot--servers-by-project) + :key #'eglot--major-mode)))) (defun eglot--current-server-or-lose () "Return current logical EGLOT server connection or error." @@ -738,6 +748,12 @@ If optional MARKERS, make markers." "Maybe activate mode function `eglot--managed-mode'. If SERVER is supplied, do it only if BUFFER is managed by it. In that case, also signal textDocument/didOpen." + (unless server + (when eglot--cached-current-server + (display-warning + :eglot "`eglot--cached-current-server' is non-nil, but it should be!\n\ +Please report this as a possible bug.") + (setq eglot--cached-current-server nil))) ;; Called even when revert-buffer-in-progress-p (let* ((cur (and buffer-file-name (eglot--current-server))) (server (or (and (null server) cur) (and server (eq server cur) cur))))