神器 Org-mode

Org is a mode for keeping notes, maintaining TODO lists, and project planning with a fast and effective plain-text system.

It also is an authoring system with unique support for literate programming and reproducible research.

Org mode 官网上介绍的这段文字基本描述清了它可实现的功能, 但用词还是腼腆了点, 它 就是效率之神. 如果你喜欢管理记录, 喜欢GTD, 一定一定要学习下 Org mode , 学会它, 你会放弃你所知道的一切其它的效率软件.

关于 Org mode 在各方面使用的总结, 有很多优秀文章: GTD , Literate Programming , Cookbook , 当然也少不了最最经典的 Organize Your Life In Plain Text! .

我个人是 Vim 的忠实粉丝, 在我看来, Vim 的 mode editting 已经是文本编辑的效率极限 了. 但自从体验了一次 Org mode 的功能, 实在是太强大了,只能转投 Emacs 的阵营. 切 换后因不习惯 Emacs 变态的组合式按键, 适应了好久. 万幸, 后来 Spacemacs 降世, 它竟 然完美的综合了 Emacs 的强大包容性和 Vim 的强大编辑效率, 我能想象到的最美好的事情 不外如此!

一个不写代码的产品, 使用 Spacemacs 的 Org mode 记录日常时间和项目的折腾之旅, 就 这样开始了:

安装 Org-mode

Org 现在已经是 Emacs 出厂自带的一部分了,所以只要你现在打开 Emacs 就可以直接使用 Org. 但如果你不想使用 Emacs 自带的 Org 版本,想安装一个更新版本,你可以有三种办 法来实现:

  1. 使用 Emacs package system

    M-x package-install RET org
    

    这种安装方法,安装的org版本,需要看你配置源中对应的版本,而且安装时需要确保没 有org相关函数装载,不推荐使用。

  2. 把新版 Org 下载到本地

    Org 官网 有最新版本的压缩包可下载到本地,然后只需要将解压后的目录加到 load-path变量即可。

    (add-to-list 'load-path "~/path/to/orgdir/lisp")
    

    目前我使用的就是这个办法,并将解压后的目录放到了iCloud中,多端同步就直接到位 了。

  3. 使用 Org 的 git 仓库

    $ git clone https://code.orgmode.org/bzg/org-mode.git
    
    $ cd org-mode/
    
    $ make autoloads
    

    时刻与最新版本保持同步,很容易配置出问题。为了稳定起见,目前没采用这个办法。

不管你选择哪个方式,安装成功后,每当你打开 .org 后缀的文件时,Emacs 默认会使用 Org mode。

效率管理的原子 : Task

State : 任务的状态变更

在效率管理的过程中,我们的原始对象始终是一项具体的事项,这个事项在不同的软件中有 不同的称呼,我统一使用 任务(Task) 来称呼它。

在 Org 中,对应的专业名词叫 Headline , 如果一行文本是以一个或多个「*」开头, 空 格后跟一段文本,那么这一行就是 Headline ,那段文本就是我们想要定义的某个具体任务。

而一个任务的子任务,在Org中的表示方式很简单,在任务下方新起一行,并比该任务多一 个「*」即可。子任务的子任务怎么表示,同样方法,在子任务下方再多一个「*」开头的任 务就好了。

2018-09-07_12-21-11.png

看着上面的例子,有没有感觉到不舒服?这么多星星符号罗列在一起感觉很乱,Org 有一个 缩进模式,当打开后,每个Headline只显示一个星星符号,同时会按照所属层级进行适当地 缩进. 另外,一直看着一个星星符号也太无聊了,我们可以自定义每个层级显示的符号:

;; 打开org-indent mode
(setq org-startup-indented t)

;; 设置bullet list
(setq org-bullets-bullet-list '("☰" "☷" "☯" "☭"))

配置上面那行代码后,显示效果如下:

2018-09-07_12-25-06.png

样式调整好看些了,我们使用一下看看。一个任务写了一段相关文本后,想开始新的一个任 务,那么之前的任务就不是当前的重点了,一般的编辑器都是滑动鼠标,把当前新的任务滚 动到屏幕中间之类的操作;而在Org中,我们可以轻轻按一下TAB,之前的任务连带它下面的 文本会折叠成一行,不占用宝贵的屏幕空间。 后面如果想查看这个任务下的内容,移动到 该任务,再按下TAB即可展开。

当你使用了一段时间,一个任务已经完成了,这时候怎么标识待做任务和已完成任务?org 有个变量可以指定任务状态的标识文字,当然最简单的就是直接使用 todo/done 之类的了, 但你也可以按自己的需要去设置,比如待做、进行中、稍后再做、交另人做、已完成等。

;; 设置todo keywords
(setq org-todo-keywords
      '((sequence "TODO" "HAND" "|" "DONE")))

你如果要变更某个任务的状态,只需要把光标定位到该任务,并按下C-c C-t,就会按你设 定的状态文案去变更状态,重复按,即会顺序变更状态。(在Spacemacs中,只需要按t即可)

只是显示一个TODO,好像也不是太漂亮。可以针对这些状态关键词设置单独的前景色和背景 色,突出下显示效果:

;; 调试好久的颜色,效果超赞! todo keywords 增加背景色
(setf org-todo-keyword-faces '(("TODO" . (:foreground "white" :background "#95A5A6"   :weight bold))
                                ("HAND" . (:foreground "white" :background "#2E8B57"  :weight bold))
                                ("DONE" . (:foreground "white" :background "#3498DB" :weight bold))))

让我们看看现在的显示效果:

2018-09-07_12-26-04.png

Capture : 如何快速记录任务

有了漂亮的任务列表和状态显示效果, 但每次添加任务都需要手动打开 org 文件, 找到相 应位置一条条的录入任务. 这种重复操作经常打断本来正在执行的操作, Emacs 通过 Org Capture 解决了这个问题. 它既可以支持在任意文件随时记录任务或想法, 同时也支持将添 加的任务到指定文件的指定位置.

使用它更是简单, 首先是配置一下唤醒该功能的快捷键和添加任务的默认文件:

;; 设置全局快捷键, 方便随时使用这个功能
(global-set-key (kbd "C-c c") 'org-capture)

;; 我使用的 Spacemacs , 实际使用的是下面的快捷键
(evil-leader/set-key "oc" 'org-capture)

;; 设置默认情况下, 添加的任务到哪个文件中
(setq org-default-notes-file "/Users/ljg/Library/Mobile Documents/com~apple~CloudDocs/org/gtd.org")

该功能默认已经有一个模板可以使用, 但一般每个人都会根据自己的实际使用情况定制自己 的模板. 定制模板说简单也简单, 说复杂也可以很复杂, 简单来说, 只需要查阅变量 org-capture-templates 的说明文档, 设置一下这个变量就可以了, 比如下面这样:

;; configure org-capture templates
(setq org-capture-templates
      '(("t" ; hotkey
         "Todo list item" ; name
         entry ; type
         ; heading type and title
         (file+headline org-default-notes-file "Tasks")
         "* TODO %?\n  %i\n  %a") ; template
        ...))

说复杂的话, 设置不同模板的字段可以各种个性化, 比如可以在插入任务的同时 插入当地 天气 , 或者 各种场景 , 甚至有人可以把这功能集成到 桌面托盘位置 .

Archive : 归档历史任务

随着任务记录越来越多, 历史上已完成的任务如果一直累积在任务文件中, 文件会越来越大, 也会影响搜索结果和速度. 解决这个问题可以使用归档功能, 把已完成的任务归档到指定文 件中, 这样任务文件持续保持精简, 同时历史已完成任务还不会丢弃, 有需要时可随时搜索 查看归档文档.

;; 在 Spacemacs 中设置归档命令的快捷键
(evil-leader/set-key "od" 'org-archive-subtree)

Emacs 默认会在任务文档当前目录生成一个后缀为 _archive 的同名文件做为归档文件. 当 然你也可以指定你想要的归档目录和文件名称:

;; 配置归档文件的名称和Headline格式
(setq org-archive-location "%s_archive::date-tree")

上面配置的完整释义可以参看 org-archive-location 的帮助手册, 配置后的归档文件中的 显示效果如下:

2018-09-07_18-01-34.png

任务的分子: Meta-data

Time Clocking : 记录任务用时

除了可以根据任务的状态变更进行管理之外, Emacs 还支持对任务进行时间管理. 在 Emacs 中, 一切都是 纯文本 (Plain text) , 时间的表示, 在 Emacs 中也不过就是一串字符串而 已, 只是有很多相关的函数来解析这个指定格式的字符串, 提供了超级强大的时间管理的功 能.

我个人最常用的记录时间的操作是在某项任务开始时 Clock-in (快捷键 ,I ) 结束时 Clock-out (快捷键 ,O ). 这样一项任务就有了清晰的一段时间记录, 如果过了一阵子又投 入时间在这项任务, 同样 Clock-in 就好, Org 支持一个任务记录多条时间段.

2018-09-07_18-34-16.png

在日常GTD过程中, 还经常会有的需求是给某一任务设定 Deadline (org-deadline ,d) 或 Schedule (org-schedule ,s) .

当然, 还会有些 Routine 的任务, 比如每周一上午10点开例会, 每周五下午6点发周报等, 这种定期任务的设定, 可以先设置一个Schedule, 然后在时间字符串后面添加 +1d (每一 天循环) / +2w (每两周循环) / +3m (每三个月循环) / +1y (每一年循环):

2018-09-10_16-10-08.png

Time Reporting: 时间都去哪儿了

我们已经在每个任务开始和结果时都打了时间戳, 那生成一个时间花费的报表应该也不在话 下了. 通过调用 org-clock-report 命令, 可以生成下面的这种样式的 time table, 看看 你之前的时间都花在哪了, 生成表格相关参数的修改, 可以参考 官方文档:

2018-09-13_17-28-41.png

Tags : 换个角度看世界

使用时间久了之后, 历史任务积累了很多. 想筛选或查找某个任务, 只能靠印象中任务标题 中的文本来查找, 很低效. Org 支持在 Headline 上添加 Tags , 这样可以将标记了某个或 某些tags的任务全找出来. 而添加Tags的方法也很简单, 只需调用 org-set-tags-command 快捷键 C-c C-c (Spacemacs中 ,,) , 就会在当前 Headline 后面添加你指定的tags. 显示 样式为前后冒号分隔, 比如 :work: , 基本用法就这一个命令就够了, 如果有更深入的使用 需求, 读下 官方文档 就好了.

Properties: 再换个角度看看

使用tags已经可以解决一部分筛选查找历史任务的问题了, 但如果你想针对某一个任务做些 类似数据库似的字段存储, 比如你记录了吃过的五星级餐厅的列表, 想针对每个餐厅单独记 录其地址/联系电话/特色菜/个人评价 等, 把这些全放到tags中, 显示不合适. 这时候就适 合使用 Properties 了. 插入 Property 需要调用 org-set-property 命令. Property 是 key-value 形式出现, 调用命令后会提示你输入key和value, 显示时一个Property占一行.

2018-09-10_16-02-31.png

各种脚手脚

Tables : 其实我也能当 Excel 使

在文本中当然也少不了记录表格的需求, 比如做会议纪要, 时间/地点/人员/主题/结论/后 续安排 这些内容通过表格整理记录就会很方便. 在 Org 中, 只要以 | 开头的一行, 就认 为它是表格的一部分了. 表格中各单元格的区分符号也是 | , 每次你输入完一个单元格, 可以通过 TAB 切换到下一单元格, 通过 RET 切换到下一行. 日常的基本表格操作, 这些功 能已经足够用的了. 想了解细节, 可以阅读下官方文档 . Org 中的表格大概长下面这样:

2018-09-13_17-15-56.png

补充两个让人对 Org 表格功能很爽的小细节:

  1. 切换单元格 (TAB/RET/C-c C-c) , Org 会自动根据单元格内容进行宽度调整
  2. |- 开头的, 按下TAB, 即可插入一行分隔线.

基本的表格功能, 已经足够日常使用了, 但 Org 的强大远不止于此.

如果你想把它当作Excel来使用, 可以参看 这篇文章 , 如果你想通过表格中的数据来画图, 可以参看 这篇文章 .

TODO Hypelinks: 把我当浏览器使也可以

TODO Export : 分享给不使用 Orgmode 的人