;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs
-;; Copyright (C) 1989, 1993, 1994, 1995, 1997, 2000, 2001, 2002, 2003,
-;; 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 1989, 1993-1995, 1997, 2000-2016 Free Software
+;; Foundation, Inc.
;; This file is part of GNU Emacs.
-;; Maintainer's Time-stamp: <2006-04-12 20:30:56 rms>
;; Maintainer: Stephen Gildea <gildea@stop.mail-abuse.org>
;; Keywords: tools
;; A template in a file can be updated with a new time stamp when
;; you save the file. For example:
;; static char *ts = "sdmain.c Time-stamp: <2001-08-13 10:20:51 gildea>";
-;; See the top of `time-stamp.el' for another example.
-;; To use time-stamping, add this line to your .emacs file:
+;; To use time-stamping, add this line to your init file:
;; (add-hook 'before-save-hook 'time-stamp)
;; Now any time-stamp templates in your files will be updated automatically.
:group 'time-stamp)
(defcustom time-stamp-time-zone nil
- "If non-nil, a string naming the timezone to be used by \\[time-stamp].
-Format is the same as that used by the environment variable TZ on your system."
- :type '(choice (const nil) string)
+ "The time zone to be used by \\[time-stamp].
+Its format is that of the ZONE argument of the `format-time-string' function."
+ :type '(choice (const :tag "Emacs local time" nil)
+ (const :tag "Universal Time" t)
+ (const :tag "system wall clock time" wall)
+ (string :tag "TZ environment variable value"))
:group 'time-stamp
:version "20.1")
;;;###autoload(put 'time-stamp-time-zone 'safe-local-variable 'string-or-null-p)
(defun time-stamp ()
"Update the time stamp string(s) in the buffer.
A template in a file can be automatically updated with a new time stamp
-every time you save the file. Add this line to your .emacs file:
- (add-hook 'before-save-hook 'time-stamp)
+every time you save the file. Add this line to your init file:
+ (add-hook \\='before-save-hook \\='time-stamp)
or customize `before-save-hook' through Custom.
Normally the template must appear in the first 8 lines of a file and
look like one of the following:
(> (prefix-numeric-value arg) 0)))
(message "time-stamp is now %s." (if time-stamp-active "active" "off")))
+(defun time-stamp--format (format time)
+ (format-time-string format time time-stamp-time-zone))
(defun time-stamp-string (&optional ts-format)
"Generate the new string to be inserted by \\[time-stamp].
(or ts-format
(setq ts-format time-stamp-format))
(if (stringp ts-format)
- (if (stringp time-stamp-time-zone)
- (let ((ts-real-time-zone (getenv "TZ")))
- (unwind-protect
- (progn
- (set-time-zone-rule time-stamp-time-zone)
- (format-time-string
- (time-stamp-string-preprocess ts-format)))
- (set-time-zone-rule ts-real-time-zone)))
- (format-time-string
- (time-stamp-string-preprocess ts-format)))
+ (time-stamp--format (time-stamp-string-preprocess ts-format) nil)
;; handle version 1 compatibility
(cond ((or (eq time-stamp-old-format-warn 'error)
(and (eq time-stamp-old-format-warn 'ask)
(result "")
field-width
field-result
- alt-form change-case require-padding
+ alt-form change-case
(paren-level 0))
(while (< ind fmt-len)
(setq cur-char (aref format ind))
(cond
((eq cur-char ?%)
;; eat any additional args to allow for future expansion
- (setq alt-form nil change-case nil require-padding nil field-width "")
+ (setq alt-form nil change-case nil field-width "")
(while (progn
(setq ind (1+ ind))
(setq cur-char (if (< ind fmt-len)
"%%")
((eq cur-char ?a) ;day of week
(if change-case
- (format-time-string "%#a" time)
+ (time-stamp--format "%#a" time)
(or alt-form (not (string-equal field-width ""))
(time-stamp-conv-warn "%a" "%:a"))
(if (and alt-form (not (string-equal field-width "")))
"" ;discourage "%:3a"
- (format-time-string "%A" time))))
+ (time-stamp--format "%A" time))))
((eq cur-char ?A)
(if alt-form
- (format-time-string "%A" time)
+ (time-stamp--format "%A" time)
(or change-case (not (string-equal field-width ""))
(time-stamp-conv-warn "%A" "%#A"))
- (format-time-string "%#A" time)))
+ (time-stamp--format "%#A" time)))
((eq cur-char ?b) ;month name
(if change-case
- (format-time-string "%#b" time)
+ (time-stamp--format "%#b" time)
(or alt-form (not (string-equal field-width ""))
(time-stamp-conv-warn "%b" "%:b"))
(if (and alt-form (not (string-equal field-width "")))
"" ;discourage "%:3b"
- (format-time-string "%B" time))))
+ (time-stamp--format "%B" time))))
((eq cur-char ?B)
(if alt-form
- (format-time-string "%B" time)
+ (time-stamp--format "%B" time)
(or change-case (not (string-equal field-width ""))
(time-stamp-conv-warn "%B" "%#B"))
- (format-time-string "%#B" time)))
+ (time-stamp--format "%#B" time)))
((eq cur-char ?d) ;day of month, 1-31
(time-stamp-do-number cur-char alt-form field-width time))
((eq cur-char ?H) ;hour, 0-23
((eq cur-char ?p) ;am or pm
(or change-case
(time-stamp-conv-warn "%p" "%#p"))
- (format-time-string "%#p" time))
+ (time-stamp--format "%#p" time))
((eq cur-char ?P) ;AM or PM
- (format-time-string "%p" time))
+ (time-stamp--format "%p" time))
((eq cur-char ?S) ;seconds, 00-60
(time-stamp-do-number cur-char alt-form field-width time))
((eq cur-char ?w) ;weekday number, Sunday is 0
- (format-time-string "%w" time))
+ (time-stamp--format "%w" time))
((eq cur-char ?y) ;year
(or alt-form (not (string-equal field-width ""))
(time-stamp-conv-warn "%y" "%:y"))
- (string-to-number (format-time-string "%Y" time)))
+ (string-to-number (time-stamp--format "%Y" time)))
((eq cur-char ?Y) ;4-digit year, new style
- (string-to-number (format-time-string "%Y" time)))
+ (string-to-number (time-stamp--format "%Y" time)))
((eq cur-char ?z) ;time zone lower case
(if change-case
"" ;discourage %z variations
- (format-time-string "%#Z" time)))
+ (time-stamp--format "%#Z" time)))
((eq cur-char ?Z)
(if change-case
- (format-time-string "%#Z" time)
- (format-time-string "%Z" time)))
+ (time-stamp--format "%#Z" time)
+ (time-stamp--format "%Z" time)))
((eq cur-char ?f) ;buffer-file-name, base name only
(if buffer-file-name
(file-name-nondirectory buffer-file-name)
(format "%%:%c" format-char)))
(if (and alt-form (not (string-equal field-width "")))
"" ;discourage "%:2d" and the like
- (string-to-number (format-time-string format-string time)))))
+ (string-to-number (time-stamp--format format-string time)))))
(defvar time-stamp-conversion-warn t
"Warn about soon-to-be-unsupported forms in `time-stamp-format'.
;;; the rest of this file is for version 1 compatibility
(defun time-stamp-fconcat (list sep)
- "Similar to (mapconcat 'funcall LIST SEP) but LIST allows literals.
+ "Similar to (mapconcat \\='funcall LIST SEP) but LIST allows literals.
If an element of LIST is a symbol, it is funcalled to get the string to use;
the separator SEP is used between two strings obtained by funcalling a
symbol. Otherwise the element itself is inserted; no separator is used