Skip to content

Commit

Permalink
Fix #324: let user keep control of some variables during Eglot sessions
Browse files Browse the repository at this point in the history
* NEWS.md: Mention new variable eglot-stay-out-of

* eglot.el (eglot-stay-out-of): New variable.
(eglot--setq-saving): Use it.
(eglot--managed-mode): Use eglot--setq-saving for imenu.  No need
to remove 'eglot-flymake-backend from diagnostic functions.
  • Loading branch information
joaotavora committed Oct 19, 2019
1 parent f5151be commit 5ea4049
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 3 deletions.
9 changes: 9 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# 1.5 (upcoming)

##### New variable `eglot-stay-out-of` ([#324][github#324])

For the duration of an Eglot session, certain variables pertaining to
Flymake, Xref, Company, etc. are set in such a way that they override
user's customization. However, for users interested in keeping full
control of these variables, Eglot will refrain setting any variables
matched in 'eglot-stay-out-of'.

##### Prevent Eldoc flicker when moving around ([#198][github#198])

##### Show large docs in help buffer instead of echo area by default ([#198][github#198])
Expand Down Expand Up @@ -150,4 +158,5 @@ TCP connection finds a listening server.
[github#158]: https://github.com/joaotavora/eglot/issues/158
[github#160]: https://github.com/joaotavora/eglot/issues/160
[github#167]: https://github.com/joaotavora/eglot/issues/167
[github#324]: https://github.com/joaotavora/eglot/issues/324

30 changes: 27 additions & 3 deletions eglot.el
Original file line number Diff line number Diff line change
Expand Up @@ -1172,8 +1172,33 @@ and just return it. PROMPT shouldn't end with a question mark."
(defvar-local eglot--saved-bindings nil
"Bindings saved by `eglot--setq-saving'.")

(defvar eglot-stay-out-of '()
"List of Emacs things that Eglot should try to stay of.
Before Eglot starts \"managing\" a particular buffer, it
opinionatedly sets some peripheral Emacs facilites, such as
Flymake, Xref and Company. These overriding settings help ensure
consistent Eglot behaviour and only stay in place until
\"managing\" stops (usually via `eglot-shutdown'), whereupon the
previous settings are restored.
However, if you wish for Eglot to stay out of a particular Emacs
facility that you'd like to keep control of, add a string, a
symbol, or a regexp here that will be matched against the
variable's name, and Eglot will refrain from setting it.
For example, to keep your Company customization use
(add-to-list 'eglot-stay-out-of 'company)")

(defmacro eglot--setq-saving (symbol binding)
`(when (boundp ',symbol)
`(when (and (boundp ',symbol)
(not (cl-find (symbol-name ',symbol)
eglot-stay-out-of
:test
(lambda (s thing)
(let ((re (if (symbolp thing) (symbol-name thing)
thing)))
(string-match re s))))))
(push (cons ',symbol (symbol-value ',symbol))
eglot--saved-bindings)
(setq-local ,symbol ,binding)))
Expand All @@ -1200,11 +1225,10 @@ and just return it. PROMPT shouldn't end with a question mark."
(eglot--setq-saving xref-prompt-for-identifier nil)
(eglot--setq-saving flymake-diagnostic-functions '(eglot-flymake-backend t))
(eglot--setq-saving company-backends '(company-capf))
(add-function :around (local 'imenu-create-index-function) #'eglot-imenu)
(eglot--setq-saving imenu-create-index-function #'eglot-imenu)
(flymake-mode 1)
(eldoc-mode 1))
(t
(remove-hook 'flymake-diagnostic-functions 'eglot-flymake-backend t)
(remove-hook 'after-change-functions 'eglot--after-change t)
(remove-hook 'before-change-functions 'eglot--before-change t)
(remove-hook 'kill-buffer-hook 'eglot--signal-textDocument/didClose t)
Expand Down

0 comments on commit 5ea4049

Please sign in to comment.