Eglot: always call ElDoc callbacks in correct buffer (bug#78530)

Some minor modes adds their own eldoc display function to
'eldoc-display-functions' hook buffer-locally.  So when eldoc
uses 'eldoc-display-functions' to display docs, it should use
the buffer-local value of the hook.

But that's not always the case. In 'eldoc--invoke-strategy', the
code that runs 'eldoc-display-functions' hook is wrapped in a
callback function that eventually gets passed to each
documentation function in 'eldoc-documentation-functions'. So
now it's the documentation functions' responsibility to call the
eldoc callback in the original buffer.

All the eglot documentation functions indeed do that, using
'eglot--when-buffer-window' to switch to the original buffer
when calling the eldoc callback. But
'eglot-code-action-suggestion' is the exception, the callback is
called outside of the 'eglot--when-buffer-window' form.

This patch fixes that.

This bug was originally reported on eldoc-box [1]. The user
found that eldoc-box's display function are rarely called, even
though the minor mode is turned on. This patch fixes the issue.

[1] https://github.com/casouri/eldoc-box/issues/126#issuecomment-2896611278

* lisp/progmodes/eglot.el (eglot-code-action-suggestion): Move
the funcall form into the eglot--when-buffer-window form.
This commit is contained in:
Yuan Fu 2025-05-21 00:23:15 -07:00
parent cb1b65f392
commit 0b2ba13c97
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -4168,8 +4168,8 @@ at point. With prefix argument, prompt for ACTION-KIND."
'display 'display
`((margin left-margin) `((margin left-margin)
,tooltip))))) ,tooltip)))))
(setq eglot--suggestion-overlay ov))))) (setq eglot--suggestion-overlay ov))))
(when use-text-p (funcall cb blurb))) (when use-text-p (funcall cb blurb))))
:hint :textDocument/codeAction) :hint :textDocument/codeAction)
(and use-text-p t)))) (and use-text-p t))))