]> git.eshelyaron.com Git - emacs.git/commitdiff
Implement workspace/didchangeconfiguration ()
authorJoão Távora <joaotavora@gmail.com>
Wed, 11 Jul 2018 23:30:32 +0000 (00:30 +0100)
committerGitHub <noreply@github.com>
Wed, 11 Jul 2018 23:30:32 +0000 (00:30 +0100)
* README.md (Supported Protocol Features, Commands and
keybindings): mention workspace/didChangeConfiguration.

* eglot.el (eglot-server-initialized-hook): New hook.
(eglot--connect): Run it.
(eglot-workspace-configuration): New variable.
(eglot-signal-didChangeConfiguration): New command.

GitHub-reference: close https://github.com/joaotavora/eglot/issues/29
GitHub-reference: close https://github.com/joaotavora/eglot/issues/40

lisp/progmodes/eglot.el

index 77f8260b229adf1a2b1012a71bcdb7d5cd24f943..8f9a43d93e8c9921b2fd062008fea632934892c5 100644 (file)
@@ -446,6 +446,11 @@ INTERACTIVE is t if called interactively."
 
 (defvar eglot-connect-hook nil "Hook run after connecting in `eglot--connect'.")
 
+(defvar eglot-server-initialized-hook
+  '(eglot-signal-didChangeConfiguration)
+  "Hook run after server is successfully initialized.
+Each function is passed the server as an argument")
+
 (defun eglot--connect (managed-major-mode project class contact)
   "Connect to MANAGED-MAJOR-MODE, PROJECT, CLASS and CONTACT.
 This docstring appeases checkdoc, that's all."
@@ -514,6 +519,7 @@ This docstring appeases checkdoc, that's all."
             (with-current-buffer buffer
               (eglot--maybe-activate-editing-mode server)))
           (jsonrpc-notify server :initialized `(:__dummy__ t))
+          (run-hook-with-args 'eglot-server-initialized-hook server)
           (setf (eglot--inhibit-autoreconnect server)
                 (cond
                  ((booleanp eglot-autoreconnect) (not eglot-autoreconnect))
@@ -1033,6 +1039,22 @@ Records START, END and PRE-CHANGE-LENGTH locally."
                              (eglot--signal-textDocument/didChange))))
             '((name . eglot--signal-textDocument/didChange)))
 
+(defvar-local eglot-workspace-configuration ()
+  "Alist of (SETTING . VALUE) entries configuring the LSP server.
+Setting should be a keyword, value can be any value that can be
+converted to JSON.")
+
+(defun eglot-signal-didChangeConfiguration (server)
+  "Send a `:workspace/didChangeConfiguration' signal to SERVER.
+When called interactively, use the currently active server"
+  (interactive (list (eglot--current-server-or-lose)))
+  (jsonrpc-notify
+   server :workspace/didChangeConfiguration
+   (list
+    :settings
+    (cl-loop for (k . v) in eglot-workspace-configuration
+             collect k collect v))))
+
 (defun eglot--signal-textDocument/didChange ()
   "Send textDocument/didChange to server."
   (when eglot--recent-changes