]> git.eshelyaron.com Git - emacs.git/commitdiff
Eglot-workspace-configuration can be a function
authorJoão Távora <joaotavora@gmail.com>
Mon, 18 Jul 2022 20:23:32 +0000 (21:23 +0100)
committerJoão Távora <joaotavora@gmail.com>
Tue, 19 Jul 2022 16:48:31 +0000 (17:48 +0100)
* README.md (Workspace configuration): Renamed from per-project
configuration.  Rework.

* NEWS.md: Mention change.

* eglot.el (eglot-workspace-configuration): Overhaul.
(eglot-signal-didChangeConfiguration): Use new
eglot-workspace-configuration.

GitHub-reference: per https://github.com/joaotavora/eglot/issues/967

lisp/progmodes/eglot.el

index 0b64cd2301bfce132ece1ffffaca83e1fb764fc1..582ad1fdee80a0fa35ed514432291e219b6c4e73 100644 (file)
@@ -2199,12 +2199,22 @@ Records BEG, END and PRE-CHANGE-LENGTH locally."
 
 (defvar-local eglot-workspace-configuration ()
   "Alist of (SECTION . VALUE) entries configuring the LSP server.
-SECTION should be a keyword or a string, value can be anything
-that can be converted to JSON.")
+SECTION should be a keyword or a string.  VALUE is a
+plist or a primitive type converted to JSON.
+
+The value of this variable can also be a unary function of a
+`eglot-lsp-server' instance, the server connection requesting the
+configuration.  It should return an alist of the format described
+above.")
 
 ;;;###autoload
 (put 'eglot-workspace-configuration 'safe-local-variable 'listp)
 
+(defun eglot--workspace-configuration (server)
+  (if (functionp eglot-workspace-configuration)
+      (funcall eglot-workspace-configuration server)
+    eglot-workspace-configuration))
+
 (defun eglot-signal-didChangeConfiguration (server)
   "Send a `:workspace/didChangeConfiguration' signal to SERVER.
 When called interactively, use the currently active server"
@@ -2213,7 +2223,7 @@ When called interactively, use the currently active server"
    server :workspace/didChangeConfiguration
    (list
     :settings
-    (or (cl-loop for (section . v) in eglot-workspace-configuration
+    (or (cl-loop for (section . v) in (eglot--workspace-configuration server)
                  collect (if (keywordp section)
                              section
                            (intern (format ":%s" section)))
@@ -2235,7 +2245,7 @@ When called interactively, use the currently active server"
                          (project-root (eglot--project server)))))
                 (setq-local major-mode (eglot--major-mode server))
                 (hack-dir-local-variables-non-file-buffer)
-                (alist-get section eglot-workspace-configuration
+                (alist-get section (eglot--workspace-configuration server)
                            nil nil
                            (lambda (wsection section)
                              (string=