emacs org mode 中的标签全参考

把交叉的信息关联起来的最好的方式就是打标签。 emacs 的 org 模式对标签的支持非常强大。

每一个标题都可以在最后包含标签列表。标签由字母、数字、'_' 和 '@' 组成。标签的前后必需有一个冒号,比如 ':work:' 。也可以像 ':work:urgent:' 这样声明多个标签。标签默认情况下是加粗的,并且和标题拥有一样的颜色。可以通过 org-tag-face 为特定的标签指定不同的样式。

标签继承

标签使用和标题一样的继承结构。如果一个标题有标签,那么这个标题的所有子标题都拥有这个标签。如下面的列表所示:

 * Meeting with the French group :work:
 ** Summary by Frank             :boss:notes:
 *** TODO prepare slides for him :action:

虽然最后的标题没有声明任何标签,但通过继承,仍然拥有这些标签 ':work:', ':boss:', ':notes:', ':action:'。也可以用一个包围整个文件有最高级别的标签来为所有的标题设置一个公共的父标签。如下所示:

#+FILETAGS: :Peter:Boss:Secret:

此外,要限定 标签 不能继承自特定的标签时,可以通过  org-tags-exclude-from-inheritance 设置。要完全关闭标签继承的话,要用 org-use-tag-inheritance

如果打开标签继承,在进行标签搜索时,如果匹配到了一个标题,那么这个标题树下的所有标题都会匹配上。搜索出的列表可能会非常长。如果你仅仅想看匹配到的第一个标题的话,需要配置 org-tags-match-list-sublevels

不管是在 tags 还是 tags-todo 议程中,通过标签进行议程搜索时,标签继承都很有意义。在其它的议程类型中, org-use-tag-inheritance 不起作用。然而,你可能希望标签继承在议程中能够正确设置,这样能够通过标签进行过滤。设置 org-agenda-use-tag-inheritance 可以控制这一功能:默认值包括所有的议程类型,但是将这个变量设置为 nil 可以在很大程度上加快议程的生成速度。

设置标签

可以直接在标题的最后输入标签。在输入冒号后,M-TAG 提供了标签的自动补全和选择功能。也有一个特定的快捷键来插入标签:

C-c C-q                             org-set-tags-command
为当前的标题输入新的标签。Org 模式会提供自动完成或一个特定的单键界面来设置标签,具体看下面的说明。在输入 RET 后,会为当前标题插入标签并齐到 org-tags-column. 当输入一个 C-u 前缀时,当前缓冲区中的所有标签都会对齐到这一列,仅仅是看上去比对整齐,并且 TODO 的状态也会发生变更(参见[[TODO%20Basics][TODO 基础]])。
    
C-c C-c                             org-set-tags-command
当光标在标题上是,作用和 C-c C-q 相同
    
Org 支持根据标签列表来插入标签。默认情况下,这个列表动态创建,包含当前缓冲中的所有标签。你也可以通过变量 org-tag-alist 来创建一个全局的标签列表。最后你可以通过下面的形式为一个文件设置默认的标签:

#+TAGS: @work @home @tennisclus
#+TAGS: laptop car pc sailboat

如果你已经用 org-tag-alist 定义了喜欢的全局标签, 但又想在一个特定的文件中使用动态标签,那么可以通过添加一个空的 TAGS 选项到这个文件来达到这个目的:

#+TAGS

如果你想将预定义的全局标签添加到每一个文件的 TAGS 选项中,那么可以用 org-tag-persistent-alist 定义一个标签列表。这个选项可以在文件中通过 STARTUP 选项来关闭:

#+STARTUP: noptag

默认情况下,org 模式使用标准的 minibuffer  来输入标签 。然而,emacs 还提供了另外一种叫做 fast tag selection 的快速标签选择方式。在这种方式下可以仅用一个键来完成标签的选择和反选。要想使用这种方式,首先要为常使用的标签分配一个唯一字符。这个字符可以在 '.emacs' 中通过配置 org-tag-alist 来设置。比如,需要在很多文件中为很多项添加 ':home:' 标签。在这种情况下,可以这样设置:

(setq org-tag-alist '(("@work" . ?w) ("@home" . ? h ) ("@laptop" . ?l)))

如果标签仅仅和当前使用的文件相关,那么可以像下面这样在文件中添加 TAGS 选项:

#+TAGS: @work(w) @home(h) @tennisclub(t) laptop(l) pc(p)

标签接口会在一个 splash windows 中显示可用的标签。如果想在一个特定的标签后换行,需要在标签列表中插入一个 '\n' 。

#+TAGS: @work(w) @home(h) @tennisclub(t) \n laptop(l) pc(p)

或者将他们写成两行

#+TAGS: @work(w) @home(h) @tennisclub(t)
#+TAGS: laptop(l) pc(p)

也可以像下面这样用大(花)括号手动将标签进行分组

#+TAGS: { @work(w) @home(h) @tennisclub(t) } laptop(l) pc(p)

在这种情况下,@work(w) @home(h) @tennisclub(t) 三个标签最多同时选择一个

org 允许多个分组。

当光标在这些行上的时候,不要忘了按 C-c C-c 来激活其它修改。

如果要在 org-tags-alist 中设置排它的标签组,必需要用 :startgroup:endgroup 标签对,而不是用大括号。类似的,可以用 :newline 来声明一个新行。上面的例子也可以用下面的方式进行设置:

(setq org-tag-alist '((:startgroup . nil)
                      ("@work" . ?w) ("@home" . ?h)
                      ("@tennisclub" . ?t)
                      (:endgroup . nil)
                      ("laptop" . ?l) ("pc" . ?p))

如果至少为一个标签定义了快捷键,按 C-c C-c 时会展示一个特殊的界面,其中列出了当前标题已经继承了的标签,还包含一个可选的标签列表。这个界面提供了下面的快捷键:

  • a-z...       按这些键时会将对应的标签添加到当前的标题列表中或从当前的标题列表中移除。选择一个具体排它性的标签组时,会将标签组的其它标签移除。
  • TAB        在迷你缓冲区中输入一个标签,即使这个标签不在预定义的标签列表中。对于缓冲区内的标签,提供了自动完成。当然也可以一次添加多个标签,只要把他们用冒号 ':' 分开。
  • SPC         清除这行的所有标签。
  • RET         确认修改
  • C-g         取消修改
  • q            如果 /q/ 不是某一个标签的快捷键的话,效果和 *C-g* 相同。
  • !            关闭组的排它性。这样就可以分配一个组的多个标签。
  • C-c        在下次修改后(参见下面的详细说明),切换 *auto-exit* 。如果是在专家模式下,第一个 *C-c* 会提供一个窗口。

在这种方式下,仅需要很少的几个键就可以为标题设置上标签。根据上面的设置,清除掉当前的标签并设置 '@home','laptop' 和 'pc' 等几个标签的话,仅需要下面的按键: C-c C-c SPC h l p RET 。从 '@home' 切换到 '@work' 仅需要 C-c C-c w RET 或者 C-c C-c C-c w 。要添加非预定义的标签 'Sarah' 话,按键顺序是 C-c C-c TAB S a r a h RET RET

如果你发现在大部分时候,仅仅需要一个键去修改标签列表,那么可以设置 org-fast-tag-select-single-key 参数。这样就不用按回车来退出快速标签选择了——它会在第一次修改立刻退出。如果在个别情况下需要多个按键,按 C-c 为当前的标签选择关闭 auto-exit (实际上是用 C-c C-c C-c 开始了选择而不是 C-c C-c )。如果将这个变量的值设置为 expert 那么除了多按一个 C-c 时,一般情况下在单键输入标签时选择窗口根本不会出现。

标签组

在一个排它的标签内,第一个标签可以定义为 组标签 。当你搜索一个组标签的时候,会返回匹配组内任意一个标签的所有项。在议程视图中,通过组标签进行过滤时,会展示至少包含一个组内一个标签的标题。这为标签搜索和过滤提供了很大的灵活性。

在标签组内,可以通过在组标签和其它标签间添加冒号来设置组标签——注意,所有的空格都不能省,这样 *Org* 才能正确的解析。比如:

#+TAGS: { @read : @read_book @read_ebook }

在这个例子中,@read 是标签集合 @read @read_book @read_ebook 的组标签。

也可以在设置 org-tag-alist 的时候直接通过 :grouptags 关键字设置组标签,比如:

(setq org-tag-alist '((:startgroup . nil)
                      ("@read" . nil)
                      (:grouptags . nil)
                      ("@read_book" . nil)
                      ("@read_ebook" . nil)
                      (:endgroup . nil))

组标签不能嵌套也不能是其它标签组的标签。

如果想临时的忽略组标签,切换变量 org-toggle-tags-groups, 对应的快捷键 C-c C-x q 。如果想完全禁用标签组,设置 org-group-tags 为空。

标签搜索 

一旦建立好了标签系统,就能够把标签相关的信息收集到一个特殊的列表中。

C-c / m 或 C-c \\                                 org-match-sparse-tree
创建一个包含搜索的标签的简要标题树。 有 C-u 前缀时,忽略不是 TODO 的标题栏。

C-c a m                                           org-tags-view
创建一个在所有议程文件中符合搜索的标签的标题列表。参见 [[Matching tags and properties]]

C-c a M                                           org-tags-view
创建一个在所有议程文件中符合搜索的标签的标题列表,但是仅仅检查 TODO 项并且强制检查子标题(见 org-tags-match-list-sublevels )。

这些命令都会提示一个搜索字符串,并且允许常见的逻辑操作,比如 '+boss+urgent-project1' 会查找包含 'boss' 和 'urgent' 但不包含 'project1' 的标题,又比如 'Kathy|Sally' 会查找包含 'Kathy' 或 'Sally' 的标题。搜索字符串支持非常多的格式,并且允许根据 TODO 关键字、标题级别和属性等进行过滤。[[Matching tags and properties]] 有很多的例子和说明。


posted @ 2015-04-09 22:28  咖啡加茶  阅读(6099)  评论(7编辑  收藏  举报