Merge pull request #2 from joaotavora/master
Misc cleanup to eldoc-box - Define customization group - Simplify timer management - Rearrange to make compiler happy - Reformat header
This commit is contained in:
commit
27605bd370
70
eldoc-box.el
70
eldoc-box.el
@ -1,11 +1,11 @@
|
|||||||
;;; eldoc-box.el --- Display documentation in childframe -*- lexical-binding: t; -*-
|
;;; eldoc-box.el --- Display documentation in childframe -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
;; Copyright (C) 2017 Sebastien Chapuis
|
;; Copyright (C) 2017-2018 Sebastien Chapuis, 2018 Yuan Fu
|
||||||
|
|
||||||
;; Version: 1.0
|
;; Version: 1.0
|
||||||
|
|
||||||
;; Author: Sebastien Chapuis <sebastien@chapu.is>
|
;; Author: Sebastien Chapuis <sebastien@chapu.is>
|
||||||
;; Yuan Fu <casouri@gmail.com> made a lot of change to use it for ElDoc
|
;; Maintainer: Yuan Fu <casouri@gmail.com>
|
||||||
;; URL: https://github.com/casouri/eldoc-box
|
;; URL: https://github.com/casouri/eldoc-box
|
||||||
;; Package-Requires: ((emacs "26.1"))
|
;; Package-Requires: ((emacs "26.1"))
|
||||||
|
|
||||||
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;
|
;;
|
||||||
|
;; Made a lot of change to use it for ElDoc
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
;;
|
;;
|
||||||
@ -38,6 +39,10 @@
|
|||||||
|
|
||||||
;;;; Userland
|
;;;; Userland
|
||||||
;;;;; Variable
|
;;;;; Variable
|
||||||
|
(defgroup eldoc-box nil
|
||||||
|
"Display Eldoc docs in a pretty child frame."
|
||||||
|
:prefix "eldoc-box-"
|
||||||
|
:group 'eldoc)
|
||||||
|
|
||||||
(defface eldoc-box-border '((((background dark)) . (:background "white"))
|
(defface eldoc-box-border '((((background dark)) . (:background "white"))
|
||||||
(((background light)) . (:background "black")))
|
(((background light)) . (:background "black")))
|
||||||
@ -95,6 +100,9 @@
|
|||||||
(eldoc-box--inject-quit-func))
|
(eldoc-box--inject-quit-func))
|
||||||
(message "No documentation available"))))
|
(message "No documentation available"))))
|
||||||
|
|
||||||
|
(defvar eldoc-box--frame nil ;; A backstage variable
|
||||||
|
"The frame to display doc.")
|
||||||
|
|
||||||
(defun eldoc-box-quit-frame ()
|
(defun eldoc-box-quit-frame ()
|
||||||
"Hide childframe used by eglot doc."
|
"Hide childframe used by eglot doc."
|
||||||
(interactive)
|
(interactive)
|
||||||
@ -104,10 +112,6 @@
|
|||||||
|
|
||||||
;;;; Backstage
|
;;;; Backstage
|
||||||
;;;;; Variable
|
;;;;; Variable
|
||||||
|
|
||||||
(defvar eldoc-box--frame nil
|
|
||||||
"The frame to display doc.")
|
|
||||||
|
|
||||||
(defvar eldoc-box--buffer "*eldoc-box*"
|
(defvar eldoc-box--buffer "*eldoc-box*"
|
||||||
"The buffer used to display eglot doc.")
|
"The buffer used to display eglot doc.")
|
||||||
|
|
||||||
@ -181,6 +185,17 @@ Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'."
|
|||||||
(setq eldoc-box--frame frame)))
|
(setq eldoc-box--frame frame)))
|
||||||
|
|
||||||
;;;;; ElDoc
|
;;;;; ElDoc
|
||||||
|
(define-minor-mode eldoc-box-hover-mode
|
||||||
|
"Displays hover documentations in a childframe. This mode is buffer local."
|
||||||
|
:lighter " ELDOC-BOX"
|
||||||
|
(if eldoc-box-hover-mode
|
||||||
|
(add-function :before-until (local 'eldoc-message-function)
|
||||||
|
#'eldoc-box--eldoc-message-function)
|
||||||
|
(remove-function (local 'eldoc-message-function) #'eldoc-box--eldoc-message-function)
|
||||||
|
;; if minor mode is turned off when childframe is visible
|
||||||
|
;; hide it
|
||||||
|
(eldoc-box-quit-frame)))
|
||||||
|
|
||||||
(defvar eldoc-box--cleanup-timer nil
|
(defvar eldoc-box--cleanup-timer nil
|
||||||
"The timer used to cleanup childframe after ElDoc.")
|
"The timer used to cleanup childframe after ElDoc.")
|
||||||
|
|
||||||
@ -196,48 +211,23 @@ Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'."
|
|||||||
;; shut it off. this code can save you
|
;; shut it off. this code can save you
|
||||||
;; this is gold, right here, you know it my friend?
|
;; this is gold, right here, you know it my friend?
|
||||||
(when (frame-parameter eldoc-box--frame 'visibility)
|
(when (frame-parameter eldoc-box--frame 'visibility)
|
||||||
(eldoc-box-quit-frame))))
|
(eldoc-box-quit-frame)))
|
||||||
|
(setq eldoc-box--cleanup-timer nil))
|
||||||
(defvar eldoc-box--enabled-buffer-list nil
|
|
||||||
"A list of buffers that enabled `eldoc-box-hover-mode'.")
|
|
||||||
|
|
||||||
(defun eldoc-box--maybe-cancel-timer ()
|
|
||||||
"Cancel `eldoc-box--cleanup-timer' there is no live buffer with `eldoc-box-hover-mode' enabled left."
|
|
||||||
(when (and eldoc-box--cleanup-timer
|
|
||||||
(eq (cl-count-if #'buffer-live-p eldoc-box--enabled-buffer-list) 0))
|
|
||||||
(cancel-timer eldoc-box--cleanup-timer)
|
|
||||||
(setq eldoc-box--cleanup-timer nil)))
|
|
||||||
|
|
||||||
(defun eldoc-box--eldoc-message-function (str &rest args)
|
(defun eldoc-box--eldoc-message-function (str &rest args)
|
||||||
"Frontend for eldoc. Display STR in childframe and ARGS works like `message'."
|
"Frontend for eldoc. Display STR in childframe and ARGS works like `message'."
|
||||||
(if (stringp str)
|
(if (stringp str)
|
||||||
(let ((doc (apply #'format str args)))
|
(let ((doc (apply #'format str args)))
|
||||||
(if (and eldoc-box-only-multi-line (eq (cl-count ?\n doc) 0))
|
(unless (and eldoc-box-only-multi-line (eq (cl-count ?\n doc) 0))
|
||||||
(apply #'eldoc-minibuffer-message str args)
|
(eldoc-box--display (apply #'format str args))
|
||||||
(eldoc-box--display (apply #'format str args))))
|
|
||||||
(eldoc-box-quit-frame)))
|
|
||||||
|
|
||||||
(define-minor-mode eldoc-box-hover-mode
|
|
||||||
"Displays hover documentations in a childframe. This mode is buffer local."
|
|
||||||
:lighter " ELDOC-BOX"
|
|
||||||
(if eldoc-box-hover-mode
|
|
||||||
(progn
|
|
||||||
;; Why a timer? ElDoc is mainly use in minibuffer,
|
;; Why a timer? ElDoc is mainly use in minibuffer,
|
||||||
;; where the text is constantly being flushed by other commands
|
;; where the text is constantly being flushed by other commands
|
||||||
;; so ElDoc doesn't try very hard to cleanup
|
;; so ElDoc doesn't try very hard to cleanup
|
||||||
(unless eldoc-box--cleanup-timer
|
(when eldoc-box--cleanup-timer (cancel-timer eldoc-box--cleanup-timer))
|
||||||
(setq eldoc-box--cleanup-timer (run-with-idle-timer 1 t #'eldoc-box--maybe-cleanup)))
|
(setq eldoc-box--cleanup-timer
|
||||||
(add-to-list 'eldoc-box--enabled-buffer-list (current-buffer))
|
(run-with-timer 1 nil #'eldoc-box--maybe-cleanup))))
|
||||||
(setq-local eldoc-message-function #'eldoc-box--eldoc-message-function))
|
(eldoc-box-quit-frame)
|
||||||
(setq-local eldoc-message-function #'eldoc-minibuffer-message)
|
t))
|
||||||
(delete (current-buffer) eldoc-box--enabled-buffer-list)
|
|
||||||
;; this function has to be called after the current buffer is
|
|
||||||
;; removed from buffer list
|
|
||||||
(eldoc-box--maybe-cancel-timer)
|
|
||||||
;; if minor mode is turned off when childframe is visible
|
|
||||||
;; hide it
|
|
||||||
(eldoc-box-quit-frame)))
|
|
||||||
|
|
||||||
|
|
||||||
(provide 'eldoc-box)
|
(provide 'eldoc-box)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user