;; (add-to-list 'desktop-minor-mode-handlers
;; '(bar-mode . bar-desktop-restore))
-;; in the module itself, and make sure that the mode function is
-;; autoloaded. See the docstrings of `desktop-buffer-mode-handlers' and
+;; in the module itself. The mode function must either be autoloaded,
+;; or of the form "foobar-mode" and defined in library "foobar", so that
+;; desktop can guess how to load its definition.
+;; See the docstrings of `desktop-buffer-mode-handlers' and
;; `desktop-minor-mode-handlers' for more info.
;; Minor modes.
it exits (this may prompt you; see the option `desktop-save'). The next
time Emacs starts, if this mode is active it will restore the desktop.
-To manually save the desktop at any time, use the command `M-x desktop-save'.
-To load it, use `M-x desktop-read'.
+To manually save the desktop at any time, use the command `\\[desktop-save]'.
+To load it, use `\\[desktop-read]'.
Once a desktop file exists, Emacs will auto-save it according to the
option `desktop-auto-save-timeout'.
(defun foo-restore-desktop-buffer
...
- (add-to-list 'desktop-buffer-mode-handlers
- '(foo-mode . foo-restore-desktop-buffer))
+ (add-to-list \\='desktop-buffer-mode-handlers
+ \\='(foo-mode . foo-restore-desktop-buffer))
-Furthermore the major mode function must be autoloaded.")
+The major mode function must either be autoloaded, or of the form
+\"foobar-mode\" and defined in library \"foobar\", so that desktop
+can guess how to load the mode's definition.")
;;;###autoload
(put 'desktop-buffer-mode-handlers 'risky-local-variable t)
(defun foo-desktop-restore
...
- (add-to-list 'desktop-minor-mode-handlers
- '(foo-mode . foo-desktop-restore))
+ (add-to-list \\='desktop-minor-mode-handlers
+ \\='(foo-mode . foo-desktop-restore))
-Furthermore the minor mode function must be autoloaded.
+The minor mode function must either be autoloaded, or of the form
+\"foobar-mode\" and defined in library \"foobar\", so that desktop
+can guess how to load the mode's definition.
See also `desktop-minor-mode-table'.")
nil)))
(defun desktop-load-file (function)
- "Load the file where auto loaded FUNCTION is defined."
- (when (fboundp function)
- (autoload-do-load (symbol-function function) function)))
+ "Load the file where auto loaded FUNCTION is defined.
+If FUNCTION is not currently defined, guess the library that defines it
+and try to load that."
+ (if (fboundp function)
+ (autoload-do-load (symbol-function function) function)
+ ;; Guess that foobar-mode is defined in foobar.
+ ;; TODO rather than guessing or requiring an autoload, the desktop
+ ;; file should record the name of the library.
+ (let ((name (symbol-name function)))
+ (if (string-match "\\`\\(.*\\)-mode\\'" name)
+ (with-demoted-errors "Require error in desktop-load-file: %S"
+ (require (intern (match-string 1 name)) nil t))))))
;; ----------------------------------------------------------------------------
;; Create a buffer, load its file, set its mode, ...;
(dolist (record compacted-vars)
(let*
((var (car record))
- (deser-fun (cl-caddr (assq var desktop-var-serdes-funs))))
+ (deser-fun (nth 2 (assq var desktop-var-serdes-funs))))
(if deser-fun (set var (funcall deser-fun (cadr record))))))))
result))))
(desktop-read)
(setq inhibit-startup-screen t)))))
-;; So we can restore vc-dir buffers.
-(autoload 'vc-dir-mode "vc-dir" nil t)
-
(provide 'desktop)
;;; desktop.el ends here
-
-;; Local Variables:
-;; coding: utf-8
-;; End: