Mercurial > emacs
annotate lisp/savehist.el @ 66382:9e9e3aac0fda
(gdb-send): Bind inhibit-read-only to t
in case comint-prompt-read-only is set to t.
author | Nick Roberts <nickrob@snap.net.nz> |
---|---|
date | Mon, 24 Oct 2005 08:54:18 +0000 |
parents | 71bac038fa51 |
children | 9ee3fe90596c |
rev | line source |
---|---|
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
1 ;;; savehist.el --- Save minibuffer history. |
66106 | 2 |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
3 ;; Copyright (C) 1997, 2005 Free Software Foundation |
66106 | 4 |
5 ;; Author: Hrvoje Niksic <hniksic@xemacs.org> | |
6 ;; Keywords: minibuffer | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
7 ;; Version: 7 |
66106 | 8 |
9 ;; This file is part of GNU Emacs. | |
10 | |
11 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
12 ;; it under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation; either version 2, or (at your option) | |
14 ;; any later version. | |
15 | |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
24 ;; Boston, MA 02110-1301, USA. | |
25 | |
26 ;;; Commentary: | |
27 | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
28 ;; Many editors (e.g. Vim) have the feature of saving minibuffer |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
29 ;; history to an external file after exit. This package provides the |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
30 ;; same feature in Emacs. When Emacs is about the exit, |
66106 | 31 ;; `savehist-save' will dump the contents of various minibuffer |
32 ;; histories (as determined by `savehist-history-variables') to a save | |
33 ;; file (`~/.emacs-history' by default). Although the package was | |
34 ;; designed for saving the minibuffer histories, any variables can be | |
35 ;; saved that way. | |
36 | |
37 ;; To use savehist, put the following to `~/.emacs': | |
38 ;; | |
39 ;; (require 'savehist) | |
40 ;; (savehist-load) | |
41 | |
42 ;; Be sure to have `savehist.el' in a directory that is in your | |
43 ;; load-path, and byte-compile it. | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
44 |
66106 | 45 ;;; Code: |
46 | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
47 (require 'custom) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
48 |
66106 | 49 ;; User variables |
50 | |
51 (defgroup savehist nil | |
52 "Save minibuffer history." | |
53 :group 'minibuffer) | |
54 | |
55 (defcustom savehist-history-variables | |
56 '( | |
57 ;; Catch-all minibuffer history | |
58 minibuffer-history | |
59 ;; File-oriented commands | |
60 file-name-history | |
61 ;; Regexp-related reads | |
62 regexp-history | |
63 ;; Searches in minibuffer (via `M-r' and such) | |
64 minibuffer-history-search-history | |
65 ;; Query replace | |
66 query-replace-history | |
67 ;; eval-expression (`M-:') | |
68 read-expression-history | |
69 ;; shell-command (`M-!') | |
70 shell-command-history | |
71 ;; compile | |
72 compile-history | |
73 ;; find-tag (`M-.') | |
74 find-tag-history | |
75 ;; grep | |
76 grep-history | |
66316
71bac038fa51
(savehist-history-variables): Add `grep-find-history'.
Romain Francoise <romain@orebokech.com>
parents:
66205
diff
changeset
|
77 grep-find-history |
66106 | 78 ;; Viper stuff |
79 vip-ex-history vip-search-history | |
80 vip-replace1-history vip-replace2-history | |
81 vip-shell-history vip-search-history | |
82 | |
83 ;; XEmacs-specific: | |
84 ;; Buffer-related commands | |
85 buffer-history | |
86 ;; Reads of variables and functions | |
87 variable-history function-history | |
88 ;; Extended commands | |
89 read-command-history | |
90 | |
91 ;; Info, lookup, and bookmark historys | |
92 Info-minibuffer-history | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
93 Info-search-history |
66106 | 94 Manual-page-minibuffer-history |
95 | |
96 ;; Emacs-specific: | |
97 ;; Extended commands | |
98 extended-command-history) | |
99 "*List of symbols to be saved. | |
100 Every symbol should refer to a variable. The variable will be saved | |
101 only if it is bound and has a non-nil value. Thus it is safe to | |
102 specify a superset of the variables a user is expected to want to | |
103 save. | |
104 | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
105 Default value contains minibuffer history variables used by Emacs, XEmacs, |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
106 and Viper (uh-oh). Note that, if you customize this variable, you |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
107 can lose the benefit of future versions of Emacs adding new values to |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
108 the list. Because of that it might be more useful to add values using |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
109 `add-to-list'." |
66106 | 110 :type '(repeat (symbol :tag "Variable")) |
111 :group 'savehist) | |
112 | |
113 (defcustom savehist-file "~/.emacs-history" | |
114 "*File name to save minibuffer history to. | |
115 The minibuffer history is a series of Lisp expressions, which should be | |
116 loaded using `savehist-load' from your .emacs. See `savehist-load' for | |
117 more details." | |
118 :type 'file | |
119 :group 'savehist) | |
120 | |
121 (defcustom savehist-length 100 | |
122 "*Maximum length of a minibuffer list. | |
123 If set to nil, the length is unlimited." | |
124 :type '(choice integer | |
125 (const :tag "Unlimited" nil)) | |
126 :group 'savehist) | |
127 | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
128 (defcustom savehist-modes #o600 |
66106 | 129 "*Default permissions of the history file. |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
130 This is decimal, not octal. The default is 384 (0600 in octal). |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
131 Set to nil to use the default permissions that Emacs uses, typically |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
132 mandated by umask. The default is a bit more restrictive to protect |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
133 the user's privacy." |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
134 :type 'integer |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
135 :group 'savehist) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
136 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
137 (defcustom savehist-autosave-interval (* 5 60) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
138 "*The interval during which savehist should autosave the history buffer." |
66106 | 139 :type 'integer |
140 :group 'savehist) | |
141 | |
66205
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
142 (defvar savehist-coding-system |
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
143 ;; UTF-8 is usually preferable to ISO-2022-8 when available, but under |
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
144 ;; XEmacs, UTF-8 is provided by external packages, and may not always be |
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
145 ;; available, so even if it currently is available, we prefer not to |
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
146 ;; use is. |
e52f114d1dc3
(savehist-coding-system): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66191
diff
changeset
|
147 (if (featurep 'xemacs) 'iso-2022-8 'utf-8) |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
148 "The coding system savehist uses for saving the minibuffer history. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
149 Changing this value while Emacs is running is supported, but considered |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
150 unwise, unless you know what you are doing.") |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
151 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
152 ;; Internal variables. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
153 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
154 (defvar savehist-timer nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
155 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
156 (defvar savehist-last-checksum nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
157 |
66121
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
158 (defconst savehist-no-conversion (if (featurep 'xemacs) 'binary 'no-conversion) |
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
159 ;; FIXME: Why not use savehist-coding-system? |
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
160 "Coding system without conversion, only used for calculating checksums.") |
66106 | 161 |
162 ;; Functions | |
163 | |
164 ;;;###autoload | |
165 (defun savehist-load (&optional no-hook) | |
166 "Load the minibuffer histories from `savehist-file'. | |
167 Unless NO-HOOK is specified, the function will also add the save function | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
168 to `kill-emacs-hook' and on a timer, ensuring that the minibuffer contents |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
169 will be saved before leaving Emacs. |
66106 | 170 |
171 This function should be normally used from your Emacs init file. Since it | |
172 removes your current minibuffer histories, it is unwise to call it at any | |
173 other time." | |
174 (interactive "P") | |
175 (unless no-hook | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
176 (add-hook 'kill-emacs-hook 'savehist-autosave) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
177 ;; Install an invocation of savehist-autosave on a timer. This |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
178 ;; should not cause a noticeable delay -- savehist-autosave |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
179 ;; executes in under 5 ms on my system. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
180 (unless savehist-timer |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
181 (setq savehist-timer |
66191
3b427dc36c6e
(savehist-load): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66129
diff
changeset
|
182 (if (featurep 'xemacs) |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
183 (start-itimer |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
184 "savehist" 'savehist-autosave savehist-autosave-interval |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
185 savehist-autosave-interval) |
66121
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
186 (run-with-idle-timer savehist-autosave-interval savehist-autosave-interval |
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
187 'savehist-autosave))))) |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
188 ;; Don't set coding-system-for-read here. We rely on autodetection |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
189 ;; and the coding cookie to convey that information. That way, if |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
190 ;; the user changes the value of savehist-coding-system, we can |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
191 ;; still correctly load the old file. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
192 (load savehist-file t (not (interactive-p)))) |
66106 | 193 |
194 ;;;###autoload | |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
195 (defun savehist-save (&optional auto-save) |
66106 | 196 "Save the histories from `savehist-history-variables' to `savehist-file'. |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
197 Unbound symbols referenced in `savehist-history-variables' are ignored. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
198 If AUTO-SAVE is non-nil, compare the saved contents to the one last saved, |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
199 and don't save the buffer if they are the same." |
66106 | 200 (interactive) |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
201 (with-temp-buffer |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
202 (insert |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
203 (format ";; -*- mode: emacs-lisp; coding: %s -*-\n" savehist-coding-system) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
204 ";; Minibuffer history file, automatically generated by `savehist'.\n\n") |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
205 (let ((print-length nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
206 (print-string-length nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
207 (print-level nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
208 (print-readably t) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
209 (print-quoted t)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
210 (dolist (sym savehist-history-variables) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
211 (when (boundp sym) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
212 (let ((value (savehist-process-for-saving (symbol-value sym)))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
213 (prin1 `(setq ,sym ',value) (current-buffer)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
214 (insert ?\n))))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
215 ;; If autosaving, avoid writing if nothing has changed since the |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
216 ;; last write. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
217 (let ((checksum (md5 (current-buffer) nil nil savehist-no-conversion))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
218 (unless (and auto-save (equal checksum savehist-last-checksum)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
219 ;; Set file-precious-flag when saving the buffer because we |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
220 ;; don't want a half-finished write ruining the entire |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
221 ;; history. (Remember that this is run from a timer and from |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
222 ;; kill-emacs-hook.) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
223 (let ((file-precious-flag t) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
224 (coding-system-for-write savehist-coding-system)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
225 (write-region (point-min) (point-max) savehist-file nil |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
226 (unless (interactive-p) 'quiet))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
227 (when savehist-modes |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
228 (set-file-modes savehist-file savehist-modes)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
229 (setq savehist-last-checksum checksum))))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
230 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
231 (defun savehist-autosave () |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
232 "Save the minibuffer history if it has been modified since the last save." |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
233 (savehist-save t)) |
66106 | 234 |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
235 (defun savehist-process-for-saving (value) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
236 ;; Process VALUE for saving to file. If it is a list, retain only |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
237 ;; the first `savehist-length' values and prune non-printable ones. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
238 ;; If VALUE is not a list, return it as-is if it is printable and |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
239 ;; nil otherwise. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
240 (cond |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
241 ((listp value) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
242 (when (and savehist-length (> (length value) savehist-length)) |
66191
3b427dc36c6e
(savehist-load): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66129
diff
changeset
|
243 ;; This should be: (setq value (subseq value 0 savehist-length)) |
66121
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
244 (setq value (copy-sequence value)) |
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
245 (setcdr (nthcdr savehist-length value) nil)) |
66191
3b427dc36c6e
(savehist-load): Revert to checking XEmacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66129
diff
changeset
|
246 ;; And this should be (remove-if-not #'savehist-printable value) |
66121
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
247 (delq nil (mapcar (lambda (x) (if (savehist-printable x) x)) value))) |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
248 ((savehist-printable value) value) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
249 (t nil))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
250 |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
251 (defun savehist-printable (value) |
66121
b1015e4158db
Don't require CL at runtime.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66120
diff
changeset
|
252 "Return non-nil if VALUE is printable." |
66120
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
253 ;; Quick response for oft-encountered types known to be printable. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
254 (cond |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
255 ((stringp value)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
256 ((numberp value)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
257 ((symbolp value)) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
258 (t |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
259 ;; For others, check explicitly. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
260 (condition-case nil |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
261 (let ((print-readably t) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
262 (print-level nil) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
263 (chars ())) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
264 ;; Print the value into a string... |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
265 (prin1 value (lambda (char) (push char chars))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
266 ;; ...and attempt to read it. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
267 (read (apply #'string (nreverse chars))) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
268 ;; The attempt worked: the object is printable. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
269 t) |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
270 ;; The attempt failed: the object is not printable. |
87310076f109
(savehist-autosave-interval, savehist-coding-system, savehist-timer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
66106
diff
changeset
|
271 (error nil))))) |
66106 | 272 |
273 (provide 'savehist) | |
274 | |
66129 | 275 ;; arch-tag: b3ce47f4-c5ad-4ebc-ad02-73aba705cf9f |
66106 | 276 ;;; savehist.el ends here |