]> code.delx.au - gnu-emacs/blobdiff - lisp/desktop.el
lisp/*.el: Lexical-binding cleanup.
[gnu-emacs] / lisp / desktop.el
index 33e8cb1745fd279005fb42e1576c25cf8537a5fa..c60745a6b16012ca4d27aef2b03ee7565f075da2 100644 (file)
@@ -1,7 +1,6 @@
 ;;; desktop.el --- save partial status of Emacs when killed
 
-;; Copyright (C) 1993, 1994, 1995, 1997, 2000, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1993-1995, 1997, 2000-2011  Free Software Foundation, Inc.
 
 ;; Author: Morten Welinder <terra@diku.dk>
 ;; Keywords: convenience
@@ -225,7 +224,7 @@ the normal hook `desktop-not-loaded-hook' is run."
 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.
@@ -302,10 +301,12 @@ to the value obtained by evaluating FORM."
   :version "22.1")
 
 (defcustom desktop-clear-preserve-buffers
-  '("\\*scratch\\*" "\\*Messages\\*" "\\*server\\*" "\\*tramp/.+\\*")
+  '("\\*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)
 
@@ -610,7 +611,8 @@ Furthermore, it clears the variables listed in `desktop-globals-to-clear'."
   (delete-other-windows))
 
 ;; ----------------------------------------------------------------------------
-(add-hook 'kill-emacs-hook 'desktop-kill)
+(unless noninteractive
+  (add-hook 'kill-emacs-hook 'desktop-kill))
 
 (defun desktop-kill ()
   "If `desktop-save-mode' is non-nil, do what `desktop-save' says to do.
@@ -619,7 +621,10 @@ is nil, ask the user where to save the desktop."
   (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)))
@@ -806,24 +811,28 @@ which means to truncate VAR's value to at most MAX-SIZE elements
              ")\n"))))
 
 ;; ----------------------------------------------------------------------------
-(defun desktop-save-buffer-p (filename bufname mode &rest dummy)
+(defun desktop-save-buffer-p (filename bufname mode &rest _dummy)
   "Return t if buffer should have its state saved in the desktop file.
 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))
+  (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))))))
 
 ;; ----------------------------------------------------------------------------
@@ -1067,15 +1076,16 @@ directory DIRNAME."
 
 (defvar desktop-buffer-major-mode)
 (defvar desktop-buffer-locals)
+(defvar auto-insert)  ; from autoinsert.el
 ;; ----------------------------------------------------------------------------
-(defun desktop-restore-file-buffer (desktop-buffer-file-name
-                                    desktop-buffer-name
-                                    desktop-buffer-misc)
+(defun desktop-restore-file-buffer (buffer-filename
+                                    _buffer-name
+                                    _buffer-misc)
   "Restore a file buffer."
-  (when desktop-buffer-file-name
-    (if (or (file-exists-p desktop-buffer-file-name)
+  (when buffer-filename
+    (if (or (file-exists-p buffer-filename)
            (let ((msg (format "Desktop: File \"%s\" no longer exists."
-                              desktop-buffer-file-name)))
+                              buffer-filename)))
              (if desktop-missing-file-warning
                  (y-or-n-p (concat msg " Re-create buffer? "))
                (message "%s" msg)
@@ -1085,7 +1095,7 @@ directory DIRNAME."
                (or coding-system-for-read
                    (cdr (assq 'buffer-file-coding-system
                               desktop-buffer-locals))))
-              (buf (find-file-noselect desktop-buffer-file-name)))
+              (buf (find-file-noselect buffer-filename)))
          (condition-case nil
              (switch-to-buffer buf)
            (error (pop-to-buffer buf)))
@@ -1116,104 +1126,114 @@ directory DIRNAME."
 (defvar desktop-buffer-fail-count)
 
 (defun desktop-create-buffer
-  (desktop-file-version
-   desktop-buffer-file-name
-   desktop-buffer-name
-   desktop-buffer-major-mode
-   desktop-buffer-minor-modes
-   desktop-buffer-point
-   desktop-buffer-mark
-   desktop-buffer-read-only
-   desktop-buffer-misc
-   &optional
-   desktop-buffer-locals)
-  ;; To make desktop files with relative file names possible, we cannot
-  ;; allow `default-directory' to change. Therefore we save current buffer.
-  (save-current-buffer
-    ;; Give major mode module a chance to add a handler.
-    (desktop-load-file desktop-buffer-major-mode)
-    (let ((buffer-list (buffer-list))
-          (result
-           (condition-case-no-debug err
-               (funcall (or (cdr (assq desktop-buffer-major-mode
-                                       desktop-buffer-mode-handlers))
-                            'desktop-restore-file-buffer)
-                        desktop-buffer-file-name
-                        desktop-buffer-name
-                        desktop-buffer-misc)
-             (error
-              (message "Desktop: Can't load buffer %s: %s"
-                       desktop-buffer-name
-                       (error-message-string err))
-              (when desktop-missing-file-warning (sit-for 1))
-              nil))))
-      (if (bufferp result)
-          (setq desktop-buffer-ok-count (1+ desktop-buffer-ok-count))
-        (setq desktop-buffer-fail-count (1+ desktop-buffer-fail-count))
-        (setq result nil))
-      ;; Restore buffer list order with new buffer at end. Don't change
-      ;; the order for old desktop files (old desktop module behaviour).
-      (unless (< desktop-file-version 206)
-        (mapc 'bury-buffer buffer-list)
-        (when result (bury-buffer result)))
-      (when result
-        (unless (or desktop-first-buffer (< desktop-file-version 206))
-          (setq desktop-first-buffer result))
-        (set-buffer result)
-        (unless (equal (buffer-name) desktop-buffer-name)
-          (rename-buffer desktop-buffer-name t))
-        ;; minor modes
-        (cond ((equal '(t) desktop-buffer-minor-modes) ; backwards compatible
-               (auto-fill-mode 1))
-              ((equal '(nil) desktop-buffer-minor-modes) ; backwards compatible
-               (auto-fill-mode 0))
-              (t
-               (dolist (minor-mode desktop-buffer-minor-modes)
-                 ;; Give minor mode module a chance to add a handler.
-                 (desktop-load-file minor-mode)
-                 (let ((handler (cdr (assq minor-mode desktop-minor-mode-handlers))))
-                   (if handler
-                       (funcall handler desktop-buffer-locals)
-                     (when (functionp minor-mode)
-                       (funcall minor-mode 1)))))))
-        ;; Even though point and mark are non-nil when written by
-        ;; `desktop-save', they may be modified by handlers wanting to set
-        ;; point or mark themselves.
-        (when desktop-buffer-point
-          (goto-char
-            (condition-case err
-                ;; Evaluate point.  Thus point can be something like
-                ;; '(search-forward ...
-                (eval desktop-buffer-point)
-              (error (message "%s" (error-message-string err)) 1))))
-        (when desktop-buffer-mark
-          (if (consp desktop-buffer-mark)
-             (progn
-               (set-mark (car desktop-buffer-mark))
-               (setq mark-active (car (cdr desktop-buffer-mark))))
-            (set-mark desktop-buffer-mark)))
-        ;; Never override file system if the file really is read-only marked.
-        (when desktop-buffer-read-only (setq buffer-read-only desktop-buffer-read-only))
-        (while desktop-buffer-locals
-          (let ((this (car desktop-buffer-locals)))
-            (if (consp this)
-               ;; an entry of this form `(symbol . value)'
+    (file-version
+     buffer-filename
+     buffer-name
+     buffer-majormode
+     buffer-minormodes
+     buffer-point
+     buffer-mark
+     buffer-readonly
+     buffer-misc
+     &optional
+     buffer-locals)
+
+  (let ((desktop-file-version      file-version)
+       (desktop-buffer-file-name   buffer-filename)
+       (desktop-buffer-name        buffer-name)
+       (desktop-buffer-major-mode  buffer-majormode)
+       (desktop-buffer-minor-modes buffer-minormodes)
+       (desktop-buffer-point       buffer-point)
+       (desktop-buffer-mark        buffer-mark)
+       (desktop-buffer-read-only   buffer-readonly)
+       (desktop-buffer-misc        buffer-misc)
+       (desktop-buffer-locals      buffer-locals))
+    ;; To make desktop files with relative file names possible, we cannot
+    ;; allow `default-directory' to change. Therefore we save current buffer.
+    (save-current-buffer
+      ;; Give major mode module a chance to add a handler.
+      (desktop-load-file desktop-buffer-major-mode)
+      (let ((buffer-list (buffer-list))
+           (result
+            (condition-case-no-debug err
+                (funcall (or (cdr (assq desktop-buffer-major-mode
+                                        desktop-buffer-mode-handlers))
+                             'desktop-restore-file-buffer)
+                         desktop-buffer-file-name
+                         desktop-buffer-name
+                         desktop-buffer-misc)
+              (error
+               (message "Desktop: Can't load buffer %s: %s"
+                        desktop-buffer-name
+                        (error-message-string err))
+               (when desktop-missing-file-warning (sit-for 1))
+               nil))))
+       (if (bufferp result)
+           (setq desktop-buffer-ok-count (1+ desktop-buffer-ok-count))
+         (setq desktop-buffer-fail-count (1+ desktop-buffer-fail-count))
+         (setq result nil))
+       ;; Restore buffer list order with new buffer at end. Don't change
+       ;; the order for old desktop files (old desktop module behaviour).
+       (unless (< desktop-file-version 206)
+         (mapc 'bury-buffer buffer-list)
+         (when result (bury-buffer result)))
+       (when result
+         (unless (or desktop-first-buffer (< desktop-file-version 206))
+           (setq desktop-first-buffer result))
+         (set-buffer result)
+         (unless (equal (buffer-name) desktop-buffer-name)
+           (rename-buffer desktop-buffer-name t))
+         ;; minor modes
+         (cond ((equal '(t) desktop-buffer-minor-modes) ; backwards compatible
+                (auto-fill-mode 1))
+               ((equal '(nil) desktop-buffer-minor-modes) ; backwards compatible
+                (auto-fill-mode 0))
+               (t
+                (dolist (minor-mode desktop-buffer-minor-modes)
+                  ;; Give minor mode module a chance to add a handler.
+                  (desktop-load-file minor-mode)
+                  (let ((handler (cdr (assq minor-mode desktop-minor-mode-handlers))))
+                    (if handler
+                        (funcall handler desktop-buffer-locals)
+                      (when (functionp minor-mode)
+                        (funcall minor-mode 1)))))))
+         ;; Even though point and mark are non-nil when written by
+         ;; `desktop-save', they may be modified by handlers wanting to set
+         ;; point or mark themselves.
+         (when desktop-buffer-point
+           (goto-char
+            (condition-case err
+                ;; Evaluate point.  Thus point can be something like
+                ;; '(search-forward ...
+                (eval desktop-buffer-point)
+              (error (message "%s" (error-message-string err)) 1))))
+         (when desktop-buffer-mark
+           (if (consp desktop-buffer-mark)
                (progn
-                 (make-local-variable (car this))
-                 (set (car this) (cdr this)))
-              ;; an entry of the form `symbol'
-              (make-local-variable this)
-              (makunbound this)))
-          (setq desktop-buffer-locals (cdr desktop-buffer-locals)))))))
+                 (set-mark (car desktop-buffer-mark))
+                 (setq mark-active (car (cdr desktop-buffer-mark))))
+             (set-mark desktop-buffer-mark)))
+         ;; Never override file system if the file really is read-only marked.
+         (when desktop-buffer-read-only (setq buffer-read-only desktop-buffer-read-only))
+         (while desktop-buffer-locals
+           (let ((this (car desktop-buffer-locals)))
+             (if (consp this)
+                 ;; an entry of this form `(symbol . value)'
+                 (progn
+                   (make-local-variable (car this))
+                   (set (car this) (cdr this)))
+               ;; an entry of the form `symbol'
+               (make-local-variable this)
+               (makunbound this)))
+           (setq desktop-buffer-locals (cdr desktop-buffer-locals))))))))
 
 ;; ----------------------------------------------------------------------------
 ;; Backward compatibility -- update parameters to 205 standards.
-(defun desktop-buffer (desktop-buffer-file-name desktop-buffer-name
-                      desktop-buffer-major-mode
-                      mim pt mk ro tl fc cfs cr desktop-buffer-misc)
-  (desktop-create-buffer 205 desktop-buffer-file-name desktop-buffer-name
-                        desktop-buffer-major-mode (cdr mim) pt mk ro
-                        desktop-buffer-misc
+(defun desktop-buffer (buffer-filename buffer-name buffer-majormode
+                      mim pt mk ro tl fc cfs cr buffer-misc)
+  (desktop-create-buffer 205 buffer-filename buffer-name
+                        buffer-majormode (cdr mim) pt mk ro
+                        buffer-misc
                         (list (cons 'truncate-lines tl)
                               (cons 'fill-column fc)
                               (cons 'case-fold-search cfs)
@@ -1302,5 +1322,4 @@ If there are no buffers left to create, kill the timer."
 
 (provide 'desktop)
 
-;; arch-tag: 221907c3-1771-4fd3-9c2e-c6f700c6ede9
 ;;; desktop.el ends here