Commit 150f39ee authored by Lars Hansen's avatar Lars Hansen

(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.
parent ff59904a
...@@ -198,7 +198,7 @@ Feature: Saving `kill-ring' implies saving `kill-ring-yank-pointer'." ...@@ -198,7 +198,7 @@ Feature: Saving `kill-ring' implies saving `kill-ring-yank-pointer'."
search-ring-yank-pointer search-ring-yank-pointer
regexp-search-ring regexp-search-ring
regexp-search-ring-yank-pointer) regexp-search-ring-yank-pointer)
"List of global variables to clear by `desktop-clear'. "List of global variables that `desktop-clear' will clear.
An element may be variable name (a symbol) or a cons cell of the form An element may be variable name (a symbol) or a cons cell of the form
\(VAR . FORM). Symbols are set to nil and for cons cells VAR is set \(VAR . FORM). Symbols are set to nil and for cons cells VAR is set
to the value obtained by evaluateing FORM." to the value obtained by evaluateing FORM."
...@@ -267,6 +267,27 @@ Possible values are: ...@@ -267,6 +267,27 @@ Possible values are:
:group 'desktop :group 'desktop
:version "21.4") :version "21.4")
(defcustom desktop-restore-eager t
"Number of buffers to restore immediately.
Remaining buffers are restored lazily (when Emacs is idle).
If value is t, all buffers are restored immediately."
:type '(choise (const t) integer)
:group 'desktop
:version "21.4")
(defcustom desktop-lazy-verbose t
"Verbose reporting of lazily created buffers."
:type 'boolean
:group 'desktop
:version "21.4")
(defcustom desktop-lazy-idle-delay 5
"Idle delay before starting to create buffers.
See `desktop-restore-eager'."
:type 'integer
:group 'desktop
:version "21.4")
;;;###autoload ;;;###autoload
(defvar desktop-save-buffer nil (defvar desktop-save-buffer nil
"When non-nil, save buffer status in desktop file. "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,6 +386,7 @@ This kills all buffers except for internal ones and those matching
`desktop-clear-preserve-buffers'. Furthermore, it clears the `desktop-clear-preserve-buffers'. Furthermore, it clears the
variables listed in `desktop-globals-to-clear'." variables listed in `desktop-globals-to-clear'."
(interactive) (interactive)
(desktop-lazy-abort)
(dolist (var desktop-globals-to-clear) (dolist (var desktop-globals-to-clear)
(if (symbolp var) (if (symbolp var)
(eval `(setq-default ,var nil)) (eval `(setq-default ,var nil))
...@@ -625,6 +647,7 @@ See also `desktop-base-file-name'." ...@@ -625,6 +647,7 @@ See also `desktop-base-file-name'."
(setq locals (cdr locals))) (setq locals (cdr locals)))
ll))) ll)))
(buffer-list))) (buffer-list)))
(eager desktop-restore-eager)
(buf (get-buffer-create "*desktop*"))) (buf (get-buffer-create "*desktop*")))
(set-buffer buf) (set-buffer buf)
(erase-buffer) (erase-buffer)
...@@ -645,14 +668,21 @@ See also `desktop-base-file-name'." ...@@ -645,14 +668,21 @@ See also `desktop-base-file-name'."
(insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n") (insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n")
(mapc #'(lambda (l) (mapc #'(lambda (l)
(if (apply 'desktop-save-buffer-p l) (when (apply 'desktop-save-buffer-p l)
(progn (insert "("
(insert "(desktop-create-buffer " desktop-file-version) (if (or (not (integerp eager))
(mapc #'(lambda (e) (unless (zerop eager)
(insert "\n " (desktop-value-to-string e))) (setq eager (1- eager))
l) t))
(insert ")\n\n")))) "desktop-create-buffer"
info) "desktop-append-buffer-args")
" "
desktop-file-version)
(mapc #'(lambda (e)
(insert "\n " (desktop-value-to-string e)))
l)
(insert ")\n\n")))
info)
(setq default-directory dirname) (setq default-directory dirname)
(when (file-exists-p filename) (delete-file filename)) (when (file-exists-p filename) (delete-file filename))
(let ((coding-system-for-write 'emacs-mule)) (let ((coding-system-for-write 'emacs-mule))
...@@ -670,6 +700,11 @@ This function also sets `desktop-dirname' to nil." ...@@ -670,6 +700,11 @@ This function also sets `desktop-dirname' to nil."
(when (file-exists-p filename) (when (file-exists-p filename)
(delete-file filename))))) (delete-file filename)))))
(defvar desktop-buffer-args-list nil
"List of args for `desktop-create-buffer'.")
(defvar desktop-lazy-timer nil)
;; ---------------------------------------------------------------------------- ;; ----------------------------------------------------------------------------
;;;###autoload ;;;###autoload
(defun desktop-read (&optional dirname) (defun desktop-read (&optional dirname)
...@@ -706,6 +741,7 @@ It returns t if a desktop file was loaded, nil otherwise." ...@@ -706,6 +741,7 @@ It returns t if a desktop file was loaded, nil otherwise."
(let ((desktop-first-buffer nil) (let ((desktop-first-buffer nil)
(desktop-buffer-ok-count 0) (desktop-buffer-ok-count 0)
(desktop-buffer-fail-count 0)) (desktop-buffer-fail-count 0))
(setq desktop-lazy-timer nil)
;; Evaluate desktop buffer. ;; Evaluate desktop buffer.
(load (expand-file-name desktop-base-file-name desktop-dirname) t t t) (load (expand-file-name desktop-base-file-name desktop-dirname) t t t)
;; `desktop-create-buffer' puts buffers at end of the buffer list. ;; `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,11 +753,15 @@ It returns t if a desktop file was loaded, nil otherwise."
(run-hooks 'desktop-delay-hook) (run-hooks 'desktop-delay-hook)
(setq desktop-delay-hook nil) (setq desktop-delay-hook nil)
(run-hooks 'desktop-after-read-hook) (run-hooks 'desktop-after-read-hook)
(message "Desktop: %d buffer%s restored%s." (message "Desktop: %d buffer%s restored%s%s."
desktop-buffer-ok-count desktop-buffer-ok-count
(if (= 1 desktop-buffer-ok-count) "" "s") (if (= 1 desktop-buffer-ok-count) "" "s")
(if (< 0 desktop-buffer-fail-count) (if (< 0 desktop-buffer-fail-count)
(format ", %d failed to restore" desktop-buffer-fail-count) (format ", %d failed to restore" desktop-buffer-fail-count)
"")
(if desktop-buffer-args-list
(format ", %d to restore lazily"
(length desktop-buffer-args-list))
"")) ""))
t) t)
;; No desktop file found. ;; No desktop file found.
...@@ -917,6 +957,69 @@ directory DIRNAME." ...@@ -917,6 +957,69 @@ directory DIRNAME."
(cons 'case-replace cr) (cons 'case-replace cr)
(cons 'overwrite-mode (car mim))))) (cons 'overwrite-mode (car mim)))))
(defun desktop-append-buffer-args (&rest args)
"Append ARGS at end of `desktop-buffer-args-list'
ARGS must be an argument list for `desktop-create-buffer'."
(setq desktop-buffer-args-list (nconc desktop-buffer-args-list (list args)))
(unless desktop-lazy-timer
(setq desktop-lazy-timer
(run-with-idle-timer desktop-lazy-idle-delay t 'desktop-idle-create-buffers))))
(defun desktop-lazy-create-buffer ()
"Pop args from `desktop-buffer-args-list', create buffer and bury it."
(when desktop-buffer-args-list
(let* ((remaining (length desktop-buffer-args-list))
(args (pop desktop-buffer-args-list))
(buffer-name (nth 2 args))
(msg (format "Desktop lazily opening %s (%s remaining)..."
buffer-name remaining)))
(when desktop-lazy-verbose
(message msg))
(let ((desktop-first-buffer nil)
(desktop-buffer-ok-count 0)
(desktop-buffer-fail-count 0))
(apply 'desktop-create-buffer args)
(run-hooks 'desktop-delay-hook)
(setq desktop-delay-hook nil)
(bury-buffer (get-buffer buffer-name))
(when desktop-lazy-verbose
(message "%s%s" msg (if (> desktop-buffer-ok-count 0) "done" "failed")))))))
(defun desktop-idle-create-buffers ()
"Create buffers until the user does something, then stop.
If there are no buffers left to create, kill the timer."
(let ((repeat 1))
(while (and repeat desktop-buffer-args-list)
(save-window-excursion
(desktop-lazy-create-buffer))
(setq repeat (sit-for 0.2))
(unless desktop-buffer-args-list
(cancel-timer desktop-lazy-timer)
(setq desktop-lazy-timer nil)
(message "Lazy desktop load complete")
(sit-for 3)
(message "")))))
(defun desktop-lazy-complete ()
"Run the desktop load to completion."
(interactive)
(let ((desktop-lazy-verbose t))
(while desktop-buffer-args-list
(save-window-excursion
(desktop-lazy-create-buffer)))
(message "Lazy desktop load complete")))
(defun desktop-lazy-abort ()
"Abort lazy loading of the desktop."
(interactive)
(when desktop-lazy-timer
(cancel-timer desktop-lazy-timer)
(setq desktop-lazy-timer nil))
(when desktop-buffer-args-list
(setq desktop-buffer-args-list nil)
(when (interactive-p)
(message "Lazy desktop load aborted"))))
;; ---------------------------------------------------------------------------- ;; ----------------------------------------------------------------------------
;; When `desktop-save-mode' is non-nil and "--no-desktop" is not specified on the ;; When `desktop-save-mode' is non-nil and "--no-desktop" is not specified on the
;; command line, we do the rest of what it takes to use desktop, but do it ;; command line, we do the rest of what it takes to use desktop, but do it
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment