;;; desktop.el --- save partial status of Emacs when killed
;; Copyright (C) 1993, 1994, 1995, 1997, 2000, 2001, 2002, 2003,
-;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;; Free Software Foundation, Inc.
;; Author: Morten Welinder <terra@diku.dk>
;; Keywords: convenience
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; (desktop-save-mode 1)
;;
;; For further usage information, look at the section
-;; "Saving Emacs Sessions" in the GNU Emacs Manual.
+;; (info "(emacs)Saving Emacs Sessions") in the GNU Emacs Manual.
;; When the desktop module is loaded, the function `desktop-kill' is
;; added to the `kill-emacs-hook'. This function is responsible for
;; (add-to-list 'desktop-minor-mode-handlers
;; '(bar-mode . bar-desktop-restore))
-;; in the module itself, and make shure that the mode function is
+;; in the module itself, and make sure that the mode function is
;; autoloaded. See the docstrings of `desktop-buffer-mode-handlers' and
;; `desktop-minor-mode-handlers' for more info.
;;; Code:
-(defvar uniquify-managed)
-
(defvar desktop-file-version "206"
"Version number of desktop file format.
Written into the desktop file and used at desktop read to provide
(desktop-save-mode 0))
(defcustom desktop-save 'ask-if-new
- "*Specifies whether the desktop should be saved when it is killed.
+ "Specifies whether the desktop should be saved when it is killed.
A desktop is killed when the user changes desktop or quits Emacs.
Possible values are:
t -- always save.
:group 'desktop
:version "22.2")
+(define-obsolete-variable-alias 'desktop-basefilename
+ 'desktop-base-file-name "22.1")
+
(defcustom desktop-base-file-name
(convert-standard-filename ".emacs.desktop")
"Name of file for Emacs desktop, excluding the directory part."
:type 'file
:group 'desktop)
-(define-obsolete-variable-alias 'desktop-basefilename
- 'desktop-base-file-name "22.1")
(defcustom desktop-base-lock-name
(convert-standard-filename ".emacs.desktop.lock")
:group 'desktop
:version "22.2")
-(defcustom desktop-path '("." "~")
+(defcustom desktop-path (list "." user-emacs-directory "~")
"List of directories to search for the desktop file.
The base name of the file is specified in `desktop-base-file-name'."
:type '(repeat directory)
:group 'desktop
- :version "22.1")
+ :version "23.2") ; user-emacs-directory added
(defcustom desktop-missing-file-warning nil
"If non-nil, offer to recreate the buffer of a deleted file.
tags-table-list
search-ring
regexp-search-ring
- register-alist)
+ register-alist
+ file-name-history)
"List of global variables saved by `desktop-save'.
An element may be variable name (a symbol) or a cons cell of the form
\(VAR . MAX-SIZE), which means to truncate VAR's value to at most
:version "22.1")
(defcustom desktop-clear-preserve-buffers
- '("\\*scratch\\*" "\\*Messages\\*" "\\*server\\*" "\\*tramp/.+\\*")
- "*List of buffers that `desktop-clear' should not delete.
+ '("\\*scratch\\*" "\\*Messages\\*" "\\*server\\*" "\\*tramp/.+\\*"
+ "\\*Warnings\\*")
+ "List of buffers that `desktop-clear' should not delete.
Each element is a regular expression. Buffers with a name matched by any of
these won't be deleted."
+ :version "23.3" ; added Warnings - bug#6336
:type '(repeat string)
:group 'desktop)
:type '(repeat symbol)
:group 'desktop)
-;; We skip .log files because they are normally temporary.
-;; (ftp) files because they require passwords and whatnot.
-(defcustom desktop-buffers-not-to-save
- "\\(^nn\\.a[0-9]+\\|\\.log\\|(ftp)\\)$"
+(defcustom desktop-buffers-not-to-save nil
"Regexp identifying buffers that are to be excluded from saving."
- :type 'regexp
+ :type '(choice (const :tag "None" nil)
+ regexp)
+ :version "23.2" ; set to nil
:group 'desktop)
;; Skip tramp and ange-ftp files
(defcustom desktop-files-not-to-save
- "^/[^/:]*:"
+ "\\(^/[^/:]*:\\|(ftp)$\\)"
"Regexp identifying files whose buffers are to be excluded from saving."
- :type 'regexp
+ :type '(choice (const :tag "None" nil)
+ regexp)
:group 'desktop)
;; We skip TAGS files to save time (tags-file-name is saved instead).
:group 'desktop)
(defcustom desktop-file-name-format 'absolute
- "*Format in which desktop file names should be saved.
+ "Format in which desktop file names should be saved.
Possible values are:
absolute -- Absolute file name.
tilde -- Relative to ~.
'((auto-fill-function auto-fill-mode)
(vc-mode nil)
(vc-dired-mode nil)
- (erc-track-minor-mode nil))
+ (erc-track-minor-mode nil)
+ (savehist-mode nil))
"Table mapping minor mode variables to minor mode functions.
Each entry has the form (NAME RESTORE-FUNCTION).
NAME is the name of the buffer-local variable indicating that the minor
(when (and desktop-save-mode
(let ((exists (file-exists-p (desktop-full-file-name))))
(or (eq desktop-save t)
- (and exists (memq desktop-save '(ask-if-new if-exists)))
+ (and exists (eq desktop-save 'if-exists))
+ ;; If it exists, but we aren't using it, we are going
+ ;; to ask for a new directory below.
+ (and exists desktop-dirname (eq desktop-save 'ask-if-new))
(and
(or (memq desktop-save '(ask ask-if-new))
(and exists (eq desktop-save 'ask-if-exists)))
value)))
;; ----------------------------------------------------------------------------
-;; check-declare does not work for defstructs.
-;;;(declare-function uniquify-item-base "uniquify" (cl-x))
-
(defun desktop-buffer-info (buffer)
(set-buffer buffer)
(list
+ ;; base name of the buffer; replaces the buffer name if managed by uniquify
+ (and (fboundp 'uniquify-buffer-base-name) (uniquify-buffer-base-name))
;; basic information
(desktop-file-name (buffer-file-name) desktop-dirname)
- (if (bound-and-true-p uniquify-managed)
- (uniquify-item-base (car uniquify-managed))
- (buffer-name))
+ (buffer-name)
major-mode
;; minor modes
(let (ret)
FILENAME is the visited file name, BUFNAME is the buffer name, and
MODE is the major mode.
\n\(fn FILENAME BUFNAME MODE)"
- (let ((case-fold-search nil))
- (and (not (string-match desktop-buffers-not-to-save bufname))
+ (let ((case-fold-search nil)
+ dired-skip)
+ (and (not (and (stringp desktop-buffers-not-to-save)
+ (not filename)
+ (string-match desktop-buffers-not-to-save bufname)))
(not (memq mode desktop-modes-not-to-save))
+ ;; FIXME this is broken if desktop-files-not-to-save is nil.
(or (and filename
+ (stringp desktop-files-not-to-save)
(not (string-match desktop-files-not-to-save filename)))
(and (eq mode 'dired-mode)
(with-current-buffer bufname
- (not (string-match desktop-files-not-to-save
- default-directory))))
+ (not (setq dired-skip
+ (string-match desktop-files-not-to-save
+ default-directory)))))
(and (null filename)
+ (null dired-skip) ; bug#5755
(with-current-buffer bufname desktop-save-buffer))))))
;; ----------------------------------------------------------------------------
((eq desktop-file-name-format 'local) (file-relative-name filename dirname))
(t (expand-file-name filename))))
+
;; ----------------------------------------------------------------------------
;;;###autoload
(defun desktop-save (dirname &optional release)
(insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n")
(dolist (l (mapcar 'desktop-buffer-info (buffer-list)))
- (when (apply 'desktop-save-buffer-p l)
- (insert "("
- (if (or (not (integerp eager))
- (if (zerop eager)
- nil
- (setq eager (1- eager))))
- "desktop-create-buffer"
- "desktop-append-buffer-args")
- " "
- desktop-file-version)
- (dolist (e l)
- (insert "\n " (desktop-value-to-string e)))
- (insert ")\n\n")))
+ (let ((base (pop l)))
+ (when (apply 'desktop-save-buffer-p l)
+ (insert "("
+ (if (or (not (integerp eager))
+ (if (zerop eager)
+ nil
+ (setq eager (1- eager))))
+ "desktop-create-buffer"
+ "desktop-append-buffer-args")
+ " "
+ desktop-file-version)
+ ;; If there's a non-empty base name, we save it instead of the buffer name
+ (when (and base (not (string= base "")))
+ (setcar (nthcdr 1 l) base))
+ (dolist (e l)
+ (insert "\n " (desktop-value-to-string e)))
+ (insert ")\n\n"))))
(setq default-directory desktop-dirname)
(let ((coding-system-for-write 'emacs-mule))
(or (null desktop-load-locked-desktop)
(not (y-or-n-p (format "Warning: desktop file appears to be in use by PID %s.\n\
Using it may cause conflicts. Use it anyway? " owner)))))
- (progn
- (let ((default-directory desktop-dirname))
- (run-hooks 'desktop-not-loaded-hook))
+ (let ((default-directory desktop-dirname))
(setq desktop-dirname nil)
- (message "Desktop file in use; not loaded."))
+ (run-hooks 'desktop-not-loaded-hook)
+ (unless desktop-dirname
+ (message "Desktop file in use; not loaded.")))
(desktop-lazy-abort)
;; Evaluate desktop buffer and remember when it was modified.
(load (desktop-full-file-name) t t t)
(if desktop-dirname
(desktop-save desktop-dirname)
(call-interactively 'desktop-save))
- (message "Desktop saved in %s" desktop-dirname))
+ (message "Desktop saved in %s" (abbreviate-file-name desktop-dirname)))
;; ----------------------------------------------------------------------------
;;;###autoload
(desktop-load-file desktop-buffer-major-mode)
(let ((buffer-list (buffer-list))
(result
- (condition-case err
+ (condition-case-no-debug err
(funcall (or (cdr (assq desktop-buffer-major-mode
desktop-buffer-mode-handlers))
'desktop-restore-file-buffer)
(setq desktop-lazy-timer nil))
(when desktop-buffer-args-list
(setq desktop-buffer-args-list nil)
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(message "Lazy desktop load aborted"))))
;; ----------------------------------------------------------------------------
(when (member key command-line-args)
(setq command-line-args (delete key command-line-args))
(setq desktop-save-mode nil)))
- (when desktop-save-mode (desktop-read))))
+ (when desktop-save-mode
+ (desktop-read)
+ (setq inhibit-startup-screen t))))
(provide 'desktop)