玩转org-mode refile

refile是org-mode一个非常强大的工具,它实现了移动headline的自动化。

所谓自动化,就是无需下述手工操作:

  1. 剪切某条headline及其相关内容;
  2. 移动到目标位置;
  3. 粘贴并调整headline的层级(level)。

而是在该headline上执行C-c C-w,在minibuffer上选择移动目标,即可。

缺省情况,当前文件的所有level 1的headline作为移动目标供选择,如果需要更加灵活的选择移动目标,可以配置org-refile-targets变量。org-refile-targets的值是a list of cons cells,每个cons cell指定一种移动目标,所有cons cells指定的移动目标的合集,就是全部可供选择的移动目标。org-refile-targets的默认值为nil,效果与下面的配置相同。

(setq org-refile-targets '((nil . (:level . 1))))

在我的org-mode配置中,一般的TODO通常作为level 2的headline存在,但是对于相关度很高的一组TODO,会归并到一个level 2的PROJECT下,作为level 3的headline存在。通过配置org-capture-templates可以方便快速地创建TODO或者PROJECT,但是如果想把TODO直接加入某个PROJECT,而不是作为通常的level 2的headline,则需要如下配置:

(setq org-refile-targets
      '((nil . (:level . 1))
        (nil . (:todo . "PROJECT"))))

nil表示只考虑当前文件的level 1的headline或者PROJECT

如果想refile到其它文件,可以用一个变量(它的值是一个文件名列表)替代nil。如:

(setq org-refile-targets
      '((wl-org-code-comment-files . (:level . 1))
        (nil . (:level . 1))
        (nil . (:todo . "PROJECT"))))

更详细的配制方法参见org-refile-targets的帮助注释。

使用org-capture记录密码

org-capture是orgmode的最新特性之一,它试图取代org-remember,成为快速记录的利器。

org-capture(包括org-remember)的目的,是通过事先定义记录信息的位置、格式,使得我们在记录时专注于内容本身,而不是其形式。由于记录信息不再需要一系列繁琐的步骤,记录速度得到极大的提升,工作流程也不会被严重打断。

org-capture与org-remember的功能并非完全相同,下面两幅图展示了操作界面的不同。

另外一个不同是,org-remember只能记录headline,而org-capture则提供多种形式以供选择,具体参见作者的详细描述

我目前使用org table来保存用户名密码信息(并使用GPG加密),由于文件中还存有其它信息,定位表格的步骤比较无聊。而利用org-capture添加表格行的功能,极大地减轻了操作负担。配置如下(假设表格位于Web accounts这个headline之下):

;; org-capture
(define-key global-map [(f8)] 'org-capture)

(setq org-capture-templates
      `(("t" "Todo" entry (file+headline "~/gtd/todo.org" "Tasks")
         "* TODO %?\n  %i" :prepend t)

        ("n" "Note" entry (file+headline "~/gtd/notes.org" "Notes")
         "* %U %?\n\n  %i" :prepend t :empty-lines 1)

        ;; ...

        ("a" "Account" table-line
         (file+headline "~/.account.org.gpg" "Web accounts")
         "| %? | | %a | %U |")))

最后一项就是用来记录用户名和密码的,快捷键为F8 a,其中链接和创建时间可以自动填充。下图是记录Quora注册信息的例子,最后一行是自动添加的(倒数第二行的Quora注册信息是之前记录的)。

在记录信息时,org-capture使用indirect buffer,而org-remember则使用单独的buffer,这个不同很重要。前者相当于直接在源文件上修改,内容不会丢失,所以能够在一次capture过程没有结束时再一次调用capture;org-remember则做不到这一点。

org-remember的优点是撤销操作(C-c C-k)很容易,只要将记录信息的buffer杀掉就可以了;而org-capture则在某些情况下无法完美撤销,需要手工操作,比如自动添加的表格行就不得不手工删除。作者声称这不是一个bug