Merge pull request from ffevotte/idle-priority

Add a :idle-priority keyword to change the running order of idle functions
GitHub-reference: https://github.com/jwiegley/use-package/issues/98
This commit is contained in:
John Wiegley 2014-03-17 04:11:36 -05:00
commit db9cba9a31

View file

@ -75,7 +75,7 @@
(put 'use-package-with-elapsed-timer 'lisp-indent-function 1) (put 'use-package-with-elapsed-timer 'lisp-indent-function 1)
(defvar use-package-idle-timer nil) (defvar use-package-idle-timer nil)
(defvar use-package-idle-forms nil) (defvar use-package-idle-forms (make-hash-table))
(defun use-package-start-idle-timer () (defun use-package-start-idle-timer ()
"Ensure that the idle timer is running." "Ensure that the idle timer is running."
@ -85,17 +85,38 @@
3 t 3 t
'use-package-idle-eval)))) 'use-package-idle-eval))))
(defun use-package-init-on-idle (form) (defun use-package-init-on-idle (form priority)
"Add a new form to the idle queue." "Add a new form to the idle queue."
(use-package-start-idle-timer) (use-package-start-idle-timer)
(if use-package-idle-forms (puthash priority
(add-to-list 'use-package-idle-forms (append (gethash priority use-package-idle-forms)
form t) (list form))
(setq use-package-idle-forms (list form)))) use-package-idle-forms))
(defun use-package-idle-priorities ()
"Get a list of all priorities in the idle queue.
The list is sorted in the order forms should be run."
(let ((priorities nil))
(maphash (lambda (priority forms)
(setq priorities (cons priority priorities)))
use-package-idle-forms)
(sort priorities '<)))
(defun use-package-idle-pop ()
"Pop the top-priority task from the idle queue.
Return nil when the queue is empty."
(let* ((priority (car (use-package-idle-priorities)))
(forms (gethash priority use-package-idle-forms))
(first-form (car forms))
(forms-remaining (cdr forms)))
(if forms-remaining
(puthash priority forms-remaining use-package-idle-forms)
(remhash priority use-package-idle-forms))
first-form))
(defun use-package-idle-eval() (defun use-package-idle-eval()
"Start to eval idle-commands from the idle queue." "Start to eval idle-commands from the idle queue."
(let ((next (pop use-package-idle-forms))) (let ((next (use-package-idle-pop)))
(if next (if next
(progn (progn
(when use-package-verbose (when use-package-verbose
@ -130,6 +151,7 @@
:disabled :disabled
:ensure :ensure
:idle :idle
:idle-priority
:if :if
:init :init
:interpreter :interpreter
@ -233,6 +255,10 @@ For full documentation. please see commentary.
:load-path Add to `load-path' before loading. :load-path Add to `load-path' before loading.
:diminish Support for diminish package (if it's installed). :diminish Support for diminish package (if it's installed).
:idle adds a form to run on an idle timer :idle adds a form to run on an idle timer
:idle-priority schedules the :idle form to run with the given
priority (lower priorities run first). Default priority
is 5; forms with the same priority are run in the order in
which they are evaluated.
:ensure loads package using package.el if necessary." :ensure loads package using package.el if necessary."
(use-package-validate-keywords args) ; error if any bad keyword, ignore result (use-package-validate-keywords args) ; error if any bad keyword, ignore result
(let* ((commands (use-package-plist-get args :commands)) (let* ((commands (use-package-plist-get args :commands))
@ -243,6 +269,7 @@ For full documentation. please see commentary.
(diminish-var (use-package-plist-get-value args :diminish)) (diminish-var (use-package-plist-get-value args :diminish))
(defines (use-package-plist-get-value args :defines)) (defines (use-package-plist-get-value args :defines))
(idle-body (use-package-plist-get args :idle)) (idle-body (use-package-plist-get args :idle))
(idle-priority (use-package-plist-get args :idle-priority))
(keybindings-alist (use-package-plist-get-value args :bind)) (keybindings-alist (use-package-plist-get-value args :bind))
(mode (use-package-plist-get-value args :mode)) (mode (use-package-plist-get-value args :mode))
(mode-alist (mode-alist
@ -306,10 +333,12 @@ For full documentation. please see commentary.
(when idle-body (when idle-body
(when (null idle-priority)
(setq idle-priority 5))
(setq init-body (setq init-body
`(progn `(progn
(require 'use-package) (require 'use-package)
(use-package-init-on-idle (lambda () ,idle-body)) (use-package-init-on-idle (lambda () ,idle-body) ,idle-priority)
,init-body))) ,init-body)))