Fix #3789: fix eglot lookup-documentation handler

Eglot replaced `eglot-help-at-point' in joaotavora/eglot@a044dec,
breaking our documentation lookup handler.
This commit is contained in:
Henrik Lissner 2020-08-20 14:07:47 -04:00
parent f6f90c9791
commit 9e9b95f49c
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 29 additions and 9 deletions

View file

@ -16,11 +16,11 @@
eglot-auto-display-help-buffer nil) eglot-auto-display-help-buffer nil)
:config :config
(set-popup-rule! "^\\*eglot-help" :size 0.35 :quit t :select t) (set-popup-rule! "^\\*eglot-help" :size 0.15 :quit t :select t)
(set-lookup-handlers! 'eglot--managed-mode (set-lookup-handlers! 'eglot--managed-mode
:implementations #'eglot-find-implementation :implementations #'eglot-find-implementation
:type-definition #'eglot-find-typeDefinition :type-definition #'eglot-find-typeDefinition
:documentation #'+eglot/documentation-lookup-handler) :documentation #'+eglot-lookup-documentation)
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(after! flycheck (after! flycheck
(load! "autoload/flycheck-eglot")))) (load! "autoload/flycheck-eglot"))))

View file

@ -9,11 +9,31 @@ Example : (set-eglot-client! 'python-mode `(,(concat doom-etc-dir \"lsp/mspyls/M
(after! eglot (after! eglot
(add-to-list 'eglot-server-programs `(,mode . ,server-call)))) (add-to-list 'eglot-server-programs `(,mode . ,server-call))))
;; HACK Eglot removed `eglot-help-at-point' in joaotavora/eglot@a044dec for a
;; more problematic approach of deferred to eldoc. Here, I've restored it.
;; Doom's lookup handlers try to open documentation in a separate window
;; (so they can be copied or kept open), but doing so with an eldoc buffer
;; is difficult because a) its contents are generated asynchronously,
;; making them tough to scrape, and b) their contents change frequently
;; (every time you move your cursor).
(defvar +eglot--help-buffer nil)
;;;###autoload ;;;###autoload
(defun +eglot/documentation-lookup-handler () (defun +eglot-lookup-documentation (_identifier)
"Documentation lookup handler using eglot :document/hover handler. "Request documentation for the thing at point."
(eglot--dbind ((Hover) contents range)
Mostly a rewrite of `eglot-help-at-point', which should be used interactively." (jsonrpc-request (eglot--current-server-or-lose) :textDocument/hover
(interactive) (eglot--TextDocumentPositionParams))
(eglot-help-at-point) (let ((blurb (and (not (seq-empty-p contents))
(display-buffer eglot--help-buffer)) (eglot--hover-info contents range)))
(hint (thing-at-point 'symbol)))
(if blurb
(with-current-buffer
(or (and (buffer-live-p +eglot--help-buffer)
+eglot--help-buffer)
(setq +eglot--help-buffer (generate-new-buffer "*eglot-help*")))
(with-help-window (current-buffer)
(rename-buffer (format "*eglot-help for %s*" hint))
(with-current-buffer standard-output (insert blurb))
(setq-local nobreak-char-display nil)))
(display-local-help))))
'deferred)