Add the hack into codebase
This commit is contained in:
parent
504827bf45
commit
4dc269bc1e
25
README.org
25
README.org
@ -20,6 +20,7 @@ Note that =eldoc-box-hover-at-point-mode= enables =eldoc-box-hover-mode= — it
|
|||||||
** Face
|
** Face
|
||||||
- =eldoc-box-border= :: Adjust =:background= of this face for border color.
|
- =eldoc-box-border= :: Adjust =:background= of this face for border color.
|
||||||
- =eldoc-box-body= :: Adjust =:background= and =:font= of this face for background color and font of the childframe. I suggest to use a nice Sans Serif font, such as Source Sans Pro.
|
- =eldoc-box-body= :: Adjust =:background= and =:font= of this face for background color and font of the childframe. I suggest to use a nice Sans Serif font, such as Source Sans Pro.
|
||||||
|
- =eldox-box-eglot-help-at-point= :: [[command][See below]]
|
||||||
** Variable
|
** Variable
|
||||||
- =eldoc-box-max-pixel-width= & =eldoc-box-max-pixel-height= :: Set them according to the screen resolution of your machine.
|
- =eldoc-box-max-pixel-width= & =eldoc-box-max-pixel-height= :: Set them according to the screen resolution of your machine.
|
||||||
- =eldoc-box-only-multi-line= :: Set this to non-nil and eldoc-box only display multi-line message in childframe. One line messages are left in minibuffer.
|
- =eldoc-box-only-multi-line= :: Set this to non-nil and eldoc-box only display multi-line message in childframe. One line messages are left in minibuffer.
|
||||||
@ -29,29 +30,9 @@ As of writing this README, eglot doesn't have a public mode hook, use this hook:
|
|||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(add-hook 'eglot--managed-mode-hook #'eldoc-box-hover-mode t)
|
(add-hook 'eglot--managed-mode-hook #'eldoc-box-hover-mode t)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
** Help at point hack
|
|
||||||
If all you need is a "help at point" popup to be used with eglot, here is my hack. You don't need to enable any minor mode, just call this command on the symbol. (In fact, I don’t even use =eldoc-box-hover-mode= anymore. I bind this hack to =C-h C-h= and lived happily ever after.)
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defun eldoc-box-hack-cleanup ()
|
|
||||||
"Try to clean up the childframe made by eldoc-box hack."
|
|
||||||
(if (eq (point) eldoc-box-hack-last-point)
|
|
||||||
(run-with-timer 0.1 nil #'eldoc-box-hack-cleanup)
|
|
||||||
(eldoc-box-quit-frame)))
|
|
||||||
|
|
||||||
(defun moon-help-at-point ()
|
<<command>>
|
||||||
(interactive)
|
Eldoc-box also provides a convenient command =eldoc-box-eglot-help-at-point=. Calling this command on a symbol displays a documentation childframe at point. No need to enable any minor mode for this.
|
||||||
(when eglot--managed-mode
|
|
||||||
(require 'eldoc-box)
|
|
||||||
(let ((eldoc-box-position-function #'eldoc-box--default-at-point-position-function))
|
|
||||||
(eldoc-box--display
|
|
||||||
(eglot--dbind ((Hover) contents range)
|
|
||||||
(jsonrpc-request (eglot--current-server-or-lose) :textDocument/hover
|
|
||||||
(eglot--TextDocumentPositionParams))
|
|
||||||
(when (seq-empty-p contents) (eglot--error "No hover info here"))
|
|
||||||
(eglot--hover-info contents range))))
|
|
||||||
(setq eldoc-box-hack-last-point (point))
|
|
||||||
(run-with-timer 0.1 nil #'eldoc-box-hack-cleanup)))
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
* Contributors
|
* Contributors
|
||||||
- [[https://github.com/joaotavora][João Távora]]
|
- [[https://github.com/joaotavora][João Távora]]
|
||||||
|
30
eldoc-box.el
30
eldoc-box.el
@ -320,6 +320,36 @@ Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'."
|
|||||||
(run-with-timer eldoc-box-cleanup-interval nil #'eldoc-box--maybe-cleanup))))
|
(run-with-timer eldoc-box-cleanup-interval nil #'eldoc-box--maybe-cleanup))))
|
||||||
t))
|
t))
|
||||||
|
|
||||||
|
;;;; Eglot helper
|
||||||
|
|
||||||
|
(defvar eldoc-box-eglot-help-at-point-last-point 0
|
||||||
|
"This point cache is used by clean up function.
|
||||||
|
If (point) != last point, cleanup frame.")
|
||||||
|
|
||||||
|
(defun eldoc-box--eglot-help-at-point-cleanup ()
|
||||||
|
"Try to clean up the childframe made by eldoc-box hack."
|
||||||
|
(if (eq (point) eldoc-box-eglot-help-at-point-last-point)
|
||||||
|
(run-with-timer 0.1 nil #'eldoc-box--eglot-help-at-point-cleanup)
|
||||||
|
(eldoc-box-quit-frame)))
|
||||||
|
|
||||||
|
(defvar eglot--managed-mode)
|
||||||
|
(declare-function eglot--dbind "eglot.el")
|
||||||
|
|
||||||
|
|
||||||
|
(defun eldoc-box-eglot-help-at-point ()
|
||||||
|
"Display documentation of the symbol at point."
|
||||||
|
(interactive)
|
||||||
|
(when eglot--managed-mode
|
||||||
|
(let ((eldoc-box-position-function #'eldoc-box--default-at-point-position-function))
|
||||||
|
(eldoc-box--display
|
||||||
|
(eglot--dbind ((Hover) contents range)
|
||||||
|
(jsonrpc-request (eglot--current-server-or-lose) :textDocument/hover
|
||||||
|
(eglot--TextDocumentPositionParams))
|
||||||
|
(when (seq-empty-p contents) (eglot--error "No hover info here"))
|
||||||
|
(eglot--hover-info contents range))))
|
||||||
|
(setq eldoc-box-eglot-help-at-point-last-point (point))
|
||||||
|
(run-with-timer 0.1 nil #'eldoc-box--eglot-help-at-point-cleanup)))
|
||||||
|
|
||||||
(provide 'eldoc-box)
|
(provide 'eldoc-box)
|
||||||
|
|
||||||
;;; eldoc-box.el ends here
|
;;; eldoc-box.el ends here
|
||||||
|
Loading…
Reference in New Issue
Block a user