Mercurial > hg > xemacs-beta
diff lisp/packages/time-stamp.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | b82b59fe008d |
children | b9518feda344 |
line wrap: on
line diff
--- a/lisp/packages/time-stamp.el Mon Aug 13 09:00:04 2007 +0200 +++ b/lisp/packages/time-stamp.el Mon Aug 13 09:02:59 2007 +0200 @@ -1,419 +1,134 @@ ;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs +;;; Copyright 1989, 1993 Free Software Foundation, Inc. -;; Copyright 1989, 1993, 1994, 1995 Free Software Foundation, Inc. - -;; Maintainer's Time-stamp: <95/12/28 19:48:49 gildea> ;; Maintainer: Stephen Gildea <gildea@lcs.mit.edu> +;; Time-stamp: <93/06/20 17:36:04 gildea> ;; Keywords: tools -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -;; 02111-1307, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -;;; Synched up with: 19.34. +;;; Synched up with: Not synched with FSF. ;;; Commentary: -;; If you put a time stamp template anywhere in the first 8 lines of a file, -;; it can be updated every time you save the file. See the top of -;; time-stamp.el for a sample. The template looks like one of the following: -;; Time-stamp: <> -;; Time-stamp: " " -;; The time stamp is written between the brackets or quotes, resulting in -;; Time-stamp: <95/01/18 10:20:51 gildea> -;; Here is an example that puts the file name and time stamp in the binary: -;; static char *time_stamp = "sdmain.c Time-stamp: <>"; +;;; If you put a time stamp template anywhere in the first 8 lines of a file, +;;; it can be updated every time you save the file. See the top of +;;; time-stamp.el for a sample. The template looks like one of the following: +;;; Time-stamp: <> +;;; Time-stamp: " " +;;; The time stamp is written between the brackets or quotes, resulting in +;;; Time-stamp: <93/06/18 10:26:51 gildea> +;;; Here is an example which puts the file name and time stamp in the binary: +;;; static char *time_stamp = "sdmain.c Time-stamp: <>"; -;; To activate automatic time stamping in GNU Emacs 19, add this code -;; to your .emacs file: -;; (add-hook 'write-file-hooks 'time-stamp) -;; -;; In Emacs 18 you will need to do this instead: -;; (if (not (memq 'time-stamp write-file-hooks)) -;; (setq write-file-hooks -;; (cons 'time-stamp write-file-hooks))) -;; (autoload 'time-stamp "time-stamp" "Update the time stamp in a buffer." t) - -;; See the documentation for the function `time-stamp' for more details. +;;; To activate automatic time stamping, add this code to your .emacs file: +;;; +;;; (autoload 'time-stamp "time-stamp" "Update the time stamp in a buffer." t) +;;; (if (not (memq 'time-stamp write-file-hooks)) +;;; (setq write-file-hooks +;;; (cons 'time-stamp write-file-hooks))) ;;; Change Log: -;; Originally based on the 19 Dec 88 version of -;; date.el by John Sturdy <mcvax!harlqn.co.uk!jcgs@uunet.uu.net> -;; version 2, January 1995: replaced functions with %-escapes -;; $Id: time-stamp.el,v 1.1.1.2 1996/12/18 03:53:21 steve Exp $ +;;; Originally based on the 19 Dec 88 version of +;;; date.el by John Sturdy <mcvax!harlqn.co.uk!jcgs@uunet.uu.net> ;;; Code: (defvar time-stamp-active t - "*Non-nil to enable time-stamping of buffers by \\[time-stamp]. -Can be toggled by \\[time-stamp-toggle-active]. -See also the variable time-stamp-warn-inactive.") - -(defvar time-stamp-warn-inactive t - "*Non-nil to have \\[time-stamp] warn if a buffer did not get time-stamped. -A warning is printed if time-stamp-active is nil and the buffer contains -a time stamp template that would otherwise have been updated.") - -(defvar time-stamp-format "%02y/%02m/%02d %02H:%02M:%02S %u" - "*Template for the string inserted by \\[time-stamp]. -Value may be a string or a list. (Lists are supported only for -backward compatibility.) A string is used verbatim except -for character sequences beginning with %: + "*Non-nil to enable time-stamping of files. See the function time-stamp.") -%a weekday name: `Monday'. %A gives uppercase: `MONDAY' -%b month name: `January'. %B gives uppercase: `JANUARY' -%d day of month -%H 24-hour clock hour -%I 12-hour clock hour -%m month number -%M minute -%p `am' or `pm'. %P gives uppercase: `AM' or `PM' -%S seconds -%w day number of week, Sunday is 0 -%y year: `1995' -%z time zone name: `est'. %Z gives uppercase: `EST' - -Non-date items: -%% a literal percent character: `%' -%f file name without directory %F gives absolute pathname -%s system name -%u user's login name -%h mail host name - -Decimal digits between the % and the type character specify the -field width. Strings are truncated on the right; numbers on the left. -A leading zero causes numbers to be zero-filled. - -For example, to get the format used by the `date' command, -use \"%3a %3b %2d %02H:%02M:%02S %Z %y\"") - +(defvar time-stamp-format + '(time-stamp-yy/mm/dd time-stamp-hh:mm:ss user-login-name) + "*A list of functions to call to generate the time stamp string. +Each element of the list is called as a function and the results are +concatenated together separated by spaces. Elements may also be strings, +which are included verbatim. Spaces are not inserted around literal strings.") ;;; 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. -(defvar time-stamp-line-limit 8 ;Do not change! - "Lines of a file searched; positive counts from start, negative from end. -The patterns `time-stamp-start' and `time-stamp-end' must be found on one -of the first (last) `time-stamp-line-limit' lines of the file for the -file to be time-stamped by \\[time-stamp]. +(defvar time-stamp-line-limit 8 ;Do not change! See comment above. + "Number of lines at the beginning of a file that are searched. +The patterns time-stamp-start and time-stamp-end must be found on one +of the first time-stamp-line-limit lines of the file for the file to +be time-stamped.") -Do not change `time-stamp-line-limit', `time-stamp-start', or -`time-stamp-end' for yourself or you will be incompatible +(defvar time-stamp-start "Time-stamp: \\\\?[\"<]+" ;Do not change! + "Regexp after which the time stamp is written by \\[time-stamp]. +See also the variables time-stamp-end and time-stamp-line-limit. + +Do not change time-stamp-line-limit, time-stamp-start, or +time-stamp-end for yourself or you will be incompatible 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-start "Time-stamp:[ \t]+\\\\?[\"<]+" ;Do not change! - "Regexp after which the time stamp is written by \\[time-stamp]. -See also the variables `time-stamp-end' and `time-stamp-line-limit'. - -Do not change `time-stamp-line-limit', `time-stamp-start', or -`time-stamp-end' for yourself or you will be incompatible -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-end "\\\\?[\">]" ;Do not change! +(defvar time-stamp-end "\\\\?[\">]" ;Do not change! See comment above. "Regexp marking the text after the time stamp. -\\[time-stamp] deletes the text between the first match of `time-stamp-start' -and the following match of `time-stamp-end' on the same line, -then writes the time stamp specified by `time-stamp-format' between them. - -Do not change `time-stamp-line-limit', `time-stamp-start', or -`time-stamp-end' for yourself or you will be incompatible -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.") - +\\[time-stamp] deletes the text between the first match of time-stamp-start +\(which see) and the following match of time-stamp-end on the same line, +then writes the time stamp specified by time-stamp-format between them.") ;;;###autoload (defun time-stamp () "Update the time stamp string in the buffer. -If you put a time stamp template anywhere in the first 8 lines of a file, -it can be updated every time you save the file. See the top of -`time-stamp.el' for a sample. The template looks like one of the following: - Time-stamp: <> - Time-stamp: \" \" -The time stamp is written between the brackets or quotes, resulting in - Time-stamp: <95/01/18 10:20:51 gildea> Only does its thing if the variable time-stamp-active is non-nil. Typically used on write-file-hooks for automatic time-stamping. -The format of the time stamp is determined by the variable time-stamp-format. -The variables time-stamp-line-limit, time-stamp-start, and time-stamp-end -control finding the template." +The format of the time stamp is determined by the variable +time-stamp-format. The first time-stamp-line-limit lines of the +buffer (normally 8) are searched for the time stamp template, +and if it is found, a new time stamp is written into it." (interactive) - (let ((case-fold-search nil) - (need-to-warn nil) - start search-end) - (if (and (stringp time-stamp-start) - (stringp time-stamp-end)) - (save-excursion - (save-restriction - (widen) - (if (> time-stamp-line-limit 0) - (progn - (goto-char (setq start (point-min))) - (forward-line time-stamp-line-limit) - (setq search-end (point))) - (goto-char (setq search-end (point-max))) - (forward-line time-stamp-line-limit) - (setq start (point))) - (goto-char start) - (while - (and (< (point) search-end) - (re-search-forward time-stamp-start search-end 'move)) - (setq start (point)) - (end-of-line) - (let ((line-end (point))) - (goto-char start) - (if (re-search-forward time-stamp-end line-end 'move) - (progn - (if time-stamp-active - (let ((end (match-beginning 0))) - (delete-region start end) - (goto-char start) - (insert (time-stamp-string)) - (setq end (point)) - ;; remove any tabs used to format time stamp - (goto-char start) - (if (search-forward "\t" end t) - (untabify start end))) - (if time-stamp-warn-inactive - ;; do warning outside save-excursion - (setq need-to-warn t))) - (setq search-end (point)))))))) - ;; don't signal an error in a write-file-hook - (message "time-stamp-start or time-stamp-end is not a string") - (sit-for 1)) - (if need-to-warn - (progn - (message "Warning: time-stamp-active is off; did not time-stamp buffer.") - (sit-for 1)))) + (if time-stamp-active + (let ((case-fold-search nil)) + (if (and (stringp time-stamp-start) + (stringp time-stamp-end)) + (save-excursion + (goto-char (point-min)) + (if (re-search-forward time-stamp-start + (save-excursion + (forward-line time-stamp-line-limit) + (point)) + t) + (let ((start (point))) + (if (re-search-forward time-stamp-end + (save-excursion (end-of-line) (point)) + t) + (let ((end (match-beginning 0))) + (delete-region start end) + (goto-char start) + (insert (time-stamp-string)) + (setq end (point)) + ;; remove any tabs used to format the time stamp + (goto-char start) + (if (search-forward "\t" end t) + (untabify start end))))))) + ;; don't signal an error in a write-file-hook + (message "time-stamp-start or time-stamp-end is not a string")))) ;; be sure to return nil so can be used on write-file-hooks nil) -;;;###autoload -(defun time-stamp-toggle-active (&optional arg) - "Toggle time-stamp-active, setting whether \\[time-stamp] updates a buffer. -With arg, turn time stamping on if and only if arg is positive." - (interactive "P") - (setq time-stamp-active - (if (null arg) - (not time-stamp-active) - (> (prefix-numeric-value arg) 0))) - (message "time-stamp is now %s." (if time-stamp-active "active" "off"))) - - (defun time-stamp-string () "Generate the new string to be inserted by \\[time-stamp]." - (if (stringp time-stamp-format) - (time-stamp-strftime time-stamp-format) - (time-stamp-fconcat time-stamp-format " "))) ;version 1 compatibility - -(defconst time-stamp-month-numbers - '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6) - ("Jul" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12)) - "Alist of months and their number.") - -(defconst time-stamp-month-full-names - ["(zero)" "January" "February" "March" "April" "May" "June" - "July" "August" "September" "October" "November" "December"]) - -(defconst time-stamp-weekday-numbers - '(("Sun" . 0) ("Mon" . 1) ("Tue" . 2) ("Wed" . 3) - ("Thu" . 4) ("Fri" . 5) ("Sat" . 6)) - "Alist of weekdays and their number.") - -(defconst time-stamp-weekday-full-names - ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"]) - -(defconst time-stamp-am-pm '("am" "pm") - "List of strings used to denote morning and afternoon.") - -(defconst time-stamp-no-file "(no file)" - "String to use when the buffer is not associated with a file.") - -(defun time-stamp-strftime (format &optional time) - "Uses a FORMAT to format date, time, file, and user information. -Optional second argument TIME will be used instead of the current time. -See the description of the variable `time-stamp-format' for a description -of the format string." - (let ((time-string (cond ((stringp time) - time) - (time - (current-time-string time)) - (t - (current-time-string)))) - (fmt-len (length format)) - (ind 0) - cur-char - (prev-char nil) - (result "") - field-index - field-width - field-result - (paren-level 0)) - (while (< ind fmt-len) - (setq cur-char (aref format ind)) - (setq - result - (concat result - (cond - ((eq cur-char ?%) - (setq field-index (1+ ind)) - (while (progn - (setq ind (1+ ind)) - (setq cur-char (if (< ind fmt-len) - (aref format ind) - ?\0)) - (and (<= ?0 cur-char) (>= ?9 cur-char)))) - (setq field-width (substring format field-index ind)) - ;; eat any additional args to allow for future expansion - (while (or (and (<= ?0 cur-char) (>= ?9 cur-char)) (eq ?. cur-char) - (eq ?, cur-char) (eq ?: cur-char) (eq ?@ cur-char) - (eq ?- cur-char) (eq ?+ cur-char) - (eq ?\ cur-char) (eq ?# cur-char) - (and (eq ?\( cur-char) - (not (eq prev-char ?\\)) - (setq paren-level (1+ paren-level))) - (if (and (eq ?\) cur-char) - (not (eq prev-char ?\\)) - (> paren-level 0)) - (setq paren-level (1- paren-level)) - (and (> paren-level 0) - (< ind fmt-len)))) - (setq ind (1+ ind)) - (setq prev-char cur-char) - (setq cur-char (if (< ind fmt-len) - (aref format ind) - ?\0))) - (setq field-result - (cond - ((eq cur-char ?%) - "%") - ((or (eq cur-char ?a) ;weekday name - (eq cur-char ?A)) - (let ((name - (aref time-stamp-weekday-full-names - (cdr (assoc (substring time-string 0 3) - time-stamp-weekday-numbers))))) - (if (eq cur-char ?a) - name - (upcase name)))) - ((or (eq cur-char ?b) ;month name - (eq cur-char ?B)) - (let ((name - (aref time-stamp-month-full-names - (cdr (assoc (substring time-string 4 7) - time-stamp-month-numbers))))) - (if (eq cur-char ?b) - name - (upcase name)))) - ((eq cur-char ?d) ;day of month, 1-31 - (string-to-int (substring time-string 8 10))) - ((eq cur-char ?H) ;hour, 0-23 - (string-to-int (substring time-string 11 13))) - ((eq cur-char ?I) ;hour, 1-12 - (let ((hour (string-to-int (substring time-string 11 13)))) - (cond ((< hour 1) - (+ hour 12)) - ((> hour 12) - (- hour 12)) - (t - hour)))) - ((eq cur-char ?m) ;month number, 1-12 - (cdr (assoc (substring time-string 4 7) - time-stamp-month-numbers))) - ((eq cur-char ?M) ;minute, 0-59 - (string-to-int (substring time-string 14 16))) - ((or (eq cur-char ?p) ;am or pm - (eq cur-char ?P)) - (let ((name - (if (> 12 (string-to-int (substring time-string 11 13))) - (car time-stamp-am-pm) - (car (cdr time-stamp-am-pm))))) - (if (eq cur-char ?p) - name - (upcase name)))) - ((eq cur-char ?S) ;seconds, 00-60 - (string-to-int (substring time-string 17 19))) - ((eq cur-char ?w) ;weekday number, Sunday is 0 - (cdr (assoc (substring time-string 0 3) time-stamp-weekday-numbers))) - ((eq cur-char ?y) ;year - (string-to-int (substring time-string -4))) - ((or (eq cur-char ?z) ;time zone - (eq cur-char ?Z)) - (let ((name - (if (fboundp 'current-time-zone) - (car (cdr (current-time-zone time)))))) - (or name (setq name "")) - (if (eq cur-char ?z) - (downcase name) - (upcase name)))) - ((eq cur-char ?f) ;buffer-file-name, base name only - (if buffer-file-name - (file-name-nondirectory buffer-file-name) - time-stamp-no-file)) - ((eq cur-char ?F) ;buffer-file-name, full path - (or buffer-file-name - time-stamp-no-file)) - ((eq cur-char ?s) ;system name - (system-name)) - ((eq cur-char ?u) ;user name - (user-login-name)) - ((eq cur-char ?h) ;mail host name - (time-stamp-mail-host-name)) - )) - (if (string-equal field-width "") - field-result - (let ((padded-result - (format (format "%%%s%c" - field-width - (if (numberp field-result) ?d ?s)) - (or field-result "")))) - (let ((initial-length (length padded-result)) - (desired-length (string-to-int field-width))) - (if (> initial-length desired-length) - ;; truncate strings on right, numbers on left - (if (stringp field-result) - (substring padded-result 0 desired-length) - (substring padded-result (- desired-length))) - padded-result))))) - (t - (char-to-string cur-char))))) - (setq ind (1+ ind))) - result)) - -(defun time-stamp-mail-host-name () - "Return the name of the host where the user receives mail. -This is the value of `mail-host-address' if bound and a string, -otherwise the value of `time-stamp-mail-host' (for versions of Emacs -before 19.29) otherwise the value of the function system-name." - (or (and (boundp 'mail-host-address) - (stringp mail-host-address) - mail-host-address) - (and (boundp 'time-stamp-mail-host) ;for backward compatibility - (stringp time-stamp-mail-host) - time-stamp-mail-host) - (system-name))) - -;;; the rest of this file is for version 1 compatibility + (time-stamp-fconcat time-stamp-format " ")) (defun time-stamp-fconcat (list sep) - "Similar to (mapconcat 'funcall LIST SEP) but LIST allows literals. + "Similar to (mapconcat 'funcall LIST SEP) but LIST can have 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 @@ -433,17 +148,43 @@ return-string)) +(defconst time-stamp-month-numbers + '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6) + ("Jul" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12)) + "Assoc list of months and their number.") + +(defconst time-stamp-month-full-names + ["(zero)" "January" "February" "March" "April" "May" "June" + "July" "August" "September" "October" "November" "December"]) + +(defvar time-stamp-mail-host nil + "Name of the host where the user receives mail. +See the function time-stamp-mail-host-name.") + ;;; Some useful functions to use in time-stamp-format ;;; Could generate most of a message-id with -;;; '(time-stamp-yymmdd "" time-stamp-hhmm "@" time-stamp-mail-host-name) +;;; '(yymmdd "" hhmm "@" mail-host-name) + +(defun time-stamp-mail-host-name () + "Return the name of the host where the user receives mail. +This is the value of time-stamp-mail-host if bound and a string, +otherwise the value of the function system-name." + (or (and (boundp 'time-stamp-mail-host) + (stringp time-stamp-mail-host) + time-stamp-mail-host) + (system-name))) + +(defun time-stamp-current-year () + "Return the current year as a four-character string." + (substring (current-time-string) -4)) ;;; pretty form, suitable for a title page (defun time-stamp-month-dd-yyyy () - "Return the current date as a string in \"Month DD, YYYY\" form." + "Return the current date as a string in \"Month dd, yyyy\" form." (let ((date (current-time-string))) - (format "%s %d, %s" + (format "%s %02d, %s" (aref time-stamp-month-full-names (cdr (assoc (substring date 4 7) time-stamp-month-numbers))) (string-to-int (substring date 8 10)) @@ -452,8 +193,8 @@ ;;; same as __DATE__ in ANSI C (defun time-stamp-mon-dd-yyyy () - "Return the current date as a string in \"Mon DD YYYY\" form. -The first character of DD is space if the value is less than 10." + "Return the current date as a string in \"Mon dd yyyy\" form. +The first character of dd is Space if the value is less than 10." (let ((date (current-time-string))) (format "%s %2d %s" (substring date 4 7) @@ -463,7 +204,7 @@ ;;; RFC 822 date (defun time-stamp-dd-mon-yy () - "Return the current date as a string in \"DD Mon YY\" form." + "Return the current date as a string in \"dd Mon yy\" form." (let ((date (current-time-string))) (format "%02d %s %s" (string-to-int (substring date 8 10)) @@ -473,7 +214,7 @@ ;;; RCS 3 date (defun time-stamp-yy/mm/dd () - "Return the current date as a string in \"YY/MM/DD\" form." + "Return the current date as a string in \"yy/mm/dd\" form." (let ((date (current-time-string))) (format "%s/%02d/%02d" (substring date -2) @@ -483,37 +224,47 @@ ;;; RCS 5 date (defun time-stamp-yyyy/mm/dd () - "Return the current date as a string in \"YYYY/MM/DD\" form." + "Return the current date as a string in \"yyyy/mm/dd\" form." (let ((date (current-time-string))) (format "%s/%02d/%02d" (substring date -4) (cdr (assoc (substring date 4 7) time-stamp-month-numbers)) (string-to-int (substring date 8 10))))) -;;; ISO 8601 date - -(defun time-stamp-yyyy-mm-dd () - "Return the current date as a string in \"YYYY-MM-DD\" form." - (let ((date (current-time-string))) - (format "%s-%02d-%02d" - (substring date -4) - (cdr (assoc (substring date 4 7) time-stamp-month-numbers)) - (string-to-int (substring date 8 10))))) - (defun time-stamp-yymmdd () - "Return the current date as a string in \"YYMMDD\" form." + "Return the current date as a string in \"yymmdd\" form." (let ((date (current-time-string))) (format "%s%02d%02d" (substring date -2) (cdr (assoc (substring date 4 7) time-stamp-month-numbers)) (string-to-int (substring date 8 10))))) +(defun time-stamp-dd/mm/yy () + "Return the current date as a string in \"dd/mm/yy\" form." + (let ((date (current-time-string))) + (format "%02d/%02d/%s" + (string-to-int (substring date 8 10)) + (cdr (assoc (substring date 4 7) time-stamp-month-numbers)) + (substring date -2)))) + +(defun time-stamp-mm/dd/yy () + "Return the current date as a string in \"mm/dd/yy\" form." + (let ((date (current-time-string))) + (format "%02d/%02d/%s" + (cdr (assoc (substring date 4 7) time-stamp-month-numbers)) + (string-to-int (substring date 8 10)) + (substring date -2)))) + (defun time-stamp-hh:mm:ss () - "Return the current time as a string in \"HH:MM:SS\" form." + "Return the current time as a string in \"hh:mm:ss\" form." (substring (current-time-string) 11 19)) +(defun time-stamp-hh:mm () + "Return the current time as a string in \"hh:mm\" form." + (substring (current-time-string) 11 16)) + (defun time-stamp-hhmm () - "Return the current time as a string in \"HHMM\" form." + "Return the current time as a string in \"hhmm\" form." (let ((date (current-time-string))) (concat (substring date 11 13) (substring date 14 16))))