summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2023-03-01 01:22:15 +0000
committerJoão Távora <joaotavora@gmail.com>2023-03-01 01:22:40 +0000
commit97a83ff31fa9e3e2455d3168a789649dcd20a635 (patch)
tree87343af30beb439780c1e66063ce13359326e0f0
parent48a0804d10d02c2aa94664e0db8315239950225f (diff)
downloademacs-97a83ff31fa9e3e2455d3168a789649dcd20a635.tar.gz
Eglot: fix M-x eglot-show-workspace-configuration (bug#61866)
Now consult .dir-locals.el every time the workspace configuration is needed: - workspace/configuration server request - workspace/didChangeConfiguration signal - M-x eglot-show-workspace-configuration The major-mode/hack-dir-local-variables-non-file-buffer trick is used. When there is more than one, the server connection's "main" major mode is used to find the relevant .dir-locals.el section. * lisp/progmodes/eglot.el (eglot--lookup-mode): Fix docstring. (eglot--connect): Simplify. (eglot-show-workspace-configuration): Fix. (eglot--workspace-configuration): Remove. (eglot--workspace-configuration-plist): Rework. (eglot-handle-request): Simplify.
-rw-r--r--lisp/progmodes/eglot.el66
1 files changed, 31 insertions, 35 deletions
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index ffc9511469f..40fc8f8a12f 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -961,7 +961,7 @@ PRESERVE-BUFFERS as in `eglot-shutdown', which see."
"Lookup `eglot-server-programs' for MODE.
Return (MANAGED-MODES LANGUAGE-ID CONTACT-PROXY).
-MANAGED-MODES is a list with MODE as its first elements.
+MANAGED-MODES is a list with MODE as its first element.
Subsequent elements are other major modes also potentially
managed by the server that is to manage MODE.
@@ -1335,10 +1335,7 @@ This docstring appeases checkdoc, that's all."
(lambda ()
(setf (eglot--inhibit-autoreconnect server)
(null eglot-autoreconnect)))))))
- (let ((default-directory (project-root project))
- (major-mode (car managed-modes)))
- (hack-dir-local-variables-non-file-buffer)
- (run-hook-with-args 'eglot-connect-hook server))
+ (run-hook-with-args 'eglot-connect-hook server)
(eglot--message
"Connected! Server `%s' now managing `%s' buffers \
in project `%s'."
@@ -2444,9 +2441,7 @@ format described above.")
(defun eglot-show-workspace-configuration (&optional server)
"Dump `eglot-workspace-configuration' as JSON for debugging."
- (interactive (list (and (eglot-current-server)
- (eglot--read-server "Server configuration"
- (eglot-current-server)))))
+ (interactive (list (eglot--read-server "Show workspace configuration for" t)))
(let ((conf (eglot--workspace-configuration-plist server)))
(with-current-buffer (get-buffer-create "*EGLOT workspace configuration*")
(erase-buffer)
@@ -2457,14 +2452,23 @@ format described above.")
(json-pretty-print-buffer))
(pop-to-buffer (current-buffer)))))
-(defun eglot--workspace-configuration (server)
- (if (functionp eglot-workspace-configuration)
- (funcall eglot-workspace-configuration server)
- eglot-workspace-configuration))
-
-(defun eglot--workspace-configuration-plist (server)
- "Returns `eglot-workspace-configuration' suitable for serialization."
- (let ((val (eglot--workspace-configuration server)))
+(defun eglot--workspace-configuration-plist (server &optional path)
+ "Returns SERVER's workspace configuration as a plist.
+If PATH consider that file's `file-name-directory' to get the
+local value of the `eglot-workspace-configuration' variable, else
+use the root of SERVER's `eglot--project'."
+ (let ((val (with-temp-buffer
+ (setq default-directory
+ (if path
+ (file-name-directory path)
+ (project-root (eglot--project server))))
+ ;; Set the major mode to be the first of the managed
+ ;; modes. This is the one the user started eglot in.
+ (setq major-mode (car (eglot--major-modes server)))
+ (hack-dir-local-variables-non-file-buffer)()
+ (if (functionp eglot-workspace-configuration)
+ (funcall eglot-workspace-configuration server)
+ eglot-workspace-configuration))))
(or (and (consp (car val))
(cl-loop for (section . v) in val
collect (if (keywordp section) section
@@ -2489,25 +2493,17 @@ When called interactively, use the currently active server"
(apply #'vector
(mapcar
(eglot--lambda ((ConfigurationItem) scopeUri section)
- (with-temp-buffer
- (let* ((uri-path (eglot--uri-to-path scopeUri))
- (default-directory
- (if (and uri-path
- (not (string-empty-p uri-path))
- (file-directory-p uri-path))
- (file-name-as-directory uri-path)
- (project-root (eglot--project server)))))
- (setq-local major-mode (car (eglot--major-modes server)))
- (hack-dir-local-variables-non-file-buffer)
- (cl-loop for (wsection o)
- on (eglot--workspace-configuration-plist server)
- by #'cddr
- when (string=
- (if (keywordp wsection)
- (substring (symbol-name wsection) 1)
- wsection)
- section)
- return o))))
+ (cl-loop
+ with scope-uri-path = (and scopeUri (eglot--uri-to-path scopeUri))
+ for (wsection o)
+ on (eglot--workspace-configuration-plist server scope-uri-path)
+ by #'cddr
+ when (string=
+ (if (keywordp wsection)
+ (substring (symbol-name wsection) 1)
+ wsection)
+ section)
+ return o))
items)))
(defun eglot--signal-textDocument/didChange ()