在calendar中定制中国农历节日
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-holidays或
holiday-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如下图所示: