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

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

2 个赞

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

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

在家有一个生活电脑

平时在路上使用手机

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

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

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

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

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

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

1 个赞

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

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

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

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

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

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

2 个赞

谢谢, 把原贴修改了.

;;---------------------------------------------
;;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.

关于 capture 的问题:

请问如何做到在日期里的子标题(如Events)里插入entry的。 我只找到可以用 file+datetree 在日期下插入entry。并没有找到在日期里的特定 headling 里插入 entry 的方法

file+function.

我是这样处理的

首先我的org文档使用dropbox作为同步, 在不同的电脑上都可以挂载dropbox的目录,写org。 其次为了解决外出,我在云上开了一台虚拟机装安装了dropbox,和emacs 通过nomachine 远程方式可以远程接入编写org。 另外,如果只是记录todo的话,ios和Android都有对用的客户端使用,同理,数据也是通过dropbox进行同步。

1 个赞

还是觉得与终端的同步越简单越好,
尝试完各种复杂绚丽的组合功能之后,最后较大可能回到最简单的应用。

比如qq邮箱。 后文稍作总结。

憎恶QQ邮箱,必须强行微信扫码绑定。 我有好几个QQ邮箱,但我只有一个微信。

1 个赞

想看一下LZ的org-capture-templates是怎么配置的

1 个赞

为什么我的最后一行农历信息不显示中文,显示的是拼音?

对, 就是拼音啊。

我看有的截图是中文。
找到了两句代码可以把拼音变中文:

(setq calendar-chinese-celestial-stem ["甲" "乙" "丙" "丁" "戊" "己" "庚" "辛" "壬" "癸"])
(setq calendar-chinese-terrestrial-branch ["子" "丑" "寅" "卯" "辰" "巳" "午" "未" "申" "酉" "戌" "亥"])
2 个赞

这个真不错。

后来我的配置里,把%%(diary-chinese-date)这一行去掉了,而设置了agenda与calenda的同时显示, 即,C-c a a调出 agenda + calendar的二者相结合界面, 光标焦点在agenda.

代码如下:

;;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)))))

这样设置之后,就取消了%%(diary-chinese-date)这一行。

看来要重新加回去了。O(∩_∩)O

P.S. 这一行还是有点长,尤其是 week-view和month-view的时候, 从日历中看似乎好一点点儿。

1 个赞

非常感谢您的分享,很有启发!关于农历这一部分我的建议是,不要用dairy多占一行,而是直接改agenda的显示样式。

实现效果如下:

实现方案:

  1. 安装 cal-china-x
  2. 加载以下配置,我从各个函数摘抄的 :joy:
      (setq org-agenda-format-date 'yuchen/org-agenda-format-date-aligned)

      (defun yuchen/org-agenda-format-date-aligned (date)
        "Format a DATE string for display in the daily/weekly agenda, or timeline.
      This function makes sure that dates are aligned for easy reading."
        (require 'cal-iso)
        (let* ((dayname (aref cal-china-x-days
                              (calendar-day-of-week date)))
               (day (cadr date))
               (month (car date))
               (year (nth 2 date))
               (cn-date (calendar-chinese-from-absolute (calendar-absolute-from-gregorian date)))
               (cn-month (cl-caddr cn-date))
               (cn-day (cl-cadddr cn-date))
               (cn-month-string (concat (aref cal-china-x-month-name
                                              (1- (floor cn-month)))
                                        (if (integerp cn-month)
                                            ""
                                          "(闰月)")))
               (cn-day-string (aref cal-china-x-day-name
                                    (1- cn-day))))
          (format "%04d-%02d-%02d 周%s %s%s" year month
                  day dayname cn-month-string cn-day-string)))
6 个赞