diff options
| author | Lars Hansen | 2005-01-07 20:18:59 +0000 |
|---|---|---|
| committer | Lars Hansen | 2005-01-07 20:18:59 +0000 |
| commit | 150f39ee71b962c1970fad22cd1d4a6726eca09d (patch) | |
| tree | bce3479cffcf142ebfc5ca9e993a7a8232ab08b5 | |
| parent | ff59904afeadf91b9b0c101d273a46e5571fba9f (diff) | |
| download | emacs-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.el | 123 |
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. |
| 202 | An element may be variable name (a symbol) or a cons cell of the form | 202 | An 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 |
| 204 | to the value obtained by evaluateing FORM." | 204 | to 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. | ||
| 272 | Remaining buffers are restored lazily (when Emacs is idle). | ||
| 273 | If 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. | ||
| 286 | See `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 |
| 366 | variables listed in `desktop-globals-to-clear'." | 387 | variables 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' | ||
| 962 | ARGS 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. | ||
| 990 | If 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 |