Function: eglot-describe-connection

eglot-describe-connection is an interactive and byte-compiled function defined in eglot.el.gz.

Signature

(eglot-describe-connection SERVER)

Documentation

Describe SERVER in a dedicated buffer.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(cl-defun eglot-describe-connection
    (server &aux
            (info    (eglot--server-info server))
            (project (eglot--project server))
            (root    (project-root project))
            (managed (eglot--managed-buffers server))
            (caps    (eglot--capabilities server))
            (watches (eglot--file-watches server))
            (wsconf  (eglot--workspace-configuration-plist server))
            (sname (eglot--server-name server)))
  "Describe SERVER in a dedicated buffer."
  (interactive (list (eglot--current-server-or-lose)))
  (with-current-buffer
      (get-buffer-create (eglot--server-buffer-name server "connection"))
    (let ((inhibit-read-only t))
      (erase-buffer)
      (special-mode)
      (setq-local revert-buffer-function
                  (lambda (&rest _)
                    (eglot-describe-connection server)))
      (cl-flet ((heading (str &optional first)
                  (unless first (insert "\n"))
                  (insert (propertize str 'face 'bold) "\n")))
        (heading "Server" t)
        (insert (format "  Name:    %s\n" sname))
        (insert (format "  Version: %s\n" (plist-get info :version)))

        (heading "Project")
        (insert (format "  Nickname:  %s\n" (eglot-project-nickname server)))
        (insert (format "  Root:      %s\n" root))
        (let ((expanded (expand-file-name root))
              (trueroot (eglot--trueroot server)))
          (unless (string= root expanded)
            (insert (format "  Expanded:  %s\n" expanded)))
          (unless (string= expanded trueroot)
            (insert (format "  Canonical: %s\n" trueroot))))
        (insert (format "  As lisp:   %s\n" project))

        (heading "Major modes")
        (insert "  "
                (mapconcat #'symbol-name (eglot--major-modes server) ", ")
                "\n")

        (heading (format "Managed buffers (%d)" (length managed)))
        (dolist (buf managed)
          (if (buffer-live-p buf)
              (let ((name (or (buffer-file-name buf) (buffer-name buf))))
                (insert "  ")
                (insert-text-button name
                                    'action (lambda (_) (pop-to-buffer buf))
                                    'follow-link t)
                (insert "\n"))
            (insert "  (dead buffer)\n")))

        (heading "Capabilities")
        (cl-loop
         with enabled = (cl-loop for (k v) on caps by #'cddr
                                 unless (eq v :json-false) collect k)
         with col-width = (+ 1 (cl-reduce
                                #'max enabled :initial-value 0
                                :key (lambda (k) (length (symbol-name k)))))
         for tail on enabled by #'cdddr
         do (insert "  ")
         (cl-loop for k in (seq-take tail 3)
                  for name = (symbol-name k)
                  do (insert-text-button
                      name
                      'action (let ((v (plist-get caps k)))
                                (lambda (_)
                                  (pp-eval-expression (list 'quote v))))
                      'follow-link t)
                  (insert (make-string (- col-width (length name)) ?\s)))
         (insert "\n"))

        (heading "Workspace configuration")
        (if wsconf
            (insert (with-temp-buffer
                      (insert (jsonrpc--json-encode wsconf))
                      (ignore-errors (require 'json) (json-pretty-print-buffer))
                      (replace-regexp-in-string "^" "  " (buffer-string)))
                    "\n")
          (insert "  (none)\n"))

        (heading "File watchers")
        (if (zerop (hash-table-count watches))
            (insert "  (none)\n")
          (maphash (lambda (id descs)
                     (insert (format "  %s -> %d watcher%s\n" id
                                     (length descs)
                                     (if (= 1 (length descs)) "" "s"))))
                   watches))

        (heading "Events buffer")
        (insert "  ")
        (insert-text-button "Show events buffer"
                            'action (lambda (_) (eglot-events-buffer server))
                            'follow-link t)
        (insert "\n")))
    (goto-char (point-min))
    (display-buffer (current-buffer))))