From fcfd701f57fcb6e22162292df3ac61f89a29b5d1 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Wed, 12 Dec 2018 01:58:56 -0500 Subject: [PATCH] Manager the global timer gracefully Don't cancel and create new timers naively. Only cancel timer (and set to nil) when there is no live buffer with eldoc-box-hover-mode enabled; and only create new timer when none exists. --- eldoc-box.el | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/eldoc-box.el b/eldoc-box.el index f15ffe7..806d4d1 100644 --- a/eldoc-box.el +++ b/eldoc-box.el @@ -198,6 +198,16 @@ Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'." (when (frame-parameter eldoc-box--frame 'visibility) (eldoc-box-quit-frame)))) +(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) "Frontend for eldoc. Display STR in childframe and ARGS works like `message'." (if (stringp str) @@ -215,10 +225,15 @@ Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'." ;; Why a timer? ElDoc is mainly use in minibuffer, ;; where the text is constantly being flushed by other commands ;; so ElDoc doesn't try very hard to cleanup - (setq eldoc-box--cleanup-timer (run-with-idle-timer 1 t #'eldoc-box--maybe-cleanup)) + (unless eldoc-box--cleanup-timer + (setq eldoc-box--cleanup-timer (run-with-idle-timer 1 t #'eldoc-box--maybe-cleanup))) + (add-to-list 'eldoc-box--enabled-buffer-list (current-buffer)) (setq-local eldoc-message-function #'eldoc-box--eldoc-message-function)) (setq-local eldoc-message-function #'eldoc-minibuffer-message) - (when eldoc-box--cleanup-timer (cancel-timer eldoc-box--cleanup-timer)) + (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)))