summaryrefslogtreecommitdiff
path: root/lisp/use-package
diff options
context:
space:
mode:
authorFrançois Févotte <fevotte@gmail.com>2014-03-17 09:56:10 +0100
committerFrançois Févotte <fevotte@gmail.com>2014-03-17 10:03:06 +0100
commit6b30c15823d34e90e9d88aa945780c76db39323e (patch)
tree641b57c48cb7c7a103f4b3fa457a8c177e97df21 /lisp/use-package
parentc7ff48009522cb2ad525485c124e80f232e4392c (diff)
downloademacs-6b30c15823d34e90e9d88aa945780c76db39323e.tar.gz
emacs-6b30c15823d34e90e9d88aa945780c76db39323e.tar.bz2
emacs-6b30c15823d34e90e9d88aa945780c76db39323e.zip
:idle-priority keyword to change the running order of idle functions
Lower-priority idle functions are run first. Idle functions with no specified priority default to 5 and all functions with the same priority are run in the order in which they are evaluated, meaning the behaviour is backwards compatible. Updated documentation as well.
Diffstat (limited to 'lisp/use-package')
-rw-r--r--lisp/use-package/use-package.el45
1 files changed, 37 insertions, 8 deletions
diff --git a/lisp/use-package/use-package.el b/lisp/use-package/use-package.el
index 2523921a1f4..a4973fbf627 100644
--- a/lisp/use-package/use-package.el
+++ b/lisp/use-package/use-package.el
@@ -75,7 +75,7 @@
(put 'use-package-with-elapsed-timer 'lisp-indent-function 1)
(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 ()
"Ensure that the idle timer is running."
@@ -85,17 +85,38 @@
3 t
'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."
(use-package-start-idle-timer)
- (if use-package-idle-forms
- (add-to-list 'use-package-idle-forms
- form t)
- (setq use-package-idle-forms (list form))))
+ (puthash priority
+ (append (gethash priority 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()
"Start to eval idle-commands from the idle queue."
- (let ((next (pop use-package-idle-forms)))
+ (let ((next (use-package-idle-pop)))
(if next
(progn
(when use-package-verbose
@@ -130,6 +151,7 @@
:disabled
:ensure
:idle
+ :idle-priority
:if
:init
:interpreter
@@ -233,6 +255,10 @@ For full documentation. please see commentary.
:load-path Add to `load-path' before loading.
:diminish Support for diminish package (if it's installed).
: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."
(use-package-validate-keywords args) ; error if any bad keyword, ignore result
(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))
(defines (use-package-plist-get-value args :defines))
(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))
(mode (use-package-plist-get-value args :mode))
(mode-alist
@@ -306,10 +333,12 @@ For full documentation. please see commentary.
(when idle-body
+ (when (null idle-priority)
+ (setq idle-priority 5))
(setq init-body
`(progn
(require 'use-package)
- (use-package-init-on-idle (lambda () ,idle-body))
+ (use-package-init-on-idle (lambda () ,idle-body) ,idle-priority)
,init-body)))