(cond ((> line-limit 0)
(goto-char (setq start (point-min)))
(forward-line line-limit)
- (setq search-limit (point)))
+ (setq search-limit (point-marker)))
((< line-limit 0)
- (goto-char (setq search-limit (point-max)))
+ (goto-char (setq search-limit (point-max-marker)))
(forward-line line-limit)
(setq start (point)))
(t ;0 => no limit (use with care!)
(setq start (point-min))
- (setq search-limit (point-max))))))
+ (setq search-limit (point-max-marker))))))
(while (and start
(< start search-limit)
(> ts-count 0))
(setq start (time-stamp-once start search-limit ts-start ts-end
ts-format format-lines end-lines))
- (setq ts-count (1- ts-count))))
+ (setq ts-count (1- ts-count)))
+ (set-marker search-limit nil))
nil)
(defun time-stamp-once (start search-limit ts-start ts-end
(string-equal field-width ""))
(time-stamp--format "%A" time)
(time-stamp-conv-warn (format "%%%sA" field-width)
- (format "%%#%sA" field-width))
+ (format "%%#%sA" field-width)
+ (format "%%:%sA" field-width))
(time-stamp--format "%#A" time)))))
((eq cur-char ?b) ;month name
(if (> alt-form 0)
(string-equal field-width ""))
(time-stamp--format "%B" time)
(time-stamp-conv-warn (format "%%%sB" field-width)
- (format "%%#%sB" field-width))
+ (format "%%#%sB" field-width)
+ (format "%%:%sB" field-width))
(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))
(not flag-pad-with-spaces)
(not flag-pad-with-zeros)
(= field-width-num 0))
- (time-stamp-conv-warn "%z" "%#Z")
+ (time-stamp-conv-warn "%z" "%#Z" "%5z")
(time-stamp--format "%#Z" time))
(t (time-stamp-formatz-from-parsed-options
flag-minimize
The new forms being recommended now will continue to work then.")
-(defun time-stamp-conv-warn (old-form new-form)
+(defun time-stamp-conv-warn (old-form new-form &optional standard-form)
"Display a warning about a soon-to-be-obsolete format.
-Suggests replacing OLD-FORM with NEW-FORM."
+Suggests replacing OLD-FORM with NEW-FORM (same effect, but stable)
+or (if provided) STANDARD-FORM (the effect the user may have expected
+if they didn't read the documentation)."
(cond
(time-stamp-conversion-warn
(with-current-buffer (get-buffer-create "*Time-stamp-compatibility*")
(goto-char (point-max))
- (if (bobp)
- (progn
- (insert
- "The formats recognized in time-stamp-format will change in a future release\n"
- "to be more compatible with the format-time-string function.\n\n"
- "The following obsolescent time-stamp-format construct(s) were found:\n\n")))
- (insert "\"" old-form "\" -- use " new-form "\n"))
+ (cond
+ ((bobp)
+ (insert
+ (substitute-quotes
+ (concat
+ "The conversions recognized in `time-stamp-format' will change in a future\n"
+ "release to be more compatible with the function `format-time-string'.\n"
+ (cond
+ (standard-form
+ (concat
+ "Conversions that are changing are ambiguous and should be replaced by\n"
+ "stable conversions that makes your intention clear.\n")))
+ "\n"
+ "The following obsolescent `time-stamp-format' conversion(s) were found:\n\n")))))
+ (insert old-form " -- use " new-form)
+ (if standard-form
+ (insert " or " standard-form))
+ (insert "\n")
+ (help-make-xrefs))
(display-buffer "*Time-stamp-compatibility*"))))
(ref-time3 '(21377 34956)) ;Sunday, May 25, 2014, 06:07:08 AM
(time-stamp-time-zone t)) ;use UTC
(cl-letf (((symbol-function 'time-stamp-conv-warn)
- (lambda (old-format _new)
+ (lambda (old-format _new &optional _newer)
(ert-fail
(format "Unexpected format warning for '%s'" old-format)))))
;; Not all reference times are used in all tests;
(declare (debug t))
`(let ((warning-count 0))
(cl-letf (((symbol-function 'time-stamp-conv-warn)
- (lambda (_old _new)
+ (lambda (_old _new &optional _newer)
(setq warning-count (1+ warning-count)))))
(should ,form)
(if (not (= warning-count 1))
(time-stamp)
(should (equal (buffer-string) buffer-expected-twice)))))))
+(ert-deftest time-stamp-custom-limit ()
+ "Test that `time-stamp' can expand two templates near the line limit."
+ (with-time-stamp-test-env
+ (let ((time-stamp-start "TS: ")
+ (time-stamp-format "%Y-%m-%d")
+ (time-stamp-end "$")
+ (time-stamp-count 2)
+ (time-stamp-line-limit 1) ;changed later in the test
+ (buffer-starts-as "TS: \nTS: ")
+ (buffer-expected-1 "TS: 2006-01-02\nTS: ")
+ (buffer-expected-2 "TS: 2006-01-02\nTS: 2006-01-02"))
+ (with-time-stamp-test-time ref-time1
+ (with-temp-buffer
+ (insert buffer-starts-as)
+ (time-stamp)
+ (should (equal (buffer-string) buffer-expected-1)))
+ (with-temp-buffer
+ (insert buffer-starts-as)
+ (setq time-stamp-line-limit 2)
+ (time-stamp)
+ (should (equal (buffer-string) buffer-expected-2)))))))
+
;;; Tests of time-stamp-string formatting
(ert-deftest time-stamp-format-day-of-week ()
(should (equal (time-stamp-string "%03d" ref-time3) "025"))
(should (equal (time-stamp-string "%3d" ref-time3) " 25"))
(should (equal (time-stamp-string "%_3d" ref-time3) " 25"))
+ (should (equal (time-stamp-string "%99z" ref-time1)
+ (time-stamp-string "%100z" ref-time1)))
+ (should (equal (time-stamp-string "%099Y" ref-time1)
+ (time-stamp-string "%0100Y" ref-time1)))
;; since 2024
(should (equal (time-stamp-string "%0d" ref-time1) "02"))
(should (equal (time-stamp-string "%0d" ref-time2) "18"))
(- (fz-make+zone h m s)))
(defmacro formatz-should-equal (zone expect)
- "Format ZONE and compares it to EXPECT.
+ "Format ZONE and compare it to EXPECT.
Use the free variables `form-string' and `pattern-mod'.
The functions in `pattern-mod' are composed left to right."
(declare (debug t))