1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-29 11:02:01 +00:00

(time-stamp-pattern): New variable.

(time-stamp): Use that new variable.
(time-stamp-string): Take optional format arg.
This commit is contained in:
Richard M. Stallman 1998-03-06 03:48:15 +00:00
parent 3e2c89815d
commit b4b33e0104

View File

@ -2,7 +2,7 @@
;; Copyright 1989, 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
;; Maintainer's Time-stamp: <1997-08-07 14:46:50 gildea>
;; Maintainer's Time-stamp: <1998-03-04 14:14:19 gildea>
;; Maintainer: Stephen Gildea <gildea@alum.mit.edu>
;; Keywords: tools
@ -117,10 +117,11 @@ Format is the same as that used by the environment variable TZ on your system."
:group 'time-stamp)
;;; Do not change time-stamp-line-limit, time-stamp-start, or
;;; time-stamp-end in your .emacs or you will be incompatible
;;; with other people's files! If you must change them,
;;; do so only in the local variables section of the file itself.
;;; Do not change time-stamp-line-limit, time-stamp-start,
;;; time-stamp-end, or time-stamp-pattern in your .emacs
;;; or you will be incompatible with other people's files!
;;; If you must change them, do so only in the local variables
;;; section of the file itself.
(defvar time-stamp-line-limit 8 ;Do not change!
@ -157,6 +158,36 @@ with other people's files! If you must change them for some application,
do so in the local variables section of the time-stamped file itself.")
(defvar time-stamp-pattern "%%" ;Do not change!
"Convenience variable setting all time-stamp location and format variables.
This string has four parts, each of which is optional.
These four parts set time-stamp-line-limit, time-stamp-start,
time-stamp-format, and time-stamp-end. See the documentation
for each of these variables for details.
The first part is a number followed by a slash; the number sets the number
of lines at the beginning (negative counts from end) of the file searched
for the time-stamp. The number and the slash may be omitted to use the
normal value.
The second part is a regexp identifying the pattern preceding the time stamp.
This part may be omitted to use the normal pattern.
The third part specifies the format of the time-stamp inserted. See
the documentation for time-stamp-format for details. Specify this
part as \"%%\" to use the normal format.
The fourth part is a regexp identifying the pattern following the time stamp.
This part may be omitted to use the normal pattern.
As an example, the default behavior can be specified something like this:
\"8/Time-stamp: [\\\"<]%:y-%02m-%02d %02H:%02M:%02S %u[\\\">]\"
Do not change `time-stamp-pattern' for yourself or you will be incompatible
with other people's files! Set it only in the local variables section
of the time-stamped file itself.")
;;;###autoload
(defun time-stamp ()
@ -169,7 +200,7 @@ look like one of the following:
Time-stamp: <>
Time-stamp: \" \"
The time stamp is written between the brackets or quotes:
Time-stamp: <1996-07-18 10:20:51 gildea>
Time-stamp: <1998-02-18 10:20:51 gildea>
The time stamp is updated only if the variable `time-stamp-active' is non-nil.
The format of the time stamp is set by the variable `time-stamp-format'.
The variables `time-stamp-line-limit', `time-stamp-start',
@ -179,10 +210,26 @@ and `time-stamp-end' control finding the template."
(start nil)
(end nil)
search-limit
(line-limit time-stamp-line-limit))
(line-limit time-stamp-line-limit)
(ts-start time-stamp-start)
(ts-format time-stamp-format)
(ts-end time-stamp-end))
(if (stringp time-stamp-pattern)
(progn
(string-match "^\\(\\(-?[0-9]+\\)/\\)?\\([^%]+\\)?\\(.*%[-.,:@+_ #^()0-9]*[A-Za-z%]\\)?\\([^%]+\\)?$" time-stamp-pattern)
(and (match-beginning 2)
(setq line-limit
(string-to-int (match-string 2 time-stamp-pattern))))
(and (match-beginning 3)
(setq ts-start (match-string 3 time-stamp-pattern)))
(and (match-beginning 4)
(not (string-equal (match-string 4 time-stamp-pattern) "%%"))
(setq ts-format (match-string 4 time-stamp-pattern)))
(and (match-beginning 5)
(setq ts-end (match-string 5 time-stamp-pattern)))))
(cond ((not (integerp line-limit))
(setq line-limit 8)
(message "time-stamp-line-limit is not a number")
(message "time-stamp-line-limit is not an integer")
(sit-for 1)))
(save-excursion
(save-restriction
@ -198,41 +245,41 @@ and `time-stamp-end' control finding the template."
(goto-char start)
(while (and (< (point) search-limit)
(not end)
(re-search-forward time-stamp-start search-limit 'move))
(re-search-forward ts-start search-limit 'move))
(setq start (point))
(end-of-line)
(let ((line-end (point)))
(goto-char start)
(if (re-search-forward time-stamp-end line-end 'move)
(if (re-search-forward ts-end line-end 'move)
(setq end (match-beginning 0)))))))
(if end
(progn
;; do all warnings outside save-excursion
(cond
((not time-stamp-active)
(if time-stamp-warn-inactive
;; don't signal an error in a write-file-hook
(progn
(message "Warning: time-stamp-active is off; did not time-stamp buffer.")
(sit-for 1))))
((not (and (stringp time-stamp-start)
(stringp time-stamp-end)))
(message "time-stamp-start or time-stamp-end is not a string")
(sit-for 1))
(t
(let ((new-time-stamp (time-stamp-string)))
(if (stringp new-time-stamp)
(save-excursion
(save-restriction
(widen)
(delete-region start end)
(goto-char start)
(insert-and-inherit new-time-stamp)
(setq end (point))
;; remove any tabs used to format time stamp
(goto-char start)
(if (search-forward "\t" end t)
(untabify start end)))))))))))
(if end
(progn
;; do all warnings outside save-excursion
(cond
((not time-stamp-active)
(if time-stamp-warn-inactive
;; don't signal an error in a write-file-hook
(progn
(message "Warning: time-stamp-active is off; did not time-stamp buffer.")
(sit-for 1))))
((not (and (stringp ts-start)
(stringp ts-end)))
(message "time-stamp-start or time-stamp-end is not a string")
(sit-for 1))
(t
(let ((new-time-stamp (time-stamp-string ts-format)))
(if (stringp new-time-stamp)
(save-excursion
(save-restriction
(widen)
(delete-region start end)
(goto-char start)
(insert-and-inherit new-time-stamp)
(setq end (point))
;; remove any tabs used to format time stamp
(goto-char start)
(if (search-forward "\t" end t)
(untabify start end)))))))))))
;; be sure to return nil so can be used on write-file-hooks
nil)
@ -464,19 +511,22 @@ The new forms being recommended now will continue to work then.")
(defun time-stamp-string ()
"Generate the new string to be inserted by \\[time-stamp]."
(if (stringp time-stamp-format)
(defun time-stamp-string (&optional ts-format)
"Generate the new string to be inserted by \\[time-stamp].
Optionally use FORMAT."
(or ts-format
(setq ts-format time-stamp-format))
(if (stringp ts-format)
(if (stringp time-stamp-time-zone)
(let ((real-time-zone (getenv "TZ")))
(unwind-protect
(progn
(setenv "TZ" time-stamp-time-zone)
(format-time-string
(time-stamp-string-preprocess time-stamp-format)))
(time-stamp-string-preprocess ts-format)))
(setenv "TZ" real-time-zone)))
(format-time-string
(time-stamp-string-preprocess time-stamp-format)))
(time-stamp-string-preprocess ts-format)))
;; handle version 1 compatibility
(cond ((or (eq time-stamp-old-format-warn 'error)
(and (eq time-stamp-old-format-warn 'ask)
@ -488,7 +538,7 @@ The new forms being recommended now will continue to work then.")
(cond ((eq time-stamp-old-format-warn 'warn)
(message "Obsolescent time-stamp-format type; should be string")
(sit-for 1)))
(time-stamp-fconcat time-stamp-format " ")))))
(time-stamp-fconcat ts-format " ")))))
(defconst time-stamp-no-file "(no file)"
"String to use when the buffer is not associated with a file.")