X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/63655c83146b773b4ef3d9220b4a9d61545fd050..2b34df4ebc935a834a77b930b35c4a42f7236440:/lisp/desktop.el diff --git a/lisp/desktop.el b/lisp/desktop.el index dd0e6adac3..01573be7db 100644 --- a/lisp/desktop.el +++ b/lisp/desktop.el @@ -1,7 +1,7 @@ ;;; 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 Free Software Foundation, Inc. ;; Author: Morten Welinder ;; Keywords: convenience @@ -9,10 +9,10 @@ ;; 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 @@ -20,9 +20,7 @@ ;; 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 . ;;; Commentary: @@ -42,7 +40,7 @@ ;; (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 @@ -84,7 +82,7 @@ ;; (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. @@ -167,7 +165,7 @@ and function `desktop-read' for details." (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. @@ -204,24 +202,25 @@ the normal hook `desktop-not-loaded-hook' is run." (const :tag "Don't load" nil) (const :tag "Ask the user" ask)) :group 'desktop - :version "23.1") + :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") "Name of lock file for Emacs desktop, excluding the directory part." :type 'file :group 'desktop - :version "23.1") + :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) @@ -253,7 +252,7 @@ May be used to deal with accidental multiple Emacs jobs." :type 'hook :group 'desktop :options '(desktop-save-mode-off save-buffers-kill-emacs) - :version "23.1") + :version "22.2") (defcustom desktop-after-read-hook nil "Normal hook run after a successful `desktop-read'. @@ -277,7 +276,8 @@ for example." 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 @@ -303,7 +303,7 @@ to the value obtained by evaluating FORM." (defcustom desktop-clear-preserve-buffers '("\\*scratch\\*" "\\*Messages\\*" "\\*server\\*" "\\*tramp/.+\\*") - "*List of buffers that `desktop-clear' should not delete. + "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." :type '(repeat string) @@ -333,19 +333,19 @@ modes are restored automatically; they should not be listed here." :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). @@ -356,7 +356,7 @@ modes are restored automatically; they should not be listed here." :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 ~. @@ -454,7 +454,9 @@ Furthermore the major mode function must be autoloaded.") (defcustom desktop-minor-mode-table '((auto-fill-function auto-fill-mode) (vc-mode nil) - (vc-dired-mode nil)) + (vc-dired-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 @@ -651,6 +653,8 @@ is nil, ask the user where to save the desktop." (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) (buffer-name) @@ -808,9 +812,12 @@ 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)) + (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)) (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 @@ -883,19 +890,23 @@ See also `desktop-base-file-name'." (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)) @@ -962,11 +973,11 @@ It returns t if a desktop file was loaded, nil otherwise." (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) @@ -1040,7 +1051,7 @@ directory DIRNAME." (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 @@ -1123,7 +1134,7 @@ directory DIRNAME." (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) @@ -1150,7 +1161,7 @@ directory DIRNAME." (setq desktop-first-buffer result)) (set-buffer result) (unless (equal (buffer-name) desktop-buffer-name) - (rename-buffer desktop-buffer-name)) + (rename-buffer desktop-buffer-name t)) ;; minor modes (cond ((equal '(t) desktop-buffer-minor-modes) ; backwards compatible (auto-fill-mode 1)) @@ -1269,7 +1280,7 @@ If there are no buffers left to create, kill the timer." (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")))) ;; ---------------------------------------------------------------------------- @@ -1285,7 +1296,9 @@ If there are no buffers left to create, kill the timer." (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)