本文为项目 步步为营, 零秒精通 Emacs 之:
05.Emacs as a Agenda by Org
先打个样:
评论区连载
期待,赶紧放出来吧。这一系列博文打磨的真不错。
首先从配置中指定 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
归入在:
这两个文件夹内,
此处可以是org文件所在的文件夹, 也可以是org文件本身.
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
默认配置有以下三个问题:
解决方案
"八分图"切割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) |
|----+-----------+----------+------------------|
时间段的命名取自维基(中文/日文,搜"早晨"),
头脑呈现
历史的筛选与传统的继承, 时间在头脑中的具象是"圆形表盘", 因此八个时间段的具象呈现, 在思考过程中的形象,
在agenda-time-grid上, 添加四个时间锚点,
显示为:
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-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".
写入内容:
;;Day info
;; 日出而作, 日落而息
%%(diary-sunrise)
%%(diary-sunset)
%%(diary-lunar-phases)
;;
%%(diary-iso-date)
;;中国农历
%%(diary-chinese-date)
其中 diary-sunrise
与 diary-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
一个奇怪的问题,同样的配置文件,同样的 org 文档,在 linux 里显示的日出、日落是一次,在macos mojave 显示了两次,如图:
这是在 macos 的状态。
下图是 diary.org 内容:
还有一个就是
%%(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
那基佬紫一出,顿觉眼前一亮,下一天雨的阴霾心情,瞬间明亮了许多。
解决四:
这个语法在我机器上不管用,显示光溜溜的什么也沒有,如图:
改成这样才行:
(setq org-agenda-time-grid '((daily today require-timed)
(800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000)
"......" "----------------"))
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文件.
确实是 org-agenda-custom-commands
设置问题,改动了一下,现在都显示出来了:
格式有待调整一下。
linux 基本解决,mac 重复显示的 bug 明天还得试试
本章从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.
Agenda提供四种视图模式, 便于快速的review.
org-agenda-day-view
: 快捷键 v d
org-agenda-week-view
: 快捷键 v w
org-agenda-month-view : 快捷键 v m
org-agenda-year-view : 快捷键 v y
常用的是"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互动.
Functions: org-agenda-goto-calendar
与 org-agenda-goto-agenda
架起calendar与agenda之间的桥梁, 凿穿二者之间的壁垒.
快捷键的设置也秉持这一原则, 采用相同的字母c(calendar),
Agenda中按键"c"调出calendar界面,
Calendar中按键"c"调出来目标日期的agenda界面.
由此, 查看特定日期"2019-08-01"的活动日志的分步骤操作为:
其中第一步和第三部很简单, 都是按键c, 关键是第二步移动光标到目标日期的日历操作.
对"日历"的操作, 分为三个层次:
思考过程也最好按照emacs-calendar设置的这三个清晰地层次.
日历中的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不仅能提高工作效率, 而且能潜移默化改造大脑的思考模式.
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
).
上述的解决方案, 由按键c显性的调用calendar, 有没有在逻辑上更加"丝滑"的方法呢?
答案是: org-agenda-goto-date
快捷键"j".
三步操作分解为:
此处应用的是"插入时间戳"的方法, 隐藏了显性的跳转, 逻辑上更加顺畅.
这种"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. |
|-------------+----------------------------------------|
还是三个清晰地逻辑单元:
现在阻止我更加高效的使用org的原因是我没有一个很好的设备使用org-mode. 虽然这个话题和楼主的题目有点出入,不过我想借此问一下:如何实现无处不在地使用org-mode呢?
我在公司,使用一台工作电脑
在家有一个生活电脑
平时在路上使用手机
我希望org能够完全管理我的生活,但是没有一个很流畅的同步方案,导致经常出现我的org文件丢失,不同步,弄得我也不想继续使用下去了。
想问下有没有工具能够解决我的问题?
窃以为, 可能不是工具的问题, 是工作习惯和思维模式的问题.
谈不上解决问题的方法, 晒晒个人的策略仅供参考:
重要的事情回到电脑上处理.
由于我主要使用Mac,所以我用iCloud作为主要同步工具。目前使用下来完全够用。
beorg
的目录org
文件拷贝到这个目录中~/org/
看起来很方便,不过 这不开源
日记模板划分为四个区域:
公司早会之后, 同事"李子轩"问我借走了一只圆珠笔, 于是随手记录该事件.
"M-x org-caputre"触发capture-template Buffer.
按键"e", 选择"Event"
如上图所示, emacs-org自动捕捉记录的event到当日的事件Heading下面, 输入完毕后按键"C-c C-c"此时查看Agenda, 便一目了然.
"圆珠笔"是早上8:33顺走的, 真万难抵赖."神来之笔"的想法, 不仅应该及时地记录下来, 还应该打上准确的时间戳以记录想法产生的具体时间.
重复上述"Capture Event"的操作, 按键"n", 选择note.
查看Agenda,每晚睡前Review之时, 一眼便能看到在早上"8:48"产生了一个"神来之笔"的想法.
任务处理是org-mode最核心的功能, 添加任务的方法与前两项相同.
从agenda-dispatcher选择todo list, 标记任务状态为"STRT"并开始计时.
此时再回到agenda-view
日记文件"todo.today.org"记录本周七天的活动. 满一周后归档到"diary-by-month"文件夹中
$ ls diary-by-months/ | grep 2020
2020-01.org
2020-02.org
2020-03.org
(setq org-agenda-time-grid (quote (((daily today require-timed)
(300 600 900 1200 1500 1800 2100 2400)
"......" "----------------"))))
这一块代码在我用的 28 也有问题, 多了套括号
谢谢, 把原贴修改了.
;;---------------------------------------------
;;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, 需要两步操作:
以上两步操作可以合并为一步, 代码如下:
;;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.