帮你精通Emacs:配置日程,日记与日历的详细步骤

时间:2022-03-05 02:40:34

帮你精通Emacs:配置日程,日记与日历的详细步骤

我的 Emacs agenda+calendar 的展示界面如下:

帮你精通Emacs:配置日程,日记与日历的详细步骤

agenda+calendar

一眼看上去,agenda中有日出日落,有月相,有中文的天干地支,也有周计数。而在 calendar 界面中呢,国内的节日以“大红”的颜色标注,海外的节日以粉色标注。

接下来将会分步拆解上述界面的配置过程。

一、安装前准备

 

M-x 调用 package-install 从 Melpa 库中安装 `cal-china-x` 这个包。安装完毕,手工设置好路径等。

  1. (Add-to-list 'load-path "~/.zeroemacs/elpa/cal-china-x-20200924.1837"
  2. (require 'cal-china-x) 

只需要这一个包,因此准备完毕。

二、搭建 dirary 的环境

 

1)实现从agenda中展示 diray 信息,须先配置好文件:

  1. ;; 
  2. ;; diary in org-agenda-view 
  3. (setq org-agenda-include-diary t) 
  4. (setq org-agenda-diary-file "~/Documents/OrgMode/ORG/Master/standard-diary"
  5. (setq diary-file "~/Documents/OrgMode/ORG/Master/standard-diary"

2) 然后设定当前位置的坐标:

  1. # Coordinates 
  2. (setq calendar-longitude ***) ;;long是经度, 东经 
  3. (setq calendar-latitude ***) ;;lat, flat, 北纬 

3) 自定义两个日出与日落的函数:

  1. ;;Sunrise and Sunset 
  2. ;;日出而作 
  3. (defun diary-sunrise () 
  4.   (let ((dss (diary-sunrise-sunset))) 
  5.     (with-temp-buffer 
  6.       (insert dss) 
  7.       (goto-char (point-min)) 
  8.       (while (re-search-forward " ([^)]*)" nil t) 
  9.     (replace-match "" nil nil)) 
  10.       (goto-char (point-min)) 
  11.       (search-forward ","
  12.       (buffer-substring (point-min) (match-beginning 0))))) 
  13.  
  14. ;; sunset 日落而息 
  15. (defun diary-sunset () 
  16.   (let ((dss (diary-sunrise-sunset)) 
  17.         start end
  18.     (with-temp-buffer 
  19.       (insert dss) 
  20.       (goto-char (point-min)) 
  21.       (while (re-search-forward " ([^)]*)" nil t) 
  22.         (replace-match "" nil nil)) 
  23.       (goto-char (point-min)) 
  24.       (search-forward ", "
  25.       (setq start (match-end 0)) 
  26.       (search-forward " at"
  27.       (setq end (match-beginning 0)) 
  28.       (goto-char start) 
  29.       (capitalize-word 1) 
  30.       (buffer-substring start end)))) 

4) 最后,写好中文历法的天干地支:

  1. ;; 中文的天干地支 
  2. (setq calendar-chinese-celestial-stem ["甲" "乙" "丙" "丁" "戊" "己" "庚" "辛" "壬" "癸"]) 
  3. (setq calendar-chinese-terrestrial-branch ["子" "丑" "寅" "卯" "辰" "巳" "午" "未" "申" "酉" "戌" "亥"]) 

 三、搭建 Calendar 环境

 

1) 首先设置 calendar 以周一为一周之始。

  1. ;;设置一周从周一开始. 
  2. (setq calendar-week-start-day 1) 

2) 标记重要的节日

  1. (setq mark-holidays-in-calendar t) 
  2. (setq cal-china-x-important-holidays cal-china-x-chinese-holidays) 
  3. (setq calendar-holidays 
  4.       (append cal-china-x-important-holidays 
  5.               cal-china-x-general-holidays 
  6.               holiday-general-holidays 
  7.               holiday-christian-holidays 
  8.               )) 
  9. ;;中美的节日. 

两步设置之后,就能呈现出来,本文开开篇的效果。

四、整合日历与日记的时间展示:

 

配置从agenda的头部展示农历和阳历的信息:

帮你精通Emacs:配置日程,日记与日历的详细步骤

  1. ;; display Chinese date 
  2. (setq org-agenda-format-date 'zeroemacs/org-agenda-format-date-aligned) 
  3.  
  4. (defun zeroemacs/org-agenda-format-date-aligned (date
  5.   "Format a DATE string for display in the daily/weekly agenda, or timeline. 
  6.       This function makes sure that dates are aligned for easy reading." 
  7.   (require 'cal-iso) 
  8.   (let* ((dayname (aref cal-china-x-days 
  9.                         (calendar-day-of-week date))) 
  10.          (day (cadr date)) 
  11.          (month (car date)) 
  12.          (year (nth 2 date)) 
  13.          (cn-date (calendar-chinese-from-absolute (calendar-absolute-from-gregorian date))) 
  14.          (cn-month (cl-caddr cn-date)) 
  15.          (cn-day (cl-cadddr cn-date)) 
  16.          (cn-month-string (concat (aref cal-china-x-month-name 
  17.                                         (1- (floor cn-month))) 
  18.                                   (if (integerp cn-month
  19.                                       "" 
  20.                                     "(闰月)"))) 
  21.          (cn-day-string (aref cal-china-x-day-name 
  22.                               (1- cn-day)))) 
  23.     (format "%04d-%02d-%02d 周%s %s%s" year month 
  24.             day dayname cn-month-string cn-day-string))) 

 五、从日历里掌控时间

 

日历操作的基本单位,日,周,月,季度,最后是年,emacs 默认只展示三个月份。我们想象时间是无限长卷,横向3个月,而纵向无限长度。Emacs 的这三个月犹如从时间长卷中开的窗口,我们得以停下脚步凝视端详。

帮你精通Emacs:配置日程,日记与日历的详细步骤

原文地址:https://www.toutiao.com/i6941927202644591115/