Mercurial > emacs
comparison lisp/time-stamp.el @ 21073:82e7d581bad1
(time-stamp-pattern): New variable.
(time-stamp): Use that new variable.
(time-stamp-string): Take optional format arg.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 06 Mar 1998 03:48:15 +0000 |
parents | 1366d82c1d3f |
children | c9307c229265 |
comparison
equal
deleted
inserted
replaced
21072:ef9a01b67c87 | 21073:82e7d581bad1 |
---|---|
1 ;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs | 1 ;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs |
2 | 2 |
3 ;; Copyright 1989, 1993, 1994, 1995, 1997 Free Software Foundation, Inc. | 3 ;; Copyright 1989, 1993, 1994, 1995, 1997 Free Software Foundation, Inc. |
4 | 4 |
5 ;; Maintainer's Time-stamp: <1997-08-07 14:46:50 gildea> | 5 ;; Maintainer's Time-stamp: <1998-03-04 14:14:19 gildea> |
6 ;; Maintainer: Stephen Gildea <gildea@alum.mit.edu> | 6 ;; Maintainer: Stephen Gildea <gildea@alum.mit.edu> |
7 ;; Keywords: tools | 7 ;; Keywords: tools |
8 | 8 |
9 ;; This file is free software; you can redistribute it and/or modify | 9 ;; This file is free software; you can redistribute it and/or modify |
10 ;; it under the terms of the GNU General Public License as published by | 10 ;; it under the terms of the GNU General Public License as published by |
115 Format is the same as that used by the environment variable TZ on your system." | 115 Format is the same as that used by the environment variable TZ on your system." |
116 :type '(choice (const nil) string) | 116 :type '(choice (const nil) string) |
117 :group 'time-stamp) | 117 :group 'time-stamp) |
118 | 118 |
119 | 119 |
120 ;;; Do not change time-stamp-line-limit, time-stamp-start, or | 120 ;;; Do not change time-stamp-line-limit, time-stamp-start, |
121 ;;; time-stamp-end in your .emacs or you will be incompatible | 121 ;;; time-stamp-end, or time-stamp-pattern in your .emacs |
122 ;;; with other people's files! If you must change them, | 122 ;;; or you will be incompatible with other people's files! |
123 ;;; do so only in the local variables section of the file itself. | 123 ;;; If you must change them, do so only in the local variables |
124 ;;; section of the file itself. | |
124 | 125 |
125 | 126 |
126 (defvar time-stamp-line-limit 8 ;Do not change! | 127 (defvar time-stamp-line-limit 8 ;Do not change! |
127 "Lines of a file searched; positive counts from start, negative from end. | 128 "Lines of a file searched; positive counts from start, negative from end. |
128 The patterns `time-stamp-start' and `time-stamp-end' must be found on one | 129 The patterns `time-stamp-start' and `time-stamp-end' must be found on one |
153 | 154 |
154 Do not change `time-stamp-line-limit', `time-stamp-start', or | 155 Do not change `time-stamp-line-limit', `time-stamp-start', or |
155 `time-stamp-end' for yourself or you will be incompatible | 156 `time-stamp-end' for yourself or you will be incompatible |
156 with other people's files! If you must change them for some application, | 157 with other people's files! If you must change them for some application, |
157 do so in the local variables section of the time-stamped file itself.") | 158 do so in the local variables section of the time-stamped file itself.") |
159 | |
160 | |
161 (defvar time-stamp-pattern "%%" ;Do not change! | |
162 "Convenience variable setting all time-stamp location and format variables. | |
163 This string has four parts, each of which is optional. | |
164 These four parts set time-stamp-line-limit, time-stamp-start, | |
165 time-stamp-format, and time-stamp-end. See the documentation | |
166 for each of these variables for details. | |
167 | |
168 The first part is a number followed by a slash; the number sets the number | |
169 of lines at the beginning (negative counts from end) of the file searched | |
170 for the time-stamp. The number and the slash may be omitted to use the | |
171 normal value. | |
172 | |
173 The second part is a regexp identifying the pattern preceding the time stamp. | |
174 This part may be omitted to use the normal pattern. | |
175 | |
176 The third part specifies the format of the time-stamp inserted. See | |
177 the documentation for time-stamp-format for details. Specify this | |
178 part as \"%%\" to use the normal format. | |
179 | |
180 The fourth part is a regexp identifying the pattern following the time stamp. | |
181 This part may be omitted to use the normal pattern. | |
182 | |
183 As an example, the default behavior can be specified something like this: | |
184 \"8/Time-stamp: [\\\"<]%:y-%02m-%02d %02H:%02M:%02S %u[\\\">]\" | |
185 | |
186 Do not change `time-stamp-pattern' for yourself or you will be incompatible | |
187 with other people's files! Set it only in the local variables section | |
188 of the time-stamped file itself.") | |
158 | 189 |
159 | 190 |
160 | 191 |
161 ;;;###autoload | 192 ;;;###autoload |
162 (defun time-stamp () | 193 (defun time-stamp () |
167 Normally the template must appear in the first 8 lines of a file and | 198 Normally the template must appear in the first 8 lines of a file and |
168 look like one of the following: | 199 look like one of the following: |
169 Time-stamp: <> | 200 Time-stamp: <> |
170 Time-stamp: \" \" | 201 Time-stamp: \" \" |
171 The time stamp is written between the brackets or quotes: | 202 The time stamp is written between the brackets or quotes: |
172 Time-stamp: <1996-07-18 10:20:51 gildea> | 203 Time-stamp: <1998-02-18 10:20:51 gildea> |
173 The time stamp is updated only if the variable `time-stamp-active' is non-nil. | 204 The time stamp is updated only if the variable `time-stamp-active' is non-nil. |
174 The format of the time stamp is set by the variable `time-stamp-format'. | 205 The format of the time stamp is set by the variable `time-stamp-format'. |
175 The variables `time-stamp-line-limit', `time-stamp-start', | 206 The variables `time-stamp-line-limit', `time-stamp-start', |
176 and `time-stamp-end' control finding the template." | 207 and `time-stamp-end' control finding the template." |
177 (interactive) | 208 (interactive) |
178 (let ((case-fold-search nil) | 209 (let ((case-fold-search nil) |
179 (start nil) | 210 (start nil) |
180 (end nil) | 211 (end nil) |
181 search-limit | 212 search-limit |
182 (line-limit time-stamp-line-limit)) | 213 (line-limit time-stamp-line-limit) |
214 (ts-start time-stamp-start) | |
215 (ts-format time-stamp-format) | |
216 (ts-end time-stamp-end)) | |
217 (if (stringp time-stamp-pattern) | |
218 (progn | |
219 (string-match "^\\(\\(-?[0-9]+\\)/\\)?\\([^%]+\\)?\\(.*%[-.,:@+_ #^()0-9]*[A-Za-z%]\\)?\\([^%]+\\)?$" time-stamp-pattern) | |
220 (and (match-beginning 2) | |
221 (setq line-limit | |
222 (string-to-int (match-string 2 time-stamp-pattern)))) | |
223 (and (match-beginning 3) | |
224 (setq ts-start (match-string 3 time-stamp-pattern))) | |
225 (and (match-beginning 4) | |
226 (not (string-equal (match-string 4 time-stamp-pattern) "%%")) | |
227 (setq ts-format (match-string 4 time-stamp-pattern))) | |
228 (and (match-beginning 5) | |
229 (setq ts-end (match-string 5 time-stamp-pattern))))) | |
183 (cond ((not (integerp line-limit)) | 230 (cond ((not (integerp line-limit)) |
184 (setq line-limit 8) | 231 (setq line-limit 8) |
185 (message "time-stamp-line-limit is not a number") | 232 (message "time-stamp-line-limit is not an integer") |
186 (sit-for 1))) | 233 (sit-for 1))) |
187 (save-excursion | 234 (save-excursion |
188 (save-restriction | 235 (save-restriction |
189 (widen) | 236 (widen) |
190 (cond ((> line-limit 0) | 237 (cond ((> line-limit 0) |
196 (forward-line line-limit) | 243 (forward-line line-limit) |
197 (setq start (point)))) | 244 (setq start (point)))) |
198 (goto-char start) | 245 (goto-char start) |
199 (while (and (< (point) search-limit) | 246 (while (and (< (point) search-limit) |
200 (not end) | 247 (not end) |
201 (re-search-forward time-stamp-start search-limit 'move)) | 248 (re-search-forward ts-start search-limit 'move)) |
202 (setq start (point)) | 249 (setq start (point)) |
203 (end-of-line) | 250 (end-of-line) |
204 (let ((line-end (point))) | 251 (let ((line-end (point))) |
205 (goto-char start) | 252 (goto-char start) |
206 (if (re-search-forward time-stamp-end line-end 'move) | 253 (if (re-search-forward ts-end line-end 'move) |
207 (setq end (match-beginning 0))))))) | 254 (setq end (match-beginning 0))))))) |
208 (if end | 255 (if end |
209 (progn | 256 (progn |
210 ;; do all warnings outside save-excursion | 257 ;; do all warnings outside save-excursion |
211 (cond | 258 (cond |
212 ((not time-stamp-active) | 259 ((not time-stamp-active) |
213 (if time-stamp-warn-inactive | 260 (if time-stamp-warn-inactive |
214 ;; don't signal an error in a write-file-hook | 261 ;; don't signal an error in a write-file-hook |
215 (progn | 262 (progn |
216 (message "Warning: time-stamp-active is off; did not time-stamp buffer.") | 263 (message "Warning: time-stamp-active is off; did not time-stamp buffer.") |
217 (sit-for 1)))) | 264 (sit-for 1)))) |
218 ((not (and (stringp time-stamp-start) | 265 ((not (and (stringp ts-start) |
219 (stringp time-stamp-end))) | 266 (stringp ts-end))) |
220 (message "time-stamp-start or time-stamp-end is not a string") | 267 (message "time-stamp-start or time-stamp-end is not a string") |
221 (sit-for 1)) | 268 (sit-for 1)) |
222 (t | 269 (t |
223 (let ((new-time-stamp (time-stamp-string))) | 270 (let ((new-time-stamp (time-stamp-string ts-format))) |
224 (if (stringp new-time-stamp) | 271 (if (stringp new-time-stamp) |
225 (save-excursion | 272 (save-excursion |
226 (save-restriction | 273 (save-restriction |
227 (widen) | 274 (widen) |
228 (delete-region start end) | 275 (delete-region start end) |
229 (goto-char start) | 276 (goto-char start) |
230 (insert-and-inherit new-time-stamp) | 277 (insert-and-inherit new-time-stamp) |
231 (setq end (point)) | 278 (setq end (point)) |
232 ;; remove any tabs used to format time stamp | 279 ;; remove any tabs used to format time stamp |
233 (goto-char start) | 280 (goto-char start) |
234 (if (search-forward "\t" end t) | 281 (if (search-forward "\t" end t) |
235 (untabify start end))))))))))) | 282 (untabify start end))))))))))) |
236 ;; be sure to return nil so can be used on write-file-hooks | 283 ;; be sure to return nil so can be used on write-file-hooks |
237 nil) | 284 nil) |
238 | 285 |
239 ;;;###autoload | 286 ;;;###autoload |
240 (defun time-stamp-toggle-active (&optional arg) | 287 (defun time-stamp-toggle-active (&optional arg) |
462 (insert "\"" old-form "\" -- use " new-form "\n")) | 509 (insert "\"" old-form "\" -- use " new-form "\n")) |
463 (display-buffer "*Time-stamp-compatibility*")))) | 510 (display-buffer "*Time-stamp-compatibility*")))) |
464 | 511 |
465 | 512 |
466 | 513 |
467 (defun time-stamp-string () | 514 (defun time-stamp-string (&optional ts-format) |
468 "Generate the new string to be inserted by \\[time-stamp]." | 515 "Generate the new string to be inserted by \\[time-stamp]. |
469 (if (stringp time-stamp-format) | 516 Optionally use FORMAT." |
517 (or ts-format | |
518 (setq ts-format time-stamp-format)) | |
519 (if (stringp ts-format) | |
470 (if (stringp time-stamp-time-zone) | 520 (if (stringp time-stamp-time-zone) |
471 (let ((real-time-zone (getenv "TZ"))) | 521 (let ((real-time-zone (getenv "TZ"))) |
472 (unwind-protect | 522 (unwind-protect |
473 (progn | 523 (progn |
474 (setenv "TZ" time-stamp-time-zone) | 524 (setenv "TZ" time-stamp-time-zone) |
475 (format-time-string | 525 (format-time-string |
476 (time-stamp-string-preprocess time-stamp-format))) | 526 (time-stamp-string-preprocess ts-format))) |
477 (setenv "TZ" real-time-zone))) | 527 (setenv "TZ" real-time-zone))) |
478 (format-time-string | 528 (format-time-string |
479 (time-stamp-string-preprocess time-stamp-format))) | 529 (time-stamp-string-preprocess ts-format))) |
480 ;; handle version 1 compatibility | 530 ;; handle version 1 compatibility |
481 (cond ((or (eq time-stamp-old-format-warn 'error) | 531 (cond ((or (eq time-stamp-old-format-warn 'error) |
482 (and (eq time-stamp-old-format-warn 'ask) | 532 (and (eq time-stamp-old-format-warn 'ask) |
483 (not (y-or-n-p "Use non-string time-stamp-format? ")))) | 533 (not (y-or-n-p "Use non-string time-stamp-format? ")))) |
484 (message "Warning: no time-stamp: time-stamp-format not a string") | 534 (message "Warning: no time-stamp: time-stamp-format not a string") |
486 nil) | 536 nil) |
487 (t | 537 (t |
488 (cond ((eq time-stamp-old-format-warn 'warn) | 538 (cond ((eq time-stamp-old-format-warn 'warn) |
489 (message "Obsolescent time-stamp-format type; should be string") | 539 (message "Obsolescent time-stamp-format type; should be string") |
490 (sit-for 1))) | 540 (sit-for 1))) |
491 (time-stamp-fconcat time-stamp-format " "))))) | 541 (time-stamp-fconcat ts-format " "))))) |
492 | 542 |
493 (defconst time-stamp-no-file "(no file)" | 543 (defconst time-stamp-no-file "(no file)" |
494 "String to use when the buffer is not associated with a file.") | 544 "String to use when the buffer is not associated with a file.") |
495 | 545 |
496 (defun time-stamp-mail-host-name () | 546 (defun time-stamp-mail-host-name () |