* net/tramp.el (tramp-open-connection-setup-interactive-shell): Check
[bpt/emacs.git] / lisp / savehist.el
index 6c6d936..705be69 100644 (file)
@@ -1,6 +1,6 @@
 ;;; savehist.el --- Save minibuffer history.
 
-;; Copyright (C) 1997, 2005 Free Software Foundation
+;; Copyright (C) 1997, 2005, 2006, 2007  Free Software Foundation, Inc.
 
 ;; Author: Hrvoje Niksic <hniksic@xemacs.org>
 ;; Keywords: minibuffer
@@ -10,7 +10,7 @@
 
 ;; 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 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -56,6 +56,7 @@
 
 (defgroup savehist nil
   "Save minibuffer history."
+  :version "22.1"
   :group 'minibuffer)
 
 ;;;###autoload
@@ -91,12 +92,17 @@ minibuffer histories, such as `compile-command' or `kill-ring'."
   :type '(repeat variable)
   :group 'savehist)
 
+(defcustom savehist-ignored-variables nil ;; '(command-history)
+  "*List of additional variables not to save."
+  :type '(repeat variable)
+  :group 'savehist)
+
 (defcustom savehist-file
   (cond
    ;; Backward compatibility with previous versions of savehist.
    ((file-exists-p "~/.emacs-history") "~/.emacs-history")
-   ((and (not (featurep 'xemacs)) (file-directory-p "~/.emacs.d/"))
-    "~/.emacs.d/history")
+   ((and (not (featurep 'xemacs)) (file-directory-p user-emacs-directory))
+    (concat user-emacs-directory "history"))
    ((and (featurep 'xemacs) (file-directory-p "~/.xemacs/"))
     "~/.xemacs/history")
    ;; For users without `~/.emacs.d/' or `~/.xemacs/'.
@@ -302,11 +308,42 @@ If AUTO-SAVE is non-nil, compare the saved contents to the one last saved,
               (current-buffer))
        (insert ?\n)
        (dolist (symbol savehist-minibuffer-history-variables)
-         (when (boundp symbol)
-           (let ((value (savehist-trim-history (symbol-value symbol))))
-             (when value               ; don't save empty histories
-               (prin1 `(setq ,symbol ',value) (current-buffer))
-               (insert ?\n))))))
+         (when (and (boundp symbol)
+                    (not (memq symbol savehist-ignored-variables)))
+           (let ((value (savehist-trim-history (symbol-value symbol)))
+                 excess-space)
+             (when value               ; Don't save empty histories.
+               (insert "(setq ")
+               (prin1 symbol (current-buffer))
+               (insert " '(")
+               ;; We will print an extra space before the first element.
+               ;; Record where that is.
+               (setq excess-space (point))
+               ;; Print elements of VALUE one by one, carefully.
+               (dolist (elt value)
+                 (let ((start (point)))
+                   (insert " ")
+                   (prin1 elt (current-buffer))
+                   ;; Try to read the element we just printed.
+                   (condition-case nil
+                       (save-excursion
+                         (goto-char start)
+                         (read (current-buffer)))
+                     (error
+                      ;; If reading it gets an error, comment it out.
+                      (goto-char start)
+                      (insert "\n")
+                      (while (not (eobp))
+                        (insert ";;; ")
+                        (forward-line 1))
+                      (insert "\n")))
+                   (goto-char (point-max))))
+               ;; Delete the extra space before the first element.
+               (save-excursion
+                 (goto-char excess-space)
+                 (if (eq (following-char) ?\s)
+                     (delete-region (point) (1+ (point)))))
+               (insert "))\n"))))))
       ;; Save the additional variables.
       (dolist (symbol savehist-additional-variables)
        (when (boundp symbol)
@@ -371,9 +408,10 @@ trimming of history lists to `history-length' items."
        (error nil))))))
 
 (defun savehist-minibuffer-hook ()
-  ;; XEmacs sets minibuffer-history-variable to t to mean "no history
-  ;; is being recorded".
-  (unless (eq minibuffer-history-variable t)
+  (unless (or (eq minibuffer-history-variable t)
+             ;; XEmacs sets minibuffer-history-variable to t to mean "no
+             ;; history is being recorded".
+             (memq minibuffer-history-variable savehist-ignored-variables))
     (add-to-list 'savehist-minibuffer-history-variables
                 minibuffer-history-variable)))