[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Saving minibuffer history
From: |
Stefan Monnier |
Subject: |
Re: Saving minibuffer history |
Date: |
Tue, 25 Oct 2005 00:37:55 -0400 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) |
>> I've now applied your changes to my version.
>> http://fly.srk.fer.hr/~hniksic/emacs/savehist.el
Here's yet another suggested patch.
It includes the change of default of savehist-file and introduces
savehist-mode, which would become the main advertized way to turn the
feature ON (can also be done via Customize) in place of savehist-load.
There are also minor changes: don't save empty histories, and try to avoid
computing the checksum when no minibuffer input occurred since last check.
Stefan
--- savehist.el 24 oct 2005 13:15:48 -0400 1.8
+++ savehist.el 25 oct 2005 00:35:03 -0400
@@ -70,8 +70,14 @@
:type '(repeat (symbol :tag "Variable"))
:group 'savehist)
-(defcustom savehist-file "~/.emacs-history"
- "File name to save minibuffer history to.
+(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")
+ (t "~/.emacs-history"))
+ "*File name to save minibuffer history to.
The minibuffer history is a series of Lisp expressions, which should be
loaded using `savehist-load' from your .emacs. See `savehist-load' for
more details."
@@ -139,7 +145,8 @@
(start-itimer
"savehist" 'savehist-autosave savehist-autosave-interval
savehist-autosave-interval)
- (run-with-timer savehist-autosave-interval
savehist-autosave-interval
+ (run-with-timer savehist-autosave-interval
+ savehist-autosave-interval
'savehist-autosave)))))
(defun savehist-uninstall ()
@@ -152,6 +159,17 @@
(cancel-timer savehist-timer))
(setq savehist-timer nil)))
+(defvar savehist-loaded nil)
+
+;;;###autoload
+(define-minor-mode savehist-mode
+ "Minor mode that preserves minibuffer history across Emacs sessions."
+ :lighter nil
+ (if (not savehist-mode)
+ (savehist-uninstall)
+ (unless savehist-loaded (savehist-load 'no-install))
+ (savehist-install)))
+
;;;###autoload
(defun savehist-load (&optional no-install)
"Load the minibuffer histories from `savehist-file'.
@@ -168,9 +186,17 @@
;; the user changes the value of savehist-coding-system, we can
;; still correctly load the old file.
(load savehist-file t (not (interactive-p)))
+ ;; Remember we've already loaded it, so we can try and avoid loading it
+ ;; several times, which would risk throwing away history info.
+ (setq savehist-loaded t)
(unless no-install
(savehist-install)))
+(defvar savehist-changed nil
+ "If nil, the history hasn't changed.
+This variable is only used as an optimization, to avoid generating a new
+savehist state and checksum, only to discover that it hasn't changed.")
+
;;;###autoload
(defun savehist-save (&optional auto-save)
"Save the values of minibuffer history variables.
@@ -178,9 +204,11 @@
If AUTO-SAVE is non-nil, compare the saved contents to the one last saved,
and don't save the buffer if they are the same."
(interactive)
+ (unless (and auto-save (not savehist-changed))
(with-temp-buffer
(insert
- (format ";; -*- mode: emacs-lisp; coding: %s -*-\n"
savehist-coding-system)
+ (format ";; -*- mode: emacs-lisp; coding: %s -*-\n"
+ savehist-coding-system)
";; Minibuffer history file, automatically generated by `savehist'.\n\n")
(let ((print-length nil)
(print-string-length nil)
@@ -195,8 +223,10 @@
(dolist (sym symbol-list)
(when (boundp sym)
(let ((value (savehist-process-for-saving (symbol-value sym))))
+ ;; Don't save empty histories.
+ (when value
(prin1 `(setq ,sym ',value) (current-buffer))
- (insert ?\n)))))
+ (insert ?\n))))))
;; If autosaving, avoid writing if nothing has changed since the
;; last write.
(let ((checksum (md5 (current-buffer) nil nil savehist-no-conversion)))
@@ -212,7 +242,8 @@
(unless (interactive-p) 'quiet)))
(when savehist-modes
(set-file-modes savehist-file savehist-modes))
- (setq savehist-last-checksum checksum)))))
+ (setq savehist-changed nil)
+ (setq savehist-last-checksum checksum))))))
(defun savehist-autosave ()
"Save the minibuffer history if it has been modified since the last save."
@@ -257,6 +288,7 @@
(error nil)))))
(defun savehist-minibuffer-hook ()
+ (setq savehist-changed t)
(add-to-list 'savehist-minibuffer-history-variables
minibuffer-history-variable))
- Re: Saving minibuffer history, (continued)
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/19
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/20
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/20
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/20
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/20
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/24
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/24
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Richard M. Stallman, 2005/10/26
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/24
- Re: Saving minibuffer history,
Stefan Monnier <=
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/25
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Miles Bader, 2005/10/25
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Miles Bader, 2005/10/25
- Re: Saving minibuffer history, Stefan Monnier, 2005/10/25
- Re: Saving minibuffer history, Hrvoje Niksic, 2005/10/25
- Re: Saving minibuffer history, Richard M. Stallman, 2005/10/25