05.Org as 地表最强的管理与计划的助手工具

本文为项目 步步为营, 零秒精通 Emacs 之:

05.Emacs as a Agenda by Org

先打个样:

评论区连载

3赞

期待,赶紧放出来吧。这一系列博文打磨的真不错。

01.Agenda Time Grid

设置org-agenda-files

首先从配置中指定 org-agenda-files

(setq org-agenda-files '("~/Documents/OrgMode/ORG/diary-by-months/" ;; 2020-01-10 10:45:25
                         "~/Documents/OrgMode/ORG/src/" ;;2019-06-18 13:37:12
))

我的 org-agenda-files归入在:

  • “~/Documents/OrgMode/ORG/diary-by-months/”
  • “~/Documents/OrgMode/ORG/src/”

这两个文件夹内,
此处可以是org文件所在的文件夹, 也可以是org文件本身.

默认agenda-time-grid的不足之处

Emacs-agenda的Time Grid, 默认设置每两个小时为一个时间段.
开启方法: time-grid setq agenda-use-time-grid t,
默认配置:

(setq org-agenda-time-grid (quote (((daily today require-timed)
                                    (800 1000 1200 1400 1600 1800 2000)
                                    "......" "----------------"))))

显示为:

 8:00...... ------------------
 8:30-13:00 Arthur Dent lies in front of the bulldozer
10:00...... ------------------
12:00...... ------------------
12:45...... Ford Prefect arrives and takes Arthur to the pub
14:00...... ------------------
16:00...... ------------------
18:00...... ------------------
19:00...... The Vogon reads his poem
20:00...... ------------------
20:30-22:15 Marvin escorts the Hitchhikers to the bridge

默认配置有以下三个问题:

  1. 两个小时的时间间隔太短, 每两个小时一总结工作, 则过于频繁;
  2. 起始时间与终止时间的跨度为"早晨8点"到"晚上8点", 人所共知, "晚上8点至11点"正是精力旺盛的时间段;
  3. 如果每两小时一间隔, 十二等分24小时, 则agenda-time-grid拉的过长.

八分图的时间段划分

解决方案

"八分图"切割24小时, 每三个小时为一间隔, 工作中尽量做到三个小时一总结. 显示为:

Day-agenda (W10):
Sunday      8 March 2020
               3:00...... -----------------------------------------------------
               6:00...... -----------------------------------------------------
  Diary:       6:39...... Sunrise
               6:45...... now - - - - - - - - - - - - - - - - - - - - - - - - -
  Diary:       8:00...... Review the week
               9:00...... -----------------------------------------------------
              12:00...... -----------------------------------------------------
              15:00...... -----------------------------------------------------
              18:00...... -----------------------------------------------------
  Diary:      18:13...... Sunset
              21:00...... -----------------------------------------------------
              24:00...... -----------------------------------------------------
  Diary:      ISO date: Day 7 of week 10 of 2020

配置如下:

;;---------------------------------------------
;;org-agenda-time-grid
;;--------------------------------------------
(setq org-agenda-time-grid (quote ((daily today require-timed)
                                   (300
                                    600
                                    900
                                    1200
                                    1500
                                    1800
                                    2100
                                    2400)
                                   "......"
                                   "-----------------------------------------------------"
                                   )))

思维概念

单单从agenda这个工具中设置好, 显然是不够的, 劳神费力的设置一番, 也未必用得得心应手, 因此不仅要设置emacs-agenda这个工具, 还要设置头脑的思维模式,不仅身体里要有"生物钟", 思维中也要有"逻辑钟"/“概念钟”.

#+tblname: 八分图时间段的概念命名
|----+-----------+----------+------------------|
| No | 时间段    | 维基命名 | 自定义命名       |
|----+-----------+----------+------------------|
|  1 | 0时~3时   | 凌晨     | 午夜(夜)         |
|  2 | 3时~6时   | 拂晓     | 破晓(破,dawn)    |
|  3 | 6时~9时   | 早晨     | 早晨(早,morning) |
|  4 | 9时~12时  | 午前     | 明昼(明)         |
|  5 | 12时~15时 | 午后     | 午后(午)         |
|  6 | 15时~18时 | 傍晚     | 下午(下)         |
|  7 | 18时~21时 | 薄暮     | 向晚(向,Dusk)    |
|  8 | 21时~24时 | 深夜     | 深夜(深,Night)   |
|----+-----------+----------+------------------|

时间段的命名取自维基(中文/日文,搜"早晨"),

  • 修改"3时至6时"的"拂晓"为"破晓", 是因为"拂"字是"杨柳岸晓风残月", "破"字是精神焕发的日出(起床)动作;
  • 修改"9时至12时"的"午前"为"明昼", 考虑到"午前"的字节读起来不响亮, 该时间段"心明眼亮", “神清气爽"正是效率最高的阶段, 因此取响亮的单字"明”, 后面的"昼"是附会.
  • 修改"15时至18时"的"傍晚"为"下午", 考虑到下午三点之后正是第二个高效工作的阶段, 添加一个"晚"字进来, 着实会潜移默化影响工作效率.

头脑呈现

历史的筛选与传统的继承, 时间在头脑中的具象是"圆形表盘", 因此八个时间段的具象呈现, 在思考过程中的形象,

  1. 可以是agenda呈现的表格或者子弹列表
  2. 可以是24小时八分图
  3. 也可以是两个紧挨着的12小时的四分图.

所属项目: 步步为营, 零秒精通Emacs

3赞

02.Integrated with a Diary

在agenda-time-grid上, 添加四个时间锚点,

  • 日出日落
  • 月相
  • ISO日期
  • 中国农历日期

显示为:

Day-agenda (W11):
Tuesday    10 March 2020
  Diary:       1:44...... Full Moon (CST)
               3:00...... -----------------------------------------------------
               6:00...... -----------------------------------------------------
  Diary:       6:35...... Sunrise
               9:00...... -----------------------------------------------------
              12:00...... -----------------------------------------------------
              15:00...... -----------------------------------------------------
              18:00...... -----------------------------------------------------
  Diary:      18:16...... Sunset
              21:00...... -----------------------------------------------------
              24:00...... -----------------------------------------------------
  Diary:      Chinese date: Cycle 78, year 37 (庚子), month 2 (己卯), day 17 (壬子)
  Diary:      ISO date: Day 2 of week 11 of 2020

“日月之行, 若出其里”

单纯的agenda-time-grid形只影单, 仅仅是列出来8个时间序列, 孑然一身, 与万事万物没有一丝牵割与联系.
引入日出日落和月相的时刻到agenda-time-grid中, agenda-view瞬间活络起来, 不再只是孤立的表格文本, 而是与天地四时构建了物理关联.

时间的本质是什么? 我们观测天体的运行规律, 获得对时间的直观认知与准确测量.

此处引用"曹操"在<观沧海>中的两句诗文:

“日月之行, 若出其里; 星汉灿烂, 若出其中.”

心驰神往之间, 曹丞相此处描绘的正是将sunrise-and-sunset整合进agenda-time-grid的功能.

整合diary到org-agenda-view

整合diary-file到org-agenda中的配置:

(setq org-agenda-include-diary t)
(setq org-agenda-diary-file "~/Documents/OrgMode/ORG/src/standard-diary") ;;2020-03-02 10:47:06
(setq diary-file "~/Documents/OrgMode/ORG/src/standard-diary")

我的diary-file放置在"~/Documents/OrgMode/ORG/src/standard-diary", 重命名为"standard-diary".

Diary的基本内容

写入内容:

;;Day info
;; 日出而作, 日落而息
%%(diary-sunrise)
%%(diary-sunset)
%%(diary-lunar-phases)
;;
%%(diary-iso-date)
;;中国农历
%%(diary-chinese-date)

其中 diary-sunrisediary-sunset 需要自定义:

自定义日出与日落时间序列

设置本地坐标

;; location
(setq calendar-longitude 116.9962)
(setq calendar-latitude 39.91) 

分别定义sunrise与sunset

;;Sunrise and Sunset
;;日出而作, 日落而息
(defun diary-sunrise ()
  (let ((dss (diary-sunrise-sunset)))
    (with-temp-buffer
      (insert dss)
      (goto-char (point-min))
      (while (re-search-forward " ([^)]*)" nil t)
        (replace-match "" nil nil))
      (goto-char (point-min))
      (search-forward ",")
      (buffer-substring (point-min) (match-beginning 0)))))

(defun diary-sunset ()
  (let ((dss (diary-sunrise-sunset))
        start end)
    (with-temp-buffer
      (insert dss)
      (goto-char (point-min))
      (while (re-search-forward " ([^)]*)" nil t)
        (replace-match "" nil nil))
      (goto-char (point-min))
      (search-forward ", ")
      (setq start (match-end 0))
      (search-forward " at")
      (setq end (match-beginning 0))
      (goto-char start)
      (capitalize-word 1)
      (buffer-substring start end))))

配置完毕, 显示为:

Day-agenda (W27):
Sunday      5 July 2020
               3:00...... -----------------------------------------------------
  Diary:       4:53...... Sunrise
               6:00...... -----------------------------------------------------
  Diary:       8:00...... Review the week
               9:00...... -----------------------------------------------------
              12:00...... -----------------------------------------------------
  Diary:      12:40...... Full Moon (CST)
              15:00...... -----------------------------------------------------
              18:00...... -----------------------------------------------------
  Diary:      19:46...... Sunset
              21:00...... -----------------------------------------------------
              24:00...... -----------------------------------------------------
  Diary:      Chinese date: Cycle 78, year 37 (庚子), month 5 (壬午), day 15 (己酉)
  Diary:      ISO date: Day 7 of week 27 of 2020

所属项目: 步步为营, 零秒精通emacs

观沧海

2赞

一个奇怪的问题,同样的配置文件,同样的 org 文档,在 linux 里显示的日出、日落是一次,在macos mojave 显示了两次,如图:

Screen Shot 2020-03-09 at 13.05.32

这是在 macos 的状态。

下图是 diary.org 内容:

Screen Shot 2020-03-09 at 13.13.44

还有一个就是

%%(diary-anniversary 9 18 1984) %d%s birthday.

这句似乎没起作用,是语法错了吗?

问题一:

%%(diary-anniversary 9 18 1984) My Birthday (%d years old) ;;农历八月二十三

问题二:

显示两次sunrise-sunset的问题, 检查下是不是有两个diary文件.
另外diary功能emacs提供的基础服务, 独立于org之外, 所以diary文件是普通文本. ~/diary 不是~/diary.org

问题三:

建议换一个Dark主题, 比如换成doom-dark+, 因为你采用的主题下, time-grid分割线是灰色的, 当在一个时间段内的记录的工作很多的时候, 不容易一眼看出来是在哪一个时间段. 比如下图:
清晰的看到所有的事项都发生在15:00到18:00这个区间内.

尝试灰色的分割线,

看着似乎还行, 但是如果全天内在各个时间段内都有记录, 灰色的分割线在视觉上的帮助不大.

问题四

你的agenda-time-grid采用了默认的每两个小时为一个时间段的划分方法, 推荐使用每三个小时为一个间隔.

(setq org-agenda-time-grid (quote (((daily today require-timed)
                                    (300 600 900 1200 1500 1800 2100 2400)
                                    "......" "----------------"))))

问题一

照此改动依旧不显示。

问题二

检查没发现有第二个 diary 文件存在。且注释了 diary.org%%(diary-sunrise 语句后,agenda 中相应两行同时消失,这很奇怪,再排查中。

问题三

换成 doom-dark+modeline 那基佬紫一出,顿觉眼前一亮,下一天雨的阴霾心情,瞬间明亮了许多。

解决四

这个语法在我机器上不管用,显示光溜溜的什么也沒有,如图:

Screenshot_2020-03-09_16-41-30

改成这样才行:

(setq org-agenda-time-grid '((daily today require-timed)
                             (800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000)
                             "......" "----------------"))
1赞

linux 中测试:

diary-anniversary 显示不出来,初步估计可能是 org-agenda-custom-commands 的设置內容有关,具体再测试。

另,除了日出日落,和 diary-iso-date, diary-chinese-date , 有具体时间的项目等,能在 agenda 中显示外,其他没有具体时间的项目如,09 Mar 2020 drink water watch TV 也不能显示,不知和上述设置项是否有关,待测试。

查看下, 2021, 2022年的3月9日, 也能看到

19:35 test/test
19:45 Drink

03/09和Mar 09, 2020是添加到每一年的这一天, 后面的2020是无效的.

建议诸如 %%(diary-sunrise)这样的special diary entries 使用diary的语法,
其余的用org-timestamp的语法, 写进org文件.

1赞

确实是 org-agenda-custom-commands 设置问题,改动了一下,现在都显示出来了:

Screenshot_2020-03-09_20-29-52

格式有待调整一下。

linux 基本解决,mac 重复显示的 bug 明天还得试试 :sweat:

03.Interact with Calendar

本章从agenda-view切入, 论述org作为"计划与管理"的地表最强工具的功能,
第一节"agenda-time-grid"推荐了以3个小时为时间段, 八等分一天24小时的time-grid表格, 并对每个时间段命名;
第二节"integrated with a Diary", 引入"自然时间"锚点sunrise-and-sunset, moon-phase, 与时间的最本质-天体的运行构建物理关联.
第三节(本节)以及第四节将论述最核心的问题:Review
第五节到第八节在agenda的基础上深入探讨org-todo的管理与规划的工作流.

本节初步探讨如何提高review的效率, 即如何速度浏览agenda-view,以及快递定位某日的agenda-view.

3.1.内置的Agenda-View Display

Agenda提供四种视图模式, 便于快速的review.

常用的是"day-view"与"week-view", 因为周回顾更频繁, 而"month-view"需要频繁操作page-down和page-up,不如分四次week-review.

在一种agenda-view的模式下, 查看前后的日期或者时间段的方法:

org-agenda-earlier : 快捷键 b (backwards)

org-agenda-later : 快捷键 f (forwards)

org-agenda-goto-today : 快捷键 . (dot)

org-agenda-reset-view : 快捷键 v SPC

以上命令协助方便的查看当前视图前前后后的时间点(day)或者时间段(week),
若要查看特定的日期, 则颇为不便.
比如要查看2019-08-01当日的主要活动,
操作backwards和forwards抵达目的日期比较耗费时间.

作为解决方案, Emacs提供了function org-agenda-goto-calendar 与calenda互动.

3.2.从"Calendar中操作"Agenda"

Functions: org-agenda-goto-calendarorg-agenda-goto-agenda 架起calendar与agenda之间的桥梁, 凿穿二者之间的壁垒.
快捷键的设置也秉持这一原则, 采用相同的字母c(calendar), Agenda中按键"c"调出calendar界面, Calendar中按键"c"调出来目标日期的agenda界面.

由此, 查看特定日期"2019-08-01"的活动日志的分步骤操作为:

  1. 在当前的agenda-day-view界面下按键c, 调出来calendar窗口
  2. 光标在日历中移动到目标日期"2019-08-01"
  3. 在光标处按键c, 调出目标的agenda界面.

其中第一步和第三部很简单, 都是按键c, 关键是第二步移动光标到目标日期的日历操作.

3.2.1.日历的逻辑分割

对"日历"的操作, 分为三个层次:

  • Day, Week 日/周/
  • Month, Season(3-months)
  • Year

思考过程也最好按照emacs-calendar设置的这三个清晰地层次.

3.2.2.文本命令与日历命令的对比:

日历中的motion与文本中的motion一一对应,

基本思路是将Calendar作为文本处理. 对应关系表格如下:

|-------+---------------------+------------------------------------|
| Keys  | Text                | Calendar                           |
|-------+---------------------+------------------------------------|
|       | *character*         | *day*                              |
| C-f   | forward-char        | calendar-forward-day               |
| C-b   | backward-char       | calendar-backward-day              |
|-------+---------------------+------------------------------------|
|       | *word*              |                                    |
| M-f   | forward-word        | 突破月份的限制的scroll.            |
| M-b   | backward-word       |                                    |
|-------+---------------------+------------------------------------|
|       | *line*              | *week*                             |
| C-a   | beginning-of-line   | calendar-beginning-of-week         |
| C-e   | end-of-line         | calendar-end-of-week               |
| C-p   | previous-line       | calendar-backward-day              |
| C-n   | next-line           | calendar-forward-week              |
|-------+---------------------+------------------------------------|
|       | *sentence*          | *month*                            |
| M-a   | backward-sentence   | calendar-beginning-of-month        |
| M-e   | forward-sentence    | calendar-end-of-month              |
|-------+---------------------+------------------------------------|
| >     |                     | calendar-scroll-left               |
| <     |                     | calendar-scroll-right              |
|-------+---------------------+------------------------------------|
|       | *paragraph*         |                                    |
| M-{   | backward-paragraph  | calendar-forward-month             |
| M-}   | forward-paragrap    | calendar-backward-month            |
|-------+---------------------+------------------------------------|
|       |                     | *3-months*                         |
| C-v   | scroll-down         | calendar-scroll-left-three-months  |
| M-v   | scroll-up           | calendar-scroll-right-three-months |
|-------+---------------------+------------------------------------|
|       | *page*              | *year*                             |
| C-x [ | backward-page       | calendar-forward-year              |
| C-x ] | forward-page        | calendar-backward-year             |
|-------+---------------------+------------------------------------|
|       | *buffer*            |                                    |
| M-<   | beginning-of-buffer | calendar-beginning-of-year         |
| M->   | end-of-buffer       | calendar-end-of-year               |
|-------+---------------------+------------------------------------|

此处再次印证了一个问题: Emacs不仅能提高工作效率, 而且能潜移默化改造大脑的思考模式.

3.2.3.便捷的命令

g d

: Move point to specified date (calendar-goto-date).

g D

: Move point to specified day of year (calendar-goto-day-of-year).

g w

: Move point to specified week of year (calendar-iso-goto-week).

o

: Center calendar around specified month (calendar-other-month).

.

: Move point to today’s date (calendar-goto-today).

3.3."Calendar"与"Agenda"合二而一

上述的解决方案, 由按键c显性的调用calendar, 有没有在逻辑上更加"丝滑"的方法呢?

答案是: org-agenda-goto-date 快捷键"j".

三步操作分解为:

  1. 在当前agenda中按键"j"
  2. 移动到目标日期
  3. 回车则直接跳转到目标日期的agenda

此处应用的是"插入时间戳"的方法, 隐藏了显性的跳转, 逻辑上更加顺畅.

这种"The date/time prompt"移动到目标日期的光标移动与直接在日历中操作稍有不同, 不同的原因是当前光标在mini-buffer中, 只能间接操作calendar. 表格如下:

|-------------+----------------------------------------|
| (RET)       | Choose date at point in calendar.      |
| (mouse-1)   | Select date by clicking on it.         |
| (S-RIGHT)   | One day forward.                       |
| (S-LEFT)    | One day backward.                      |
| (S-DOWN)    | One week forward.                      |
| (S-UP)      | One week backward.                     |
| (M-S-RIGHT) | One month forward.                     |
| (M-S-LEFT)  | One month backward.                    |
| (>)         | Scroll calendar forward by one month.  |
| (<)         | Scroll calendar backward by one month. |
| (M-v)       | Scroll calendar forward by 3 months.   |
| (C-v)       | Scroll calendar backward by 3 months.  |
|-------------+----------------------------------------|

还是三个清晰地逻辑单元:

  • Day, Week 日/周/
  • Month, Season(3-months)
  • Year

所属项目:步步为营, 零秒精通Emacs

现在阻止我更加高效的使用org的原因是我没有一个很好的设备使用org-mode. 虽然这个话题和楼主的题目有点出入,不过我想借此问一下:如何实现无处不在地使用org-mode呢?

我在公司,使用一台工作电脑

在家有一个生活电脑

平时在路上使用手机

我希望org能够完全管理我的生活,但是没有一个很流畅的同步方案,导致经常出现我的org文件丢失,不同步,弄得我也不想继续使用下去了。

想问下有没有工具能够解决我的问题?

窃以为, 可能不是工具的问题, 是工作习惯和思维模式的问题.

谈不上解决问题的方法, 晒晒个人的策略仅供参考:

  1. 办公室和家里使用同一台电脑;
  2. 只在手机上用邮箱处理紧急工作, 正式工作回到电脑上去;
  3. 有五六年的时间在手机上尝试各种时间与项目管理工具, App Store里购买工具浪费近万, 现在只用手机自带的记事本.

重要的事情回到电脑上处理.

由于我主要使用Mac,所以我用iCloud作为主要同步工具。目前使用下来完全够用。

  1. 手机端用beorg,选择iCloud同步,会在iCloud目录中生成一个beorg的目录
  2. 将你常用的org文件拷贝到这个目录中
  3. 在Mac端可以将这个目录符号链接到~/org/

看起来很方便,不过 这不开源

5.Event, Note and Task

Diary Template

日记模板划分为四个区域:

  1. 日记, 如"方方日记"那样
  2. 计划, Heading设置为Procedures
  3. 事件, Events, 周边的主要事件, 比如部门聚餐.
  4. 任务, Tasks, 记录当日的收集的任务.

Org’s Capture System

Capture Event

公司早会之后, 同事"李子轩"问我借走了一只圆珠笔, 于是随手记录该事件.

"M-x org-caputre"触发capture-template Buffer.

按键"e", 选择"Event"

如上图所示, emacs-org自动捕捉记录的event到当日的事件Heading下面, 输入完毕后按键"C-c C-c"

此时查看Agenda, 便一目了然.

"圆珠笔"是早上8:33顺走的, 真万难抵赖.

Capture notes and ideas

"神来之笔"的想法, 不仅应该及时地记录下来, 还应该打上准确的时间戳以记录想法产生的具体时间.

重复上述"Capture Event"的操作, 按键"n", 选择note.

查看Agenda,

每晚睡前Review之时, 一眼便能看到在早上"8:48"产生了一个"神来之笔"的想法.

Capture Task

任务处理是org-mode最核心的功能, 添加任务的方法与前两项相同.

从agenda-dispatcher选择todo list, 标记任务状态为"STRT"并开始计时.

此时再回到agenda-view

Diary Archive

日记文件"todo.today.org"记录本周七天的活动. 满一周后归档到"diary-by-month"文件夹中

$ ls diary-by-months/  | grep 2020
2020-01.org
2020-02.org
2020-03.org

所属项目: 步步为营, 零秒精通Emacs

1赞
(setq org-agenda-time-grid (quote (((daily today require-timed)
                                    (300 600 900 1200 1500 1800 2100 2400)
                                    "......" "----------------"))))

这一块代码在我用的 28 也有问题, 多了套括号

1赞

谢谢, 把原贴修改了.

;;---------------------------------------------
;;org-agenda-time-grid
;;--------------------------------------------
(setq org-agenda-time-grid (quote ((daily today require-timed)
                                   (300
                                    600
                                    900
                                    1200
                                    1500
                                    1800
                                    2100
                                    2400)
                                   "......"
                                   "-----------------------------------------------------"
                                   )))

补充"5.3.Interact with Calendar", agenda与calendar互动的快捷方式:

在第三节"3.Interact with Calendar"介绍了agenda与calendar互动的方法. 展示附带Calendar的agenda, 需要两步操作:

  1. M-x org-agenda 或者 C-c a 调出来, agenda-veiw的界面
  2. 然后按键"c"调用Calendar

以上两步操作可以合并为一步, 代码如下:

;;integrated with Calendar
(general-advice-add 'org-agenda :after
                    (lambda (_)
                      (when (equal (buffer-name)
                                   "*Org Agenda*")
                        (calendar)
                        (calendar-mark-holidays)
                        (other-window 1))))

(general-advice-add 'org-agenda-quit :before
                    (lambda ()
                      (let ((window (get-buffer-window calendar-buffer)))
                        (when (and window (not (one-window-p window)))
                          (delete-window window)))))

以上代码添加进配置文件之后,

C-c a a (M-x org-agenda) 将会打开"带calendar"界面的agenda-view, 按键"q"退出agenda-view.