aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Hansen2005-01-07 20:18:59 +0000
committerLars Hansen2005-01-07 20:18:59 +0000
commit150f39ee71b962c1970fad22cd1d4a6726eca09d (patch)
treebce3479cffcf142ebfc5ca9e993a7a8232ab08b5
parentff59904afeadf91b9b0c101d273a46e5571fba9f (diff)
downloademacs-150f39ee71b962c1970fad22cd1d4a6726eca09d.tar.gz
emacs-150f39ee71b962c1970fad22cd1d4a6726eca09d.zip
(desktop-restore-eager, desktop-lazy-verbose, desktop-lazy-idle-delay):
New customizable variables. (desktop-buffer-args-list): New variable. (desktop-append-buffer-args): New function. (desktop-save): Call desktop-append-buffer-args for some buffers. (desktop-lazy-create-buffer): New function. (desktop-idle-create-buffers): New function. (desktop-read): Add message about buffers to restore lazily. (desktop-lazy-abort): New command. (desktop-clear): Call desktop-lazy-abort. (desktop-lazy-complete): New command.
-rw-r--r--lisp/desktop.el123
1 files changed, 113 insertions, 10 deletions
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 1e4fa67d199..18bb638c045 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -198,7 +198,7 @@ Feature: Saving `kill-ring' implies saving `kill-ring-yank-pointer'."
198 search-ring-yank-pointer 198 search-ring-yank-pointer
199 regexp-search-ring 199 regexp-search-ring
200 regexp-search-ring-yank-pointer) 200 regexp-search-ring-yank-pointer)
201 "List of global variables to clear by `desktop-clear'. 201 "List of global variables that `desktop-clear' will clear.
202An element may be variable name (a symbol) or a cons cell of the form 202An element may be variable name (a symbol) or a cons cell of the form
203\(VAR . FORM). Symbols are set to nil and for cons cells VAR is set 203\(VAR . FORM). Symbols are set to nil and for cons cells VAR is set
204to the value obtained by evaluateing FORM." 204to the value obtained by evaluateing FORM."
@@ -267,6 +267,27 @@ Possible values are:
267 :group 'desktop 267 :group 'desktop
268 :version "21.4") 268 :version "21.4")
269 269
270(defcustom desktop-restore-eager t
271 "Number of buffers to restore immediately.
272Remaining buffers are restored lazily (when Emacs is idle).
273If value is t, all buffers are restored immediately."
274 :type '(choise (const t) integer)
275 :group 'desktop
276 :version "21.4")
277
278(defcustom desktop-lazy-verbose t
279 "Verbose reporting of lazily created buffers."
280 :type 'boolean
281 :group 'desktop
282 :version "21.4")
283
284(defcustom desktop-lazy-idle-delay 5
285 "Idle delay before starting to create buffers.
286See `desktop-restore-eager'."
287 :type 'integer
288 :group 'desktop
289 :version "21.4")
290
270;;;###autoload 291;;;###autoload
271(defvar desktop-save-buffer nil 292(defvar desktop-save-buffer nil
272 "When non-nil, save buffer status in desktop file. 293 "When non-nil, save buffer status in desktop file.
@@ -365,6 +386,7 @@ This kills all buffers except for internal ones and those matching
365`desktop-clear-preserve-buffers'. Furthermore, it clears the 386`desktop-clear-preserve-buffers'. Furthermore, it clears the
366variables listed in `desktop-globals-to-clear'." 387variables listed in `desktop-globals-to-clear'."
367 (interactive) 388 (interactive)
389 (desktop-lazy-abort)
368 (dolist (var desktop-globals-to-clear) 390 (dolist (var desktop-globals-to-clear)
369 (if (symbolp var) 391 (if (symbolp var)
370 (eval `(setq-default ,var nil)) 392 (eval `(setq-default ,var nil))
@@ -625,6 +647,7 @@ See also `desktop-base-file-name'."
625 (setq locals (cdr locals))) 647 (setq locals (cdr locals)))
626 ll))) 648 ll)))
627 (buffer-list))) 649 (buffer-list)))
650 (eager desktop-restore-eager)
628 (buf (get-buffer-create "*desktop*"))) 651 (buf (get-buffer-create "*desktop*")))
629 (set-buffer buf) 652 (set-buffer buf)
630 (erase-buffer) 653 (erase-buffer)
@@ -645,14 +668,21 @@ See also `desktop-base-file-name'."
645 668
646 (insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n") 669 (insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n")
647 (mapc #'(lambda (l) 670 (mapc #'(lambda (l)
648 (if (apply 'desktop-save-buffer-p l) 671 (when (apply 'desktop-save-buffer-p l)
649 (progn 672 (insert "("
650 (insert "(desktop-create-buffer " desktop-file-version) 673 (if (or (not (integerp eager))
651 (mapc #'(lambda (e) 674 (unless (zerop eager)
652 (insert "\n " (desktop-value-to-string e))) 675 (setq eager (1- eager))
653 l) 676 t))
654 (insert ")\n\n")))) 677 "desktop-create-buffer"
655 info) 678 "desktop-append-buffer-args")
679 " "
680 desktop-file-version)
681 (mapc #'(lambda (e)
682 (insert "\n " (desktop-value-to-string e)))
683 l)
684 (insert ")\n\n")))
685 info)
656 (setq default-directory dirname) 686 (setq default-directory dirname)
657 (when (file-exists-p filename) (delete-file filename)) 687 (when (file-exists-p filename) (delete-file filename))
658 (let ((coding-system-for-write 'emacs-mule)) 688 (let ((coding-system-for-write 'emacs-mule))
@@ -670,6 +700,11 @@ This function also sets `desktop-dirname' to nil."
670 (when (file-exists-p filename) 700 (when (file-exists-p filename)
671 (delete-file filename))))) 701 (delete-file filename)))))
672 702
703(defvar desktop-buffer-args-list nil
704 "List of args for `desktop-create-buffer'.")
705
706(defvar desktop-lazy-timer nil)
707
673;; ---------------------------------------------------------------------------- 708;; ----------------------------------------------------------------------------
674;;;###autoload 709;;;###autoload
675(defun desktop-read (&optional dirname) 710(defun desktop-read (&optional dirname)
@@ -706,6 +741,7 @@ It returns t if a desktop file was loaded, nil otherwise."
706 (let ((desktop-first-buffer nil) 741 (let ((desktop-first-buffer nil)
707 (desktop-buffer-ok-count 0) 742 (desktop-buffer-ok-count 0)
708 (desktop-buffer-fail-count 0)) 743 (desktop-buffer-fail-count 0))
744 (setq desktop-lazy-timer nil)
709 ;; Evaluate desktop buffer. 745 ;; Evaluate desktop buffer.
710 (load (expand-file-name desktop-base-file-name desktop-dirname) t t t) 746 (load (expand-file-name desktop-base-file-name desktop-dirname) t t t)
711 ;; `desktop-create-buffer' puts buffers at end of the buffer list. 747 ;; `desktop-create-buffer' puts buffers at end of the buffer list.
@@ -717,11 +753,15 @@ It returns t if a desktop file was loaded, nil otherwise."
717 (run-hooks 'desktop-delay-hook) 753 (run-hooks 'desktop-delay-hook)
718 (setq desktop-delay-hook nil) 754 (setq desktop-delay-hook nil)
719 (run-hooks 'desktop-after-read-hook) 755 (run-hooks 'desktop-after-read-hook)
720 (message "Desktop: %d buffer%s restored%s." 756 (message "Desktop: %d buffer%s restored%s%s."
721 desktop-buffer-ok-count 757 desktop-buffer-ok-count
722 (if (= 1 desktop-buffer-ok-count) "" "s") 758 (if (= 1 desktop-buffer-ok-count) "" "s")
723 (if (< 0 desktop-buffer-fail-count) 759 (if (< 0 desktop-buffer-fail-count)
724 (format ", %d failed to restore" desktop-buffer-fail-count) 760 (format ", %d failed to restore" desktop-buffer-fail-count)
761 "")
762 (if desktop-buffer-args-list
763 (format ", %d to restore lazily"
764 (length desktop-buffer-args-list))
725 "")) 765 ""))
726 t) 766 t)
727 ;; No desktop file found. 767 ;; No desktop file found.
@@ -917,6 +957,69 @@ directory DIRNAME."
917 (cons 'case-replace cr) 957 (cons 'case-replace cr)
918 (cons 'overwrite-mode (car mim))))) 958 (cons 'overwrite-mode (car mim)))))
919 959
960(defun desktop-append-buffer-args (&rest args)
961 "Append ARGS at end of `desktop-buffer-args-list'
962ARGS must be an argument list for `desktop-create-buffer'."
963 (setq desktop-buffer-args-list (nconc desktop-buffer-args-list (list args)))
964 (unless desktop-lazy-timer
965 (setq desktop-lazy-timer
966 (run-with-idle-timer desktop-lazy-idle-delay t 'desktop-idle-create-buffers))))
967
968(defun desktop-lazy-create-buffer ()
969 "Pop args from `desktop-buffer-args-list', create buffer and bury it."
970 (when desktop-buffer-args-list
971 (let* ((remaining (length desktop-buffer-args-list))
972 (args (pop desktop-buffer-args-list))
973 (buffer-name (nth 2 args))
974 (msg (format "Desktop lazily opening %s (%s remaining)..."
975 buffer-name remaining)))
976 (when desktop-lazy-verbose
977 (message msg))
978 (let ((desktop-first-buffer nil)
979 (desktop-buffer-ok-count 0)
980 (desktop-buffer-fail-count 0))
981 (apply 'desktop-create-buffer args)
982 (run-hooks 'desktop-delay-hook)
983 (setq desktop-delay-hook nil)
984 (bury-buffer (get-buffer buffer-name))
985 (when desktop-lazy-verbose
986 (message "%s%s" msg (if (> desktop-buffer-ok-count 0) "done" "failed")))))))
987
988(defun desktop-idle-create-buffers ()
989 "Create buffers until the user does something, then stop.
990If there are no buffers left to create, kill the timer."
991 (let ((repeat 1))
992 (while (and repeat desktop-buffer-args-list)
993 (save-window-excursion
994 (desktop-lazy-create-buffer))
995 (setq repeat (sit-for 0.2))
996 (unless desktop-buffer-args-list
997 (cancel-timer desktop-lazy-timer)
998 (setq desktop-lazy-timer nil)
999 (message "Lazy desktop load complete")
1000 (sit-for 3)
1001 (message "")))))
1002
1003(defun desktop-lazy-complete ()
1004 "Run the desktop load to completion."
1005 (interactive)
1006 (let ((desktop-lazy-verbose t))
1007 (while desktop-buffer-args-list
1008 (save-window-excursion
1009 (desktop-lazy-create-buffer)))
1010 (message "Lazy desktop load complete")))
1011
1012(defun desktop-lazy-abort ()
1013 "Abort lazy loading of the desktop."
1014 (interactive)
1015 (when desktop-lazy-timer
1016 (cancel-timer desktop-lazy-timer)
1017 (setq desktop-lazy-timer nil))
1018 (when desktop-buffer-args-list
1019 (setq desktop-buffer-args-list nil)
1020 (when (interactive-p)
1021 (message "Lazy desktop load aborted"))))
1022
920;; ---------------------------------------------------------------------------- 1023;; ----------------------------------------------------------------------------
921;; When `desktop-save-mode' is non-nil and "--no-desktop" is not specified on the 1024;; When `desktop-save-mode' is non-nil and "--no-desktop" is not specified on the
922;; command line, we do the rest of what it takes to use desktop, but do it 1025;; command line, we do the rest of what it takes to use desktop, but do it