From: João Távora Date: Wed, 11 Jul 2018 23:30:32 +0000 (+0100) Subject: Implement workspace/didchangeconfiguration () X-Git-Tag: emacs-29.0.90~1616^2~524^2~4^2~474 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=228ddf368de316667905448dca847bb760cf2d73;p=emacs.git Implement workspace/didchangeconfiguration () * 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 --- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 77f8260b229..8f9a43d93e8 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -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