2

我有以下函数定义:

(defun nth (n)
  (format
   (concat
    "%d"
    (if (memq n '(11 12 13)) "th"
      (let ((last-digit (% n 10)))
        (case last-digit
          (1 "st")
          (2 "nd")
          (3 "rd")
          (otherwise "th"))))) n))

我希望能够在format-time-string. 通常,我会查看函数的源代码,但这个函数是在 C 源代码中定义的。(我认为这排除了将某些东西挂在上面的可能性,但我会得到纠正。)

如何添加另一个%o适用nth于适当参数的格式说明符(例如,)?

所需用途:

(format-time-string "%A, %B %o, %T (%z)" (seconds-to-time 1250553600))

=> "Monday, August 17th, 20:00:00 (-0400)"
4

3 回答 3

3

这就是你想要做的。Stefan 和 Drew 已经给出了一些重要的评论(不要覆盖nth并查看 emacs-lisp/advising 函数的信息文件)。

(defun ordinal (n)
  "Special day of month format."
  (format
   (concat
    "%d"
    (if (memq n '(11 12 13)) "th"
      (let ((last-digit (% n 10)))
        (case last-digit
          (1 "st")
          (2 "nd")
          (3 "rd")
          (otherwise "th"))))) n))


(defadvice format-time-string (before ordinal activate)
  "Add ordinal to %d."
  (let ((day (nth 3 (decode-time (or time (current-time))))))
    (setq format-string
      (replace-regexp-in-string "%o"
                    (ordinal day)
                    format-string))))

笔记:

  1. 我没有处理 UNIVERSAL 论点

  2. 当从 C 调用时,hack 不起作用format-time-string(如您在手册中所读)。

于 2013-12-01T21:34:32.407 回答
1

补充一下 Stefan 所说的(“你不走运”)——

format-time-string是内置的,但您也可以建议内置。然而,由于你想做的那种手术会深入到定义的深处(你不能这样做),你实际上需要替换format-time-string中的定义defadvice,即根本不使用ad-do-it

换句话说,您需要在 Lisp 中以一种或另一种方式(defun或)完全重新定义函数。defadvice这与说“你不走运”大致相同。

于 2013-12-01T21:15:55.393 回答
1

AFAIK 你不走运:格式时间字符串不提供任何方法来做到这一点。

您可以使用以下方法解决此问题:

(let ((ti (seconds-to-time 1250553600)))
 (format-time-string (concat "%A, %B " (my-nth (format-time-string "%d" ti)) ", %T (%z)") ti))

这就是说,我一直被告知“8 月 17 日”是错误的:你应该写“8 月 17 日”,其发音为“8 月 17 日”。

还有一件事:nth是一个预定义的核心功能。最好不要用您自己完全不同的定义覆盖它。

于 2013-12-01T20:55:10.583 回答