+2000-10-13 John Wiegley <johnw@gnu.org>
+
+ * desktop.el (desktop-buffer-modes-to-save): Added a global for
+ specifying what "other" kinds of buffers should be saved. This
+ used to be hard-coded.
+ (desktop-buffer-misc-functions): A global for specifying how
+ auxiliary data should be determined for special buffer types.
+ (desktop-save-buffer-p): Use `desktop-buffer-modes-to-save',
+ instead of hard-coding the special buffer types.
+ (desktop-save): Run `desktop-buffer-misc-functions' to gather
+ auxiliary data, instead of hard-coding for Info buffers and dired.
+ (desktop-buffer-info-misc-data): Aux function for determining Info
+ buffer auxiliary info.
+ (desktop-buffer-dired-misc-data): Likewise, but for dired buffers.
+ (desktop-buffer-info): Changed this function to use the info
+ gathered above.
+ (desktop-create-buffer): Be a little more careful about what
+ `minor-mode' means before calling it. This is important for some
+ buffer types.
+
2000-10-13 John Wiegley <johnw@gnu.org>
* eshell/esh-util.el: Added a global form which declares an
;;; desktop.el --- save partial status of Emacs when killed
-;; Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1993, 1994, 1995, 1997, 2000 Free Software Foundation, Inc.
;; Author: Morten Welinder <terra@diku.dk>
;; Keywords: convenience
:type 'regexp
:group 'desktop)
+(defcustom desktop-buffer-modes-to-save
+ '(Info-mode rmail-mode)
+ "If a buffer is of one of these major modes, save the buffer name.
+It is up to the functions in `desktop-buffer-handlers' to decide
+whether the buffer should be recreated or not, and how."
+ :type '(repeat symbol)
+ :group 'desktop)
+
(defcustom desktop-modes-not-to-save nil
"List of major modes whose buffers should not be saved."
:type '(repeat symbol)
"When desktop creates a buffer, this holds a list of misc info.
It is used by the `desktop-buffer-handlers' functions.")
+(defcustom desktop-buffer-misc-functions
+ '(desktop-buffer-info-misc-data
+ desktop-buffer-dired-misc-data)
+ "*Functions used to determine auxiliary information for a buffer.
+These functions are called in order, with no arguments. If a function
+returns non-nil, its value is saved along with the desktop buffer for
+which it was called; no further functions will be called.
+
+Later, when desktop.el restores the buffers it has saved, each of the
+`desktop-buffer-handlers' functions will have access to a buffer local
+variable, named `desktop-buffer-misc', whose value is what the
+\"misc\" function returned previously."
+ :type '(repeat function)
+ :group 'desktop)
+
(defcustom desktop-buffer-handlers
'(desktop-buffer-dired
desktop-buffer-rmail
:type '(repeat function)
:group 'desktop)
+(put 'desktop-buffer-handlers 'risky-local-variable t)
+
(defvar desktop-create-buffer-form "(desktop-create-buffer 205"
"Opening of form for creation of new buffers.")
(not (string-match desktop-files-not-to-save
default-directory))))
(and (null filename)
- (memq mode '(Info-mode rmail-mode)))))))
+ (memq mode desktop-buffer-modes-to-save))))))
;; ----------------------------------------------------------------------------
(defun desktop-save (dirname)
"Save the Desktop file. Parameter DIRNAME specifies where to save desktop."
(point)
(list (mark t) mark-active)
buffer-read-only
- (cond ((eq major-mode 'Info-mode)
- (list Info-current-file
- Info-current-node))
- ((eq major-mode 'dired-mode)
- (cons
- (expand-file-name dired-directory)
- (cdr
- (nreverse
- (mapcar
- (function car)
- dired-subdir-alist))))))
+ (run-hook-with-args-until-success
+ 'desktop-buffer-misc-functions)
(let ((locals desktop-locals-to-save)
(loclist (buffer-local-variables))
(ll))
;; ----------------------------------------------------------------------------
;; Note: the following functions use the dynamic variable binding in Lisp.
;;
+(defun desktop-buffer-info-misc-data ()
+ (if (eq major-mode 'Info-mode)
+ (list Info-current-file
+ Info-current-node)))
+
+(defun desktop-buffer-dired-misc-data ()
+ (if (eq major-mode 'dired-mode)
+ (cons
+ (expand-file-name dired-directory)
+ (cdr
+ (nreverse
+ (mapcar
+ (function car)
+ dired-subdir-alist))))))
+
(defun desktop-buffer-info () "Load an info file."
(if (eq 'Info-mode desktop-buffer-major-mode)
(progn
- (require 'info)
- (Info-find-node (nth 0 desktop-buffer-misc) (nth 1 desktop-buffer-misc))
- (current-buffer))))
+ (let ((first (nth 0 desktop-buffer-misc))
+ (second (nth 1 desktop-buffer-misc)))
+ (when (and first second)
+ (require 'info)
+ (Info-find-node first second)
+ (current-buffer))))))
;; ----------------------------------------------------------------------------
(defun desktop-buffer-rmail () "Load an RMAIL file."
(if (eq 'rmail-mode desktop-buffer-major-mode)
(cond ((equal '(t) mim) (auto-fill-mode 1)) ; backwards compatible
((equal '(nil) mim) (auto-fill-mode 0))
(t (mapcar #'(lambda (minor-mode)
- (when minor-mode (funcall minor-mode 1)))
+ (unless (or (eq minor-mode t) (eq minor-mode nil))
+ (if (and minor-mode (fboundp minor-mode))
+ (funcall minor-mode 1))))
mim)))
(goto-char pt)
(if (consp mk)