在calendar中定制中国农历节日

Dylan.Wen posted @ 2010年1月11日 05:18 in Emacs with tags emacs Calendar holidays chinese-holidays , 4749 阅读

Emacs中的 calendar mode 有很多功能,可以在 calendar 中对自己感兴趣的节日进行定制。在 gnu 官网 emacs 手册的 38.15.2 Customizing the Holidays 部分可以找到详细的说明。这里谈谈如何定制中国的农历节日。

    下载 William Xu 写的 中文版日历扩展 cal-china-x.el 并安装--参考其源文件中说明将下面几句添加到 .emacs: 

(require 'cal-china-x)
(setq mark-holidays-in-calendar t)
(setq cal-china-x-important-holidays cal-china-x-chinese-holidays)
(setq calendar-holidays cal-china-x-important-holidays)

     其中 cal-china-x-important-holidays 在 cal-china-x.el 中定义如下:

(defconst cal-china-x-chinese-holidays
  '((holiday-fixed 1 1 "元旦")
    (holiday-lunar 12 30 "春节" 0)
    (holiday-lunar 1 1 "春节" 0)
    (holiday-lunar 1 2 "春节" 0)
    (holiday-solar-term "清明" "清明节")
    (holiday-fixed 5 1 "劳动节")
    (holiday-lunar 5 5 "端午节" 0)
    (holiday-lunar 8 15 "中秋节" 0)
    (holiday-fixed 10 1 "国庆节")
    (holiday-fixed 10 2 "国庆节")
    (holiday-fixed 10 3 "国庆节"))
  "Pre-defined chinese public holidays.
You can add this to your `calendar-holidays'.")

   若想自定义这些节日,例如添加重阳节或将春节标记为从正月一日开始,怎么办呢?可以在另外定义自己感兴趣的节日,就像在我的 .emacs 中有:

(setq holiday-wwliu-holidays
    '(;;公历节日
      (holiday-fixed 1 1 "元旦")
      (holiday-fixed 2 14 "情人节")
      (holiday-fixed 3 8 "妇女节")
      (holiday-fixed 3 14 "白色情人节")
      (holiday-fixed 4 1 "愚人节")
      (holiday-fixed 5 1 "劳动节")
      (holiday-float 5 0 2 "母亲节")
      (holiday-fixed 6 1 "儿童节")
      (holiday-float 6 0 3 "父亲节")
      (holiday-fixed 9 10 "教师节")
      (holiday-fixed 10 1 "国庆节")
      (holiday-fixed 12 25 "圣诞节")
      ;; 农历节日
      (holiday-lunar 1 1 "春节" 0)
      (holiday-lunar 1 2 "春节" 0)
      (holiday-lunar 1 3 "春节" 0)
      (holiday-lunar 1 15 "元宵节" 0)
      (holiday-solar-term "清明" "清明节")
      (holiday-lunar 5 5 "端午节" 0)
      (holiday-lunar 8 15 "中秋节" 0)
      ;; 生日 -- 家人,朋友
      ;; ^_^ 这部分嘛...保密啦
      ))

然后将 calendar-holidays 的值覆盖为自定义的 list 即可。

(require 'cal-china-x)
;; 只显示我定制的节日
(setq calendar-holidays holiday-wwliu-holidays)

 为什么覆盖 calendar-holidays, 而不写入 holiday-general-holidaysholiday-other-holidays呢?因为 calendar-holidays 包括所有的 holidays, 如 holiday-christian-holidays, holiday-hebrew-holidays等,覆盖calendar-holidays 就相当于把其它的部分清空,只保留自己定义的 holiday-wwliu-holidays。也有的人喜欢将这些部分的 holiday 清空,如在 .emacs 中有设置如下: 

(setq christian-holidays nil) ;; 不显示基督教的节日
(setq hebrew-holidays nil)    ;; 不显示希伯来人的节日
(setq islamic-holidays nil)   ;; 不显示伊斯兰教的节日
...

不过我觉得直接覆盖 calendar-holidays 更简单些。

配置完后通过

M-X eval-buffer

  重新加载 .emacs。打开 calendar mode如下图所示:

emacs calendar 截图