"\"Spinner\" used by some servers.
A list (ID WHAT DONE-P).")
+(eglot--define-process-var eglot--status `(:unknown nil)
+ "Status as declared by the server.
+A list (WHAT SERIOUS-P).")
+
(defun eglot--command (&optional errorp)
(let ((probe (cdr (assoc major-mode eglot-executables))))
(unless (or (not errorp)
(display-buffer buffer))
buffer))
-(defun eglot--log-event (proc type message id error)
+(defun eglot--log-event (proc type message &optional id error)
+ "Log an eglot-related event.
+PROC is the current process. TYPE is an identifier. MESSAGE is
+a JSON-like plist or anything else. ID is a continuation
+identifier. ERROR is non-nil if this is an error."
(with-current-buffer (eglot-events-buffer proc)
(let ((inhibit-read-only t))
(goto-char (point-max))
- (insert (format "%s%s%s:\n%s\n"
- type
- (if id (format " (id:%s)" id) "")
- (if error " ERROR" "")
- (pp-to-string message))))))
+ (let ((msg (format "%s%s%s:\n%s\n"
+ type
+ (if id (format " (id:%s)" id) "")
+ (if error " ERROR" "")
+ (pp-to-string message))))
+ (when error
+ (setq msg (propertize msg 'face 'error)))
+ (insert msg)))))
(defvar eglot--environment-vars
'(eglot--current-flymake-report-fn)
(lambda (&key capabilities)
(setf (eglot--capabilities process) capabilities)
(when interactive
+ (setf (eglot--status process) nil)
(eglot--message
"So yeah I got lots (%d) of capabilities"
(length capabilities)))))))
(t
(eglot--message "OK so %s isn't visited" filename)))))
+(cl-defun eglot--window/showMessage
+ (process &key type message)
+ "Handle notification window/showMessage"
+ (when (<= 1 type)
+ (setf (eglot--status process) '("error" t))
+ (eglot--log-event process
+ (propertize "server-error" 'face 'error)
+ message))
+ (eglot--message "Server reports (type=%s): %s" type message))
+
\f
;;; Helpers
;;;
(pending (and proc
(hash-table-count
(eglot--pending-continuations proc))))
- (`(,_id ,what ,done-p) (and proc
- (eglot--spinner))))
+ (`(,_id ,doing ,done-p)
+ (and proc
+ (eglot--spinner proc)))
+ (`(,status ,serious-p)
+ (and proc
+ (eglot--status proc))))
(append
`((:propertize "eglot"
face eglot-mode-line
help-echo ,(concat "mouse-1: go to events buffer\n"
"mouse-2: quit server\n"
"mouse-3: new process"))
- ,@(when (and what (not done-p))
+ ,@(when serious-p
+ `("/"
+ (:propertize
+ ,status
+ help-echo ,(concat "mouse-1: go to events buffer")
+ mouse-face mode-line-highlight
+ face compilation-mode-line-fail
+ keymap ,(let ((map (make-sparse-keymap)))
+ (define-key map [mode-line mouse-1]
+ 'eglot-events-buffer)
+ map))))
+ ,@(when (and doing (not done-p))
`("/"
(:propertize
- ,what
+ ,doing
help-echo ,(concat "mouse-1: go to events buffer")
mouse-face mode-line-highlight
face compilation-mode-line-run