aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Távora2023-03-23 13:13:16 +0000
committerJoão Távora2023-03-23 21:12:18 +0000
commit0effdb29d6db4d5d13b09d82db3a681b8501b9d5 (patch)
tree041d7040c1a7dd11439ddc39cc9ab428f8a6ae70
parentf20fe3e11a96defe69e7cfed801a047be1778b51 (diff)
downloademacs-0effdb29d6db4d5d13b09d82db3a681b8501b9d5.tar.gz
emacs-0effdb29d6db4d5d13b09d82db3a681b8501b9d5.zip
Eglot: rework progress indicators
Show progress indicator in Eglot's mode line by default. * lisp/progmodes/eglot.el (eglot-report-progress): Work docstring. (eglot--mode-line-format): Rework. (eglot-handle-notification $/progress): Rework.
-rw-r--r--lisp/progmodes/eglot.el51
1 files changed, 35 insertions, 16 deletions
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 9fd12d174da..d88647ccbdf 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -396,7 +396,9 @@ done by `eglot-reconnect'."
396 :type 'string) 396 :type 'string)
397 397
398(defcustom eglot-report-progress t 398(defcustom eglot-report-progress t
399 "If non-nil, show progress of long running LSP server work" 399 "If non-nil, show progress of long running LSP server work.
400If set to `messages', use *Messages* buffer, else use Eglot's
401mode line indicator."
400 :type 'boolean 402 :type 'boolean
401 :version "29.1") 403 :version "29.1")
402 404
@@ -2040,7 +2042,7 @@ Uses THING, FACE, DEFS and PREPEND."
2040 mouse-face mode-line-highlight)))) 2042 mouse-face mode-line-highlight))))
2041 2043
2042(defun eglot--mode-line-format () 2044(defun eglot--mode-line-format ()
2043 "Compose the Eglot's mode-line." 2045 "Compose Eglot's mode-line."
2044 (let* ((server (eglot-current-server)) 2046 (let* ((server (eglot-current-server))
2045 (nick (and server (eglot-project-nickname server))) 2047 (nick (and server (eglot-project-nickname server)))
2046 (pending (and server (hash-table-count 2048 (pending (and server (hash-table-count
@@ -2077,7 +2079,15 @@ Uses THING, FACE, DEFS and PREPEND."
2077 '((mouse-3 eglot-forget-pending-continuations 2079 '((mouse-3 eglot-forget-pending-continuations
2078 "Forget pending continuations")) 2080 "Forget pending continuations"))
2079 "Number of outgoing, \ 2081 "Number of outgoing, \
2080still unanswered LSP requests to the server\n")))))))) 2082still unanswered LSP requests to the server\n")))
2083 ,@(cl-loop for pr hash-values of (eglot--progress-reporters server)
2084 when (eq (car pr) 'eglot--mode-line-reporter)
2085 append `("/" ,(eglot--mode-line-props
2086 (format "%s%%%%" (or (nth 4 pr) "?"))
2087 'eglot-mode-line
2088 nil
2089 (format "(%s) %s %s" (nth 1 pr)
2090 (nth 2 pr) (nth 3 pr))))))))))
2081 2091
2082(add-to-list 'mode-line-misc-info 2092(add-to-list 'mode-line-misc-info
2083 `(eglot--managed-mode (" [" eglot--mode-line-format "] "))) 2093 `(eglot--managed-mode (" [" eglot--mode-line-format "] ")))
@@ -2167,22 +2177,31 @@ COMMAND is a symbol naming the command."
2167 (server (_method (eql $/progress)) &key token value) 2177 (server (_method (eql $/progress)) &key token value)
2168 "Handle $/progress notification identified by TOKEN from SERVER." 2178 "Handle $/progress notification identified by TOKEN from SERVER."
2169 (when eglot-report-progress 2179 (when eglot-report-progress
2170 (cl-flet ((fmt (&rest args) (mapconcat #'identity args " "))) 2180 (cl-flet ((fmt (&rest args) (mapconcat #'identity args " "))
2181 (mkpr (title)
2182 (if (eq eglot-report-progress 'messages)
2183 (make-progress-reporter
2184 (format "[eglot] %s %s: %s"
2185 (eglot-project-nickname server) token title))
2186 (list 'eglot--mode-line-reporter token title)))
2187 (upd (pcnt msg &optional
2188 (pr (gethash token (eglot--progress-reporters server))))
2189 (cond
2190 ((eq (car pr) 'eglot--mode-line-reporter)
2191 (setcdr (cddr pr) (list msg pcnt))
2192 (force-mode-line-update t))
2193 (pr (progress-reporter-update pr pcnt msg)))))
2171 (eglot--dbind ((WorkDoneProgress) kind title percentage message) value 2194 (eglot--dbind ((WorkDoneProgress) kind title percentage message) value
2172 (pcase kind 2195 (pcase kind
2173 ("begin" 2196 ("begin"
2174 (let* ((prefix (format (concat "[eglot] %s %s:" (when percentage " ")) 2197 (upd percentage (fmt title message)
2175 (eglot-project-nickname server) token)) 2198 (puthash token (mkpr title)
2176 (pr (puthash token 2199 (eglot--progress-reporters server))))
2177 (if percentage 2200 ("report" (upd percentage message))
2178 (make-progress-reporter prefix 0 100 percentage 1 0) 2201 ("end" (upd (or percentage 100) message)
2179 (make-progress-reporter prefix nil nil nil 1 0)) 2202 (run-at-time 2 nil
2180 (eglot--progress-reporters server)))) 2203 (lambda ()
2181 (eglot--reporter-update pr percentage (fmt title message)))) 2204 (remhash token (eglot--progress-reporters server))))))))))
2182 ("report"
2183 (when-let ((pr (gethash token (eglot--progress-reporters server))))
2184 (eglot--reporter-update pr percentage (fmt title message))))
2185 ("end" (remhash token (eglot--progress-reporters server))))))))
2186 2205
2187(cl-defmethod eglot-handle-notification 2206(cl-defmethod eglot-handle-notification
2188 (_server (_method (eql textDocument/publishDiagnostics)) &key uri diagnostics 2207 (_server (_method (eql textDocument/publishDiagnostics)) &key uri diagnostics