Mercurial > emacs
annotate lisp/saveplace.el @ 98182:19ec1646fe6c
The Rmail/mbox merge has been abandoned in favor of a restart using
the current rmail.el file. A comprehensive list of changes will be
supplied when pmail.el is morphed back into rmail.el
The current status is that pmail.el supports basic Rmail navigation
(no summary support) and shows the current message in a special
buffer using buffer-swap-text. No decoding is done yet. That is the
next step.
author | Paul Reilly <pmr@pajato.com> |
---|---|
date | Mon, 15 Sep 2008 20:56:53 +0000 |
parents | ee5932bf781d |
children | d42aff5ca541 |
rev | line source |
---|---|
38412
253f761ad37b
Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents:
38224
diff
changeset
|
1 ;;; saveplace.el --- automatically save place in files |
4596 | 2 |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64091
diff
changeset
|
3 ;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004, |
79721 | 4 ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
4596 | 5 |
38224
b304c4a260bd
Update maintainer email address.
Karl Fogel <kfogel@red-bean.com>
parents:
37408
diff
changeset
|
6 ;; Author: Karl Fogel <kfogel@red-bean.com> |
4596 | 7 ;; Maintainer: FSF |
8 ;; Created: July, 1993 | |
9 ;; Keywords: bookmarks, placeholders | |
10 | |
11 ;; This file is part of GNU Emacs. | |
12 | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
13 ;; GNU Emacs is free software: you can redistribute it and/or modify |
4596 | 14 ;; it under the terms of the GNU General Public License as published by |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
15 ;; the Free Software Foundation, either version 3 of the License, or |
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
16 ;; (at your option) any later version. |
4596 | 17 |
18 ;; GNU Emacs is distributed in the hope that it will be useful, | |
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 ;; GNU General Public License for more details. | |
22 | |
23 ;; You should have received a copy of the GNU General Public License | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
24 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
14169 | 25 |
15192 | 26 ;;; Commentary: |
27 | |
4596 | 28 ;; Automatically save place in files, so that visiting them later |
29 ;; (even during a different Emacs session) automatically moves point | |
30 ;; to the saved position, when the file is first found. Uses the | |
31 ;; value of buffer-local variable save-place to determine whether to | |
32 ;; save position or not. | |
33 ;; | |
6662
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
34 ;; Thanks to Stefan Schoef, who sent a patch with the |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
35 ;; `save-place-version-control' stuff in it. |
4596 | 36 |
15192 | 37 ;;; Code: |
38 | |
4596 | 39 ;; this is what I was using during testing: |
93166
aaf5e5e918c5
* saveplace.el: fix a typo in the commentary section.
Michael Olson <mwolson@gnu.org>
parents:
87649
diff
changeset
|
40 ;; (define-key ctl-x-map "p" 'toggle-save-place-globally) |
4596 | 41 |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
42 (defgroup save-place nil |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
43 "Automatically save place in files." |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
44 :group 'data) |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
45 |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
46 |
4596 | 47 (defvar save-place-alist nil |
48 "Alist of saved places to go back to when revisiting files. | |
49 Each element looks like (FILENAME . POSITION); | |
50 visiting file FILENAME goes automatically to position POSITION | |
51 rather than the beginning of the buffer. | |
52 This alist is saved between Emacs sessions.") | |
53 | |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
54 (defcustom save-place nil |
4596 | 55 "*Non-nil means automatically save place in each file. |
56 This means when you visit a file, point goes to the last place | |
57 where it was when you previously visited the same file. | |
58 This variable is automatically buffer-local. | |
59 | |
60 If you wish your place in any file to always be automatically saved, | |
61 simply put this in your `~/.emacs' file: | |
62 | |
58275 | 63 \(setq-default save-place t) |
64 \(require 'saveplace) | |
65 | |
66 or else use the Custom facility to set this option." | |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
67 :type 'boolean |
40162
237849e2e2ac
(save-place): Require `saveplace'.
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
68 :require 'saveplace |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
69 :group 'save-place) |
4596 | 70 |
71 (make-variable-buffer-local 'save-place) | |
72 | |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
73 (defcustom save-place-file (convert-standard-filename "~/.emacs-places") |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
74 "*Name of the file that records `save-place-alist' value." |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
75 :type 'file |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
76 :group 'save-place) |
4596 | 77 |
19979
8540d32e89cd
(save-place-version-control): Make nil the default.
Richard M. Stallman <rms@gnu.org>
parents:
17481
diff
changeset
|
78 (defcustom save-place-version-control nil |
6662
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
79 "*Controls whether to make numbered backups of master save-place file. |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
80 It can have four values: t, nil, `never', and `nospecial'. The first |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
81 three have the same meaning that they do for the variable |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
82 `version-control', and the final value `nospecial' means just use the |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
83 value of `version-control'." |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
84 :type '(radio (const :tag "Unconditionally" t) |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
85 (const :tag "For VC Files" nil) |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
86 (const never) |
19979
8540d32e89cd
(save-place-version-control): Make nil the default.
Richard M. Stallman <rms@gnu.org>
parents:
17481
diff
changeset
|
87 (const :tag "Use value of `version-control'" nospecial)) |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
88 :group 'save-place) |
6662
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
89 |
4596 | 90 (defvar save-place-loaded nil |
91 "Non-nil means that the `save-place-file' has been loaded.") | |
92 | |
17481
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
93 (defcustom save-place-limit nil |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
94 "Maximum number of entries to retain in the list; nil means no limit." |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
95 :type '(choice (integer :tag "Entries" :value 1) |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
96 (const :tag "No Limit" nil)) |
e2757a9ccbe9
Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
16948
diff
changeset
|
97 :group 'save-place) |
13665
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
98 |
54111
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
99 (defcustom save-place-forget-unreadable-files t |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
100 "Non-nil means forget place in unreadable files. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
101 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
102 The filenames in `save-place-alist' that do not match |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
103 `save-place-skip-check-regexp' are filtered through |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
104 `file-readable-p'. if nil, their alist entries are removed. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
105 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
106 You may do this anytime by calling the complementary function, |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
107 `save-place-forget-unreadable-files'. When this option is turned on, |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
108 this happens automatically before saving `save-place-alist' to |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
109 `save-place-file'." |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
110 :type 'boolean :group 'save-place) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
111 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
112 (defcustom save-place-save-skipped t |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
113 "If non-nil, remember files matching `save-place-skip-check-regexp'. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
114 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
115 When filtering `save-place-alist' for unreadable files, some will not |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
116 be checked, based on said regexp, and instead saved or forgotten based |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
117 on this flag." |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
118 :type 'boolean :group 'save-place) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
119 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
120 (defcustom save-place-skip-check-regexp |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
121 ;; thanks to ange-ftp-name-format |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
122 "\\`/\\(?:cdrom\\|floppy\\|mnt\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)" |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
123 "Regexp whose file names shall not be checked for readability. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
124 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
125 When forgetting unreadable files, file names matching this regular |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
126 expression shall not be checked for readability, but instead be |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
127 subject to `save-place-save-skipped'. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
128 |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
129 Files for which such a check may be inconvenient include those on |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
130 removable and network volumes." |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
131 :type 'regexp :group 'save-place) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
132 |
4596 | 133 (defun toggle-save-place (&optional parg) |
134 "Toggle whether to save your place in this file between sessions. | |
135 If this mode is enabled, point is recorded when you kill the buffer | |
136 or exit Emacs. Visiting this file again will go to that position, | |
137 even in a later Emacs session. | |
138 | |
139 If called with a prefix arg, the mode is enabled if and only if | |
140 the argument is positive. | |
141 | |
142 To save places automatically in all files, put this in your `.emacs' file: | |
143 | |
144 \(setq-default save-place t\)" | |
145 (interactive "P") | |
146 (if (not buffer-file-name) | |
14357
31d994fe3123
(toggle-save-place): Fix message text.
Karl Heuer <kwzh@gnu.org>
parents:
14342
diff
changeset
|
147 (message "Buffer `%s' not visiting a file" (buffer-name)) |
4596 | 148 (if (and save-place (or (not parg) (<= parg 0))) |
149 (progn | |
14357
31d994fe3123
(toggle-save-place): Fix message text.
Karl Heuer <kwzh@gnu.org>
parents:
14342
diff
changeset
|
150 (message "No place will be saved in this file") |
4596 | 151 (setq save-place nil)) |
14357
31d994fe3123
(toggle-save-place): Fix message text.
Karl Heuer <kwzh@gnu.org>
parents:
14342
diff
changeset
|
152 (message "Place will be saved") |
4596 | 153 (setq save-place t)))) |
154 | |
155 (defun save-place-to-alist () | |
156 ;; put filename and point in a cons box and then cons that onto the | |
157 ;; front of the save-place-alist, if save-place is non-nil. | |
158 ;; Otherwise, just delete that file from the alist. | |
159 ;; first check to make sure alist has been loaded in from the master | |
160 ;; file. If not, do so, then feel free to modify the alist. It | |
161 ;; will be saved again when Emacs is killed. | |
162 (or save-place-loaded (load-save-place-alist-from-file)) | |
163 (if buffer-file-name | |
164 (progn | |
19980
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
165 (let ((cell (assoc buffer-file-name save-place-alist)) |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
166 (position (if (not (eq major-mode 'hexl-mode)) |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
167 (point) |
61766
d4abeb773782
(save-place-to-alist): Use with-no-warnings.
Richard M. Stallman <rms@gnu.org>
parents:
61451
diff
changeset
|
168 (with-no-warnings |
d4abeb773782
(save-place-to-alist): Use with-no-warnings.
Richard M. Stallman <rms@gnu.org>
parents:
61451
diff
changeset
|
169 (1+ (hexl-current-address)))))) |
4596 | 170 (if cell |
19980
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
171 (setq save-place-alist (delq cell save-place-alist))) |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
172 (if (and save-place |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
173 (not (= position 1))) ;; Optimize out the degenerate case. |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
174 (setq save-place-alist |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
175 (cons (cons buffer-file-name position) |
2b5cebd0da5e
(save-place-to-alist): Optimize out the degenerate
Karl Heuer <kwzh@gnu.org>
parents:
19979
diff
changeset
|
176 save-place-alist))))))) |
4596 | 177 |
54111
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
178 (defun save-place-forget-unreadable-files () |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
179 "Remove unreadable files from `save-place-alist'. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
180 For each entry in the alist, if `file-readable-p' returns nil for the |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
181 filename, remove the entry. Save the new alist \(as the first pair |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
182 may have changed\) back to `save-place-alist'." |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
183 (interactive) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
184 ;; the following was adapted from an in-place filtering function, |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
185 ;; `filter-mod', used in the original. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
186 (unless (null save-place-alist) ;says it better than `when' |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
187 ;; first, check all except first |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
188 (let ((fmprev save-place-alist) (fmcur (cdr save-place-alist))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
189 (while fmcur ;not null |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
190 ;; a value is only saved when it becomes FMPREV. |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
191 (if (if (string-match save-place-skip-check-regexp (caar fmcur)) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
192 save-place-save-skipped |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
193 (file-readable-p (caar fmcur))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
194 (setq fmprev fmcur) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
195 (setcdr fmprev (cdr fmcur))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
196 (setq fmcur (cdr fmcur)))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
197 ;; test first pair, keep it if OK, otherwise 2nd element, which |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
198 ;; may be '() |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
199 (unless (if (string-match save-place-skip-check-regexp |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
200 (caar save-place-alist)) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
201 save-place-save-skipped |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
202 (file-readable-p (caar save-place-alist))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
203 (setq save-place-alist (cdr save-place-alist))))) |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
204 |
4596 | 205 (defun save-place-alist-to-file () |
79535
a84f960614b0
* lisp/saveplace.el (save-place-alist-to-file): Save with 'emacs-mule'
Karl Fogel <kfogel@red-bean.com>
parents:
78236
diff
changeset
|
206 (let ((file (expand-file-name save-place-file)) |
86986
a66a6a9bd1aa
* lisp/saveplace.el (save-place-alist-to-file): Set coding-system-for-write
Karl Fogel <kfogel@red-bean.com>
parents:
86985
diff
changeset
|
207 (coding-system-for-write 'utf-8)) |
4596 | 208 (save-excursion |
209 (set-buffer (get-buffer-create " *Saved Places*")) | |
210 (delete-region (point-min) (point-max)) | |
54111
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
211 (when save-place-forget-unreadable-files |
b49a38db4abc
(save-place-forget-unreadable-files)
Eli Zaretskii <eliz@is.elta.co.il>
parents:
52401
diff
changeset
|
212 (save-place-forget-unreadable-files)) |
79535
a84f960614b0
* lisp/saveplace.el (save-place-alist-to-file): Save with 'emacs-mule'
Karl Fogel <kfogel@red-bean.com>
parents:
78236
diff
changeset
|
213 (insert (format ";;; -*- coding: %s -*-\n" |
a84f960614b0
* lisp/saveplace.el (save-place-alist-to-file): Save with 'emacs-mule'
Karl Fogel <kfogel@red-bean.com>
parents:
78236
diff
changeset
|
214 (symbol-name coding-system-for-write))) |
55981
92b7aae8907e
* saveplace.el (save-place-alist-to-file): Bind `print-length'
Karl Fogel <kfogel@red-bean.com>
parents:
54111
diff
changeset
|
215 (let ((print-length nil) |
92b7aae8907e
* saveplace.el (save-place-alist-to-file): Bind `print-length'
Karl Fogel <kfogel@red-bean.com>
parents:
54111
diff
changeset
|
216 (print-level nil)) |
92b7aae8907e
* saveplace.el (save-place-alist-to-file): Bind `print-length'
Karl Fogel <kfogel@red-bean.com>
parents:
54111
diff
changeset
|
217 (print save-place-alist (current-buffer))) |
6662
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
218 (let ((version-control |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
219 (cond |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
220 ((null save-place-version-control) nil) |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
221 ((eq 'never save-place-version-control) 'never) |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
222 ((eq 'nospecial save-place-version-control) version-control) |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
223 (t |
bc7bc2a395c6
(save-place-version-control): New var, for determining
Richard M. Stallman <rms@gnu.org>
parents:
4596
diff
changeset
|
224 t)))) |
61451
25fbe49d4631
(save-place-alist-to-file): Catch errors writing file.
Richard M. Stallman <rms@gnu.org>
parents:
58275
diff
changeset
|
225 (condition-case nil |
62862
8641f46cf18f
(save-place-alist-to-file): Write the file using write-region.
Richard M. Stallman <rms@gnu.org>
parents:
61766
diff
changeset
|
226 ;; Don't use write-file; we don't want this buffer to visit it. |
79535
a84f960614b0
* lisp/saveplace.el (save-place-alist-to-file): Save with 'emacs-mule'
Karl Fogel <kfogel@red-bean.com>
parents:
78236
diff
changeset
|
227 (write-region (point-min) (point-max) file) |
87015
eb85998bbcf9
* emacs-cvs/lisp/saveplace.el (save-place-quiet): Remove, reverting 1.39.
Karl Fogel <kfogel@red-bean.com>
parents:
86986
diff
changeset
|
228 (file-error (message "Saving places: can't write %s" file))) |
eb85998bbcf9
* emacs-cvs/lisp/saveplace.el (save-place-quiet): Remove, reverting 1.39.
Karl Fogel <kfogel@red-bean.com>
parents:
86986
diff
changeset
|
229 (kill-buffer (current-buffer)))))) |
4596 | 230 |
231 (defun load-save-place-alist-from-file () | |
232 (if (not save-place-loaded) | |
233 (progn | |
234 (setq save-place-loaded t) | |
235 (let ((file (expand-file-name save-place-file))) | |
236 ;; make sure that the alist does not get overwritten, and then | |
237 ;; load it if it exists: | |
238 (if (file-readable-p file) | |
239 (save-excursion | |
240 ;; don't want to use find-file because we have been | |
241 ;; adding hooks to it. | |
242 (set-buffer (get-buffer-create " *Saved Places*")) | |
243 (delete-region (point-min) (point-max)) | |
244 (insert-file-contents file) | |
245 (goto-char (point-min)) | |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
46899
diff
changeset
|
246 (setq save-place-alist |
4596 | 247 (car (read-from-string |
248 (buffer-substring (point-min) (point-max))))) | |
13665
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
249 |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
250 ;; If there is a limit, and we're over it, then we'll |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
251 ;; have to truncate the end of the list: |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
252 (if save-place-limit |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
253 (if (<= save-place-limit 0) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
254 ;; Zero gets special cased. I'm not thrilled |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
255 ;; with this, but the loop for >= 1 is tight. |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
256 (setq save-place-alist nil) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
257 ;; Else the limit is >= 1, so enforce it by |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
258 ;; counting and then `setcdr'ing. |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
259 (let ((s save-place-alist) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
260 (count 1)) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
261 (while s |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
262 (if (>= count save-place-limit) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
263 (setcdr s nil) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
264 (setq count (1+ count))) |
abc765f9bee3
(save-place-limit): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13600
diff
changeset
|
265 (setq s (cdr s)))))) |
49597
e88404e8f2cf
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
46899
diff
changeset
|
266 |
87015
eb85998bbcf9
* emacs-cvs/lisp/saveplace.el (save-place-quiet): Remove, reverting 1.39.
Karl Fogel <kfogel@red-bean.com>
parents:
86986
diff
changeset
|
267 (kill-buffer (current-buffer)))) |
4596 | 268 nil)))) |
269 | |
270 (defun save-places-to-alist () | |
271 ;; go through buffer-list, saving places to alist if save-place is | |
272 ;; non-nil, deleting them from alist if it is nil. | |
273 (let ((buf-list (buffer-list))) | |
274 (while buf-list | |
275 ;; put this into a save-excursion in case someone is counting on | |
276 ;; another function in kill-emacs-hook to act on the last buffer | |
277 ;; they were in: | |
278 (save-excursion | |
279 (set-buffer (car buf-list)) | |
280 ;; save-place checks buffer-file-name too, but we can avoid | |
281 ;; overhead of function call by checking here too. | |
282 (and buffer-file-name (save-place-to-alist)) | |
283 (setq buf-list (cdr buf-list)))))) | |
284 | |
6700
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
285 (defun save-place-find-file-hook () |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
286 (or save-place-loaded (load-save-place-alist-from-file)) |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
287 (let ((cell (assoc buffer-file-name save-place-alist))) |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
288 (if cell |
15192 | 289 (progn |
290 (or after-find-file-from-revert-buffer | |
291 (goto-char (cdr cell))) | |
6700
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
292 ;; and make sure it will be saved again for later |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
293 (setq save-place t))))) |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
294 |
6877
6347a8d838c8
(save-place-kill-emacs-hook): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents:
6700
diff
changeset
|
295 (defun save-place-kill-emacs-hook () |
14768
ba3525471dae
(save-place-kill-emacs-hook): Always call save-places-to-alist.
Richard M. Stallman <rms@gnu.org>
parents:
14753
diff
changeset
|
296 ;; First update the alist. This loads the old save-place-file if nec. |
ba3525471dae
(save-place-kill-emacs-hook): Always call save-places-to-alist.
Richard M. Stallman <rms@gnu.org>
parents:
14753
diff
changeset
|
297 (save-places-to-alist) |
ba3525471dae
(save-place-kill-emacs-hook): Always call save-places-to-alist.
Richard M. Stallman <rms@gnu.org>
parents:
14753
diff
changeset
|
298 ;; Now save the alist in the file, if we have ever loaded the file |
ba3525471dae
(save-place-kill-emacs-hook): Always call save-places-to-alist.
Richard M. Stallman <rms@gnu.org>
parents:
14753
diff
changeset
|
299 ;; (including just now). |
14753
cf8ad47dc610
(save-place-kill-emacs-hook): Don't save
Richard M. Stallman <rms@gnu.org>
parents:
14357
diff
changeset
|
300 (if save-place-loaded |
14768
ba3525471dae
(save-place-kill-emacs-hook): Always call save-places-to-alist.
Richard M. Stallman <rms@gnu.org>
parents:
14753
diff
changeset
|
301 (save-place-alist-to-file))) |
6700
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
302 |
46899
f00337f04e78
Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40162
diff
changeset
|
303 (add-hook 'find-file-hook 'save-place-find-file-hook t) |
6700
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
304 |
db2292ce4894
(save-place-find-file-hook, save-place-kill-emacs-hook): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
6662
diff
changeset
|
305 (add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook) |
4596 | 306 |
307 (add-hook 'kill-buffer-hook 'save-place-to-alist) | |
308 | |
309 (provide 'saveplace) ; why not... | |
310 | |
93975
1e3a407766b9
Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93166
diff
changeset
|
311 ;; arch-tag: 3c2ef47b-0a22-4558-b116-118c9ef454a0 |
4596 | 312 ;;; saveplace.el ends here |