diff options
| author | João Távora | 2023-03-23 13:13:16 +0000 |
|---|---|---|
| committer | João Távora | 2023-03-23 21:12:18 +0000 |
| commit | 0effdb29d6db4d5d13b09d82db3a681b8501b9d5 (patch) | |
| tree | 041d7040c1a7dd11439ddc39cc9ab428f8a6ae70 | |
| parent | f20fe3e11a96defe69e7cfed801a047be1778b51 (diff) | |
| download | emacs-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.el | 51 |
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. |
| 400 | If set to `messages', use *Messages* buffer, else use Eglot's | ||
| 401 | mode 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, \ |
| 2080 | still unanswered LSP requests to the server\n")))))))) | 2082 | still 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 |