本文翻译自 http://doc.norang.ca/org-mode.html ,原文作者为Bernt Hansen 。由于原文较长,因此会分多篇文章来发布。转载请标记出处。
#+end_src
Org-mode, 用文本文件管理日常(二)
Org-mode, 用文本文件管理日常(三)
Org-mode, 用文本文件管理日常(四)
Org-mode, 用文本文件管理日常(五)
Org-mode, 用文本文件管理日常(六)
Org-mode, 用文本文件管理日常(七)
Org-mode, 用文本文件管理日常(八)
Org-mode, 用文本文件管理日常(九)
Org-mode, 用文本文件管理日常(十)
Org-mode, 用文本文件管理日常(十一)
Org-mode, 用文本文件管理日常(十二)
Org-mode, 用文本文件管理日常(十三)
提高生产力工具
清单处理
清单对于那种重复性并包含非常多需要做的事情的任务适用。曾经,当清单任务完成后,我会手动
清除复选框的选择状态,以保证后续能继续执行。但是现在不会这样麻烦了,因为有 rog-checklist 功能,
当重复的任务标记完成时候,清单中复选框就会自动清除选择状态。
在你的.emacs中添加如下脚本来完成上述功能。
(add-to-list 'load-path (expand-file-name "~/git/org-mode/contrib/lisp"))
(require 'org-checklist)
当需要在任务中使用时候,只需要设置 RESET_CHECK_BOXES 为 t .
像下面一样:
* TODO Invoicing and Archive Tasks [0/7]
DEADLINE: <2009-07-01 Wed +1m -0d>
:PROPERTIES:
:RESET_CHECK_BOXES: t
:END:
- [ ] Do task 1
- [ ] Do task 2
...
- [ ] Do task 7
备份
= 及时备份那些还没有完成的的任务 =
10年前,我曾经因为没有很好的备份手段而丢失掉大量数据。那时我就告诫自己 = 我以后再也不想丢失任何数据 = 。到现在为止确实没有丢失过了:).
我在备份时候很谨慎。org模式怎么来帮助完成备份的?确实没有花很大力气,并不是我不想花很多时间来备份–它时刻在发生–这节省我时间,并可以把这些时间花在处理其他更有趣的事情上。
我备份的原则就是方便恢复数据–但是这条却并不容易实现。也并不需要非常容易/快速从备份中恢复,因为从备份数据将其恢复也并不经常发生。恢复时候节省时间没什么意义。相反,我希望备份时候能够快速无痛点,因为我经常做备份。
10年前我就自动化网络备份了,当然现在依然再用。我所用的所有电脑从网络驱动获取每日备份。每个月收集一次并写入可移动硬盘。
我有个月备份任务,当满一个月,就会提醒我备份当前数据到外部存储中。我很开心现在备份执行时间变得越来越少。
自从 git 进入我生活, 多主机备份 git 代码仓库就变得更加简单了。当前只要有修改推送发送远程仓库,就会自动备份该仓库中所有东西。
处理受阻任务
受阻任务是那些包含子任务的任务,并且该任务至少有一个子任务不处于done状态。
受阻任务在agenda视图中以灰色来显示。
可以通过如下脚本,启用受阻任务功能:
(setq org-enforce-todo-dependencies t)
这个设置会阻碍试图将包含未在完成状态子任务的任务,设置为完成状态。除了重复任务外。这样做非常好。对于重复任务,我通常会在任务下面添加很多=TODO=状态子任务,并且这些子任务也不一定要这个周期完成,可以在下个周期完成。
当然,可以通过快捷键 C-u C-u C-u C-c C-t 临时修改任务设置,但我记不住
这组快捷键。我在重复任务设置了一个永久属性:
* TODO New Repeating Task
SCHEDULED: <2009-06-16 Tue +1w>
:PROPERTIES:
:NOBLOCKING: t
:END:
...
** TODO Subtask
这可使得 新的重复任务 即使有子任务没有完成,也可以正常对父任务设置完成状态,不会受阻。
通常我会按照一个给定的顺序来完成任务。org-mode有个 ORDERED 属性来对子任务做顺序限制。
* TODO Some Task
:PROPERTIES:
:ORDERED: t
:END:
** TODO Step 1
** TODO Step 2
** TODO Step 3
这种情况下,你需要在完成 Step 1 后再去完成 Step 2 。org mode会阻止你去对一个前面还有不在完成状态的任务,设置完成状态。
org任务结构以及展示
本节主要介绍我处理org文件时,是怎么设置任务显示的大量定制化脚本。
控制标题前置符号显示
对于任务的前置符号(*),org-mode可以定制化其是否显示。也有可能在其它层级中出现标题,这样前置符号以及标题就可以在子树层对齐。
为使得org 显示前置符号,可以做如下设置
(setq org-hide-leading-stars nil)
我当前使用 org-indent mode来隐藏前置符号(*).
org-indent模式
我最近开始使用org-indent模式。我很喜欢这个模式。它会在org文件中移除这些对齐符号,但是当编辑缓冲区时,这些对齐就会显示。
org-indent模式当org-odd-level-only 值为true时显示,但是显示效果比我之前的设置更加整洁。因此我更喜欢它。
我的org-indent模式在emacs启动时自动生效:
(setq org-startup-indented t)
处理空行
空行很邪恶 . 他们自动在标题行之间插入,但是当标题行折叠后我并不想看到他们。
当我用 TAB (循环)折叠标题时,不希望在标题间看到空行。
下列设置保证隐藏空行,这样在标题折叠后,就会更加精炼整洁。
(setq org-cycle-separator-lines 0)
我发现在列表以及大纲显示空行也有点令人讨厌。为了获取list列表后内容,你需要包含空行–合适缩放内容。我大部分list没有内容,所有我也不希望list后面有空行。
下面设置,防止在创建标题时插入空行,但是允许list兼容空行。
(setq org-blank-before-new-entry (quote ((heading)
(plain-list-item . auto))))
快速添加不含当前任务内容的任务。
为在项目文件中创建一个新标题非常方便,可以通过快捷键 C-RET , C-S-RET,M-RET , 以及 M-S-RET . 这将插入一个新标题并包含 TODO 关键字。
通过如下设置:
(setq org-insert-heading-respect-content nil)
org在光标行通过 M- 插入大纲,通过 C- 插入内容。内容设置对于 C- 版本临时开启的,会添加新标题. 所以可以通过快捷键 C-S-RET 在当前条目上执行后,就会在后面添加一个新标题。也可以通过 M-S-RET 将一个标题分成两个。
备忘放在任务前部
我通过 C-c C-z 创建一个备忘任务(或者在agenda中执行 z )。有时候修改任务状态也会弹出要求输入备忘(e.g. 移动到 WAITING 状态,就会弹出备忘,我会输入进入等待状态的原因).这些备忘保存在任务最前端,因此当取消折叠任务时,备忘就会显示最前端。
(setq org-reverse-note-order nil)
查找并显示结果
当需要在你的org文件中查询数据,org-mode的查找能力就起作用了。 C-c / / 会做正则表达式查找当前文件,并在org文件折叠视图中显示匹配结果。
当使用如下设置,我的org模式就可以显示匹配项的任务,以及邻近的任务(并不是所有相邻任务):
(setq org-show-following-heading t)
(setq org-show-hierarchy-above t)
(setq org-show-siblings (quote ((default))))
这使得查找结果显示更加精简,也能够避免由于使用 C-k 从org文件中剪切太多的数据。剪切折叠数据(包括…)非常危险,因为它也将那些你看不到的文本内容(包括相邻的子任务)也会
剪切掉。正因为这样,我总是在显示查找结果时,也会显示大纲。
编辑以及特殊按键处理
在处理标题时,org-mode快捷键C-a, C-e以及C-k快捷键都能正常工作。我也会用一些设置来处理粘贴(yanks)子任务以及根据任务调整子树层级。通过查看帮助文档(C-h v org-yank-adjust- subtrees), 可以查看详细细节以及如何使用。
我使用 org-special-ctrl-a/e ,能够快速移动光标到标题开始结束位置。我使用 M-m 或者 C-a C-a来移动光标到行开始处。因此,快捷键在org mode依然很好工作,并且通过快捷键 C-a ,我能够将光标定位到行开始处。
附件
附件可以很方便在你的项目相关org-mode文件之外,添加关联的大量数据。在附件功能出来之前我会在我的org文件中包含非常多的SQL代码段,来保存项目数据库的修改。这导致我的org文件非常大。
(setq org-id-method (quote uuidgen))
假如说,你想把 x.sql 添加到当前任务中。在 /tmp/x.sql 中创建文件保存。
通过快捷键 C-c C-a a ,添加附件,并输入文件名: x.sql.这将为任务生成一个唯一ID,然后把文件拷贝到附件目录。
* Attachments :ATTACH:
:PROPERTIES:
:Attachments: x.sql
:ID: f1d38e9a-ff70-4cc4-ab50-e8b58b2aaa7b
:END:
附件被保存在 data/f1/d38e9a-ff70-4cc4-ab50-e8b58b2aaa7b/.它的具体位置对
我来说并不重要–只要它保存下来了并且能够方便取得就可以了。org-mode拷贝原来文件/tmp/x.sql 到备份目录。
对于有附件的任务,都会添加一个 ATTACH 标签,因此你可以很方便通过tag标签找到这些任务。
通过 C-c C-a o 打开一个带有附件的任务。这个命令会弹出输入要打开文件的提示,按 TAB就可以自动补全。
ID 对于每个任务都会生成一个唯一的。
当然也可以自己定义附件存储位置,但是我并不需要这么做 – 存在默认位置就行,只要能找到就可以了。
我将我的org文件所有附件,都存储在子目录 data 中。这样就可以通过 git 来管理。当有附件添加,我就可以直接push到远程仓库中。
截止日以及agenda可视化
截止日在生活必不可少。默认我会在agenda视图中显示30天内的任务。
下面设置可以完成这个目的:
(setq org-deadline-warning-days 30)
这样我就有足够时间在截止日前完成这个任务。
将表格导出成CSV格式
我有时会为任务添加org-mode表格,用来记录一些项目相关数据。我的客户也喜欢这种表格。当然在org mode中,很方便将表格导出成HTML格式,但是对于希望编辑这种表格的人来说,就不是特别方便。为解决这个问题,我会将表格导出成逗号分割(CSV)格式然后发给客户(或者通过表格读取然后发送给可以)
org-mode可以将表格导出成TAB或者逗号分隔的格式。我设置导出默认的CSV格式脚本如下:
(setq org-table-export-default-format "orgtbl-to-csv")
我默认只导出成CSV格式,所有当导出时我只敲击RETURN来完成导出工作。
为导出下面表格,我将光标移动到表格里边然后执行 M-x org-table-export
,然后会提示输入名字以及格式,默认是CSV格式。
One Two Three
1 1 2
3 6 5
fred kpe mary
234.5 432.12 324.3
这将导出下列格式的数据文件
One,Two,Three
1,1,2
3,6,5
fred,kpe,mary
234.5,432.12,324.3
最小化Emacs Frames
我的org文件中包含各种各样的email链接,网页以及其他文件链接。下面设置控制
org-mode处理链接方法。
(setq org-link-frame-setup (quote ((vm . vm-visit-folder)
(gnus . org-gnus-no-new-news)
(file . find-file))))
; Use the current window for C-c ' source editing
(setq org-src-window-setup 'current-window)
我喜欢所有链接都在一个窗口打开,这样我就不需要在我的窗口中管理多个frame了。通常我全屏工作,链接都是在这个窗口打开,这样工作方式很适合我。
我如果需要处理多个文件,我会手动通过快捷键 C-x 5 2 创建第二个frame或者用快捷键 C-x 4 2 或者 C-x 4 3 分割窗口。当需要访问文件时,会将当前窗口内容替换成新内容。
日志相关的
我大部分日志是通过全局 org-todo-keywords 来控制。
我的日志设置如下:
(setq org-log-done (quote time))
(setq org-log-into-drawer t)
(setq org-log-state-notes-insert-after-drawers nil)
我的 org-todo-keywords 设置如下:
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
(sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
当任务状态变化发生时, 日志就会被记录下来:
- 达到 DONE 状态或者从 DONE 状态退出
- 到 WAITING 状态(包含备忘)或者退出 WAITING 状态= 到 HOLD 状态
- 到 CANCELLED 状态(包含备忘)或者退出 CANCELLED 状态。
我将计时信息以及状态信息记录在任务 LOGBOOK 抽屉中,以保持我的任务整洁。如果一个任务在等待状态,那么在LOGBOOK里,就会显示等待原因,LOGBOOK也会处于展开状态,用来提示信息。在agenda视图中,只要对任务单击 SPC 就可以取得LOGBOOK信息。
限制任务计时
org-mode新引入一个非常棒的功能,就是一个任务评估时间到的时候会发送通知。我用这个功能来限制每天某些任务执行时间。
例如,这个文档我已经花了将近2个月时间。我想尽快把它完成但是我没法只做这件事,这样其他事情就没法做了。我想每天做点,比如限制每天只花1个小时在org-mode文档编写上。
因此我建了下面一个任务:
* NEXT Document my use of org-mode
:LOGBOOK:...
:PROPERTIES:
:CLOCK_MODELINE_TOTAL: today
:Effort: 1:00
:END:
这个任务有一个小时评估时间,当我开始做这个任务时候,mode-line显示如下
--:** org-mode.org 91% (2348,73) Git:master (Org Fly yas Font)-----[0:35/1:00 (Document my use of org-mode)]-------
我今天在这个项目中已经花了35分钟了。
我会设置一个报警声,当评估时间到了的时候就会想起星际迷航声音(是的,我是星际迷)。
(setq org-clock-sound "/usr/local/lib/tngchime.wav")
当一个小时评估时间到了,报警声就会想起,并且会弹出消息提示这个任务应该完成了。如果我切换到其他任务,又切换回来,每次切换回来报警声都会想起来。这让我不得不做其他工作
你也可以对重复任务做相应设置。默认情况下最后一次时间将会被记录下来。对于重复任务mode-line时间显示的是最后一次计时。这方便几天后来评估自己花的时间。
习惯跟踪
John Wiegley最近在org-mode中添加了对习惯跟踪的功能支持。
我有很多习惯(有些是不好的习惯),但是我还是希望来改进并建立一些好的习惯。这就是习惯跟踪做的事。它通过图形形式显示在agenda视图上,显示出你的习惯做的怎么样。
我有如下习惯:
- 手洗碟子
- 30分钟快步走
- 打扫家庭卫生
等等。大部分习惯需要规律性完成,所以有时候需要给点压力才能这么做。为跟踪习惯是否正常完成,需要记录状态切换日志。
习惯任务与一般的任务很像,除了它设置了特别的 属性 。该属性被设置为习惯,有个计划 时间项,就像下面这样:
* TODO Update Org Mode Doc
SCHEDULED: <2009-11-21 Sat .+7d/30d>
[2009-11-14 Sat 11:45]
:PROPERTIES:
:STYLE: habit
:END:
这样习惯任务就可以和一般任务有所区别,agenda视图就会把它当做一个习惯任务来显示。当习惯完成后,并被标记完成后,在agenda视图中就根据计划项,显示下次任务发生时间。(.+7d).SCHEDULED 项特殊地方是,我希望这个任务每天都被执行,或者每两天要执行。如果3天没有标记习惯完成,那么在agenda视图中它就会显示红色,表示我很久没有执行这个习惯了。
如果习惯被忽略了,那么也不是什么世界末日的大事。你可以通过 K 键来在agenda显示或隐藏习惯任务。
如下是我的习惯设置:
; Enable habit tracking (and a bunch of other modules)
(setq org-modules (quote (org-bbdb
org-bibtex
org-crypt
org-gnus
org-id
org-info
org-jsinfo
org-habit
org-inlinetask
org-irc
org-mew
org-mhe
org-protocol
org-rmail
org-vm
org-wl
org-w3m)))
; position the habit graph on the agenda to the right of the default
(setq org-habit-graph-column 50)
每日,我会通过 K 在agenda中关闭习惯任务显示。当关闭后,这个设置就会永久保持了,当我的emacs后台运行几天后,习惯任务也不会自动显示在agenda视图中。为保证我每天早上都能看到习惯执行情况,我做了如下设置,这样每天早上,习惯任务就能显示在agenda视图中。
(run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
对于习惯只记录完成状态修改
我通常将习惯放在第一层任务 * Habits 中,并且仅当任务完成时候才会记录属性。这样我就可以在取消一个习惯时候不会记录一个时间戳,从而让这些信息填满习惯任务中.当要取消一个习惯,只要从agenda中移除。如果习惯没有执行,那么没法重做(例如早上6点起床),对于没有遵循的习惯任务,就不能标记成完成。我就会取消每日重复的习惯。
我的习惯任务就像下面一样-我习惯为每个org文件都添加习惯标题。
* Habits
:PROPERTIES:
:LOGGING: DONE(!)
:ARCHIVE: %s_archive::* Habits
:END:
自动复原模式
我使用git在我的笔记本以及我的工作站之间同步org-mode文件。常规执行流程是保存当前修改,推送到repo中,在其他系统中获取,然后我需要对我的所有org-mode文件执行revert buffer操作,这样才能够获在buffer中显示更新的文件内容。
曾经我使用 org-revert-all-org-buffers 但是自从我发现 global-auto-revert-mode之后,我就不再使用原来方法了。使用新的方法,只要缓冲区内容和硬盘中文件内容不一致,缓冲区就会自动revert buffer。
这个模式对于我这种跨系统使用org-mode文件非常实用。
(global-auto-revert-mode t)