7

我在 Emacs Lisp 中到处做一些编程,但我不完全确定如何去做某些事情。

我正在尝试插入一整月的日期,每个日期都在一个新行中,如下面的列表:

一月

09 年 1 月 1 日星期一:

2009 年 2 月 1 日星期二:

2009 年 3 月 1 日星期三:

ETC

我该怎么做呢?我已经找到了如何格式化日期,但我找不到如何循环某个日期范围(在这种情况下循环整个月并为该月的每一天打印一个日期)。

有没有人可以给我一些关于如何开始的指示?

4

3 回答 3

8

您想要的函数是'encode-time'format-time-string'decode-time。对于正确的文档,C-h f function-name或者将为您提供该函数的文档,或者可以在此处找到一般的 elisp 信息页面:C-h i m elisp RET m time conversion RET

这是那个片段:

(defun my-insert-dates ()
  "insert a bunch of dates"
  (interactive)
  (let* ((month 3)
         (day 1)
         (time (encode-time 1 1 0 day month 2009)))
    (while (= (nth 4 (decode-time time)) month)
      (insert (format-time-string "%D %a:\n" time))
      (setq day (1+ day))
      (setq time (encode-time 1 1 0 day month 2009)))))

我找不到如何确定给定月份的天数(当然,您可以对其进行硬编码,但是您必须处理闰年)。幸运的是,'encode-time为你做了所有的加法,所以如果你通过它相当于“2 月 31 日”,它将返回“3 月 3 日”(假设 28 天)。

于 2009-04-15T19:42:43.320 回答
4

如果您不介意使用日历功能,我会做这样的事情......

(require 'calendar)
(defun display-a-month (day month year)
  (insert (format "%s\n" (calendar-date-string (list  month day year))))
  (if (< day 30)
    (display-a-month (+ day 1) month year)))

您可以使用 describe-function 找到帮助(如前所述,Mx describe-function 或 Ch f);Mx apropos 将为您提供与某事相关的功能列表,irc.freenode.org / #emacs 上更好的人将回答您所有的问题。

顺便说一句,问题是“插入一整个月”而不是“插入每个月的第一天”:) 取决于您是否阅读了 mm/dd/yyyy 的 dd/mm/yyyy

于 2009-04-15T20:02:45.533 回答
2

使用 dotimes 对 Trey 的回答略有不同:

(defun my-insert-dates ()
  "insert the first day of each month"
  (interactive)
  (dotimes (mo 12)
    (insert (format-time-string "%D %a:\n" (encode-time 1 1 0 1 (1+ mo) 2009)))))
于 2009-04-15T19:53:08.257 回答