Org-mode手册

org-mode我用了两年,却未曾深入。 最近两周静下心来,仔仔细细的钻研了一番,深深被这厮震撼到了,作为文档编辑工作,在我的认知范围里,无出其右。 归纳整理于此,以作留存,馈与日后。

<!– more –>

1 文档结构

1.1 标题

Org 是在大纲模式之上实现的。 大纲模式可以让我们用层次结构来组织文档,这(至少对我来说)是笔记和想法的最好实现方式。 这种结构可以折叠(隐藏)文档的一部分而只显示文档的大概结构或者只显示我们正在处理的部分。 Org 大大简化了大纲模式的使用,它把大纲模式的整个显示/隐藏功能整合到了一个命令中:org-cycle,这个命令绑定到了TAB键上。

标题定义了大纲树的结构,以处于一行左边缘的一个或多个星号开头,如下:

* Top level headline
** Second level
*** 3rd level
     some text
** 3rd level
     more text
, Another top level headline

1.1.1 视图命令

Table 1: 视图命令
Key Desc Command
TAB 子树循环,在下列状态之间转换当前子树: _,->folded->children->subtree–._ org-cycle
S-TAB 全局循环, 在下列状态之间转换当前的整个buffer: _,->overview->contents->show all–._ org-global-cycle
C-c C-r 显示当前位置的上下文,展示当前条目,紧跟的标题和标题的层次结构。 适用于通过稀疏树命令或议程命令展露出来的位置附近工作。 org-reveal
C-c C-k 展开子树的所有标题,CONTENT视图只有一个子树。 outline-show-branches
C-c TAB 展开子树的所有直接子节点。 outline-show-children
C-c C-x b 在间接缓冲区中显示当前子树 org-tree-to-indirect-buffer
C-c C-x v 将区域中的可见文字复制到 kill ring. org-copy-visible

org-mode默认的视图模式是'OVERVIEW',即概览模式,只有顶层的标题可见。 你可以通过配置变量 org-startup-folded 来改变视图模式,如下:

1
2
(setq org-startup-folded 'content)
(setq org-catch-invisible-edits nil) ;; prevent editing an invisible part of the bu↵er

当然你也可以为每个文件指定视图模式,只要在文件buffer中任意位置包含以下语句(推荐配置在文件头):

#+STARTUP: overview
#+STARTUP: content
#+STARTUP: showall
#+STARTUP: showeverything

更进一步,任何条目都包含 VISIBILITY 属性,此属性定义了条目的视图模式,覆盖一般性设置。可接受的值为: folded children content all, 示例如下

#+STARTUP: overview
* A
:PROPERTIES:
:VISIBILITY: all
:END:

1.1.2 跳转命令

Table 2: 标题跳转命令
Key Desc Command
C-c C-n 跳转到下一个标题 org-next-visible-heading
C-c C-p 跳转到上一个标题 org-previous-visible-heading
C-c C-f 跳转到下一个同级标题 org-forward-same-level
C-c C-b 跳转到上一个同级标题 org-backward-same-level
C-c C-u 跳回更高一级的标题 outline-up-heading
C-c C-j 跳转到别处,不改变当前的视图模式,创建一个临时buffer来展示当前文档 org-goto

C-c C-j 触发的临时buffer中,可用的命令如下:

TAB      Cycle visibility.
down/up  Next/previous visible headline.
RET      Select this location.
/        Do a Sparse-tree search

若是关闭了 org-goto-auto-isearch ,以下命令可用:

n/p      Next/previous visible headline.
f/b      Next/previous headline same level.
u        One level up.
0-9      数字参数
q        退出

1.1.3 编辑命令

Table 3: 编辑命令
Key Desc Command
M-RET 插入一个同级标题在当前位置(行首,把当前行转成标题;行中,截断余下文本,在下一行生成标题) org-insert-heading
M-S-RET 在M-RET的基础上,添加了 TODO 标示 org-insert-todo-heading
C-RET 在当前子树的结束位置插入同级标题 org-insert-heading-respect-content
C-S-RET 在CRET的基础上,添加了 TODO 标示 org-insert-todo-heading-respect-content
TAB 用于还未输入文本信息的标题,第一个TAB变为之前标题的子标题,第二个TAB变为父标题,第三个TAB恢复原有等级 (,->children->parent->initial)) org-cycle
M-left 当前标题提升一个等级 org-do-promote
M-right 当前标题降低一个等级 org-do-demote
M-S-left 当前整个子树提升一个等级 org-promote-subtree
M-S-right 当前整个子树降低一个等级 org-demote-subtree
M-up 当前整个子树和前面同级子树交换位置 org-move-subtree-up
M-down 当前整个子树和后面同级子树交换位置 org-move-subtree-down
M-h Mark the element at point. org-mark-element
C-c @ Mark the subtree at point. 目前看起来是可视化选中当前子树 org-mark-subtree
C-c C-x C-w 剪切子树到 kill ring org-cut-subtree
C-c C-x M-w 拷贝子树到 kill ring org-copy-subtree
C-c C-x C-y kill ring 中粘贴子树 org-paste-subtree
C-y Depending on the options org-yank-adjusted-subtrees and org-yank- folded-subtrees, Org’s internal yank command will paste subtrees folded and in a clever way, using the same command as C-c C-x C-y. org-yank
C-c C-x c Clone a subtree by making a number of sibling copies of it. You will be prompted for the number of copies to make, and you can also specify if any timestamps in the entry should be shifted. org-clone-subtree-with-time-shift
C-c C-w 将条目或区域 refile 到不同的位置。 org-refile
C-c ^ 排序相同级别的条目。 org-sort
C-x n s 将缓冲区缩小到当前子树。 org-narrow-to-subtree
C-x n b 将缓冲区缩小到当前 block org-narrow-to-block
C-x n w 加宽缓冲区以消除变窄。 widen
C-c * 使正常的文本行变为标题,重复操作可恢复成原样 org-toggle-heading

1.1.4 稀疏树

一个很重要的特性就是org有能力为被选中的信息构造出稀疏树,使得被选中信息突出显示,无关信息折叠显示。实践才是检测真理的唯一标准,试一试就知道具体是怎样优化你的工作了。

Table 4: 稀疏树
Key Desc Command
C-c / 本命令会触发sparse-tress命令界面,提示输入字符,来选择创建稀疏树的命令 org-sparse-tree
C-c / r 创建出和正则表达式匹配的稀疏树;标题匹配,标题可见; body匹配, 标题和body都可见;所以匹配高亮,当当前buffer通过编辑命令发送改变时,高亮消失,当然你可以通过 C-c C-c 主动取消高亮。 org-occur
M-g n 跳转到下一个匹配 next-error
M-g p 跳转到上一个匹配 previous-error

很有可能需要频繁创建特定搜索条件的稀疏树,可通过 org-agenda-custom-commands 来定义快速访问的快捷键(这个命令可用在agenda dispatcher中)。 如下:

1
2
;; the key C-c a f as a shortcut for creating a sparse tree matching the string ‘FIXME’.
(setq org-agenda-custom-commands '(("f" occur-tree "FIXME")))

The other sparse tree commands select headings based on TODO keywords, tags, or properties and will be discussed later in this manual. To print a sparse tree, you can use the Emacs command ps-print-buffer-with-faces which does not print invisible parts of the document. Or you can use C-c C-e C-v to export only the visible part of the document and print the resulting file.

1.2 列表

Within an entry of the outline tree, hand-formatted lists can provide additional structure. They also provide a way to create lists of checkboxes. Org supports editing such lists, and every exporter can parse and format them.

在大纲树的组织结构中,自定义格式的列表可以提供更多的组织结构。使我们得到一个复先框列表。 Org 可以处理这种列表,同时各个 exporter 可以解析和格式化。 Org 可识别 ordered 列表, unordered 列表, 和 description 列表。

  • Unordered 的列表项以 ‘-’, ‘+’‘*’ 开始。
  • Ordered 的列表项以数字加在 ‘.’‘)’ 开始。格式如下:‘1.’ 或 ‘1)’。 可自定义起始值,在文本开始出插入[@20],代表以20开始。
  • Description 列表项其实就是 unordered 列表项, 只在文本中间插入了分隔符 ‘::’

同一个列表中项首行必须缩进一致。特别是 ordered 列表到了 ‘10.’ ,两位数字必须和其他数字左对齐。 若是下一行的缩进小于等于当前列表的缩进,则当前项终结。当所有项都终结,或者后面隔了两个空行时,列表终结。示例如下:

** Lord of the Rings
   My favorite scenes are (in this order)
   1. The attack of the Rohirrim
   2. Eowyn's fight with the witch king
       + this was already my favorite scene in the book
       + I really like Miranda Otto.
   Important actors in this film are:
   - Elijah Wood :: He plays Frodo
   - Sean Austin :: He plays Sam, Frodo's friend.

Org supports these lists by tuning filling and wrapping commands to deal with them correctly, and by exporting them properly. Since indentation is what governs the structure of these lists, many structural constructs like #+BEGIN_... blocks can be indented to signal that they belong to a particular item.

If you find that using a different bullet for a sub-list (than that used for the current list-level) improves readability, customize the variable org-list-demote-modify-bullet. To get a greater difference of indentation between items and their sub-items, customize org-list-indent-offset.

The following commands act on items when the cursor is in the first line of an item (the line with the bullet or number). Some of them imply the application of automatic rules to keep list structure intact. If some of these actions get in your way, configure org-list-automatic-rules to disable them individually.

当光标位于一项的首行时(带有项标志符的行),下面命令将作用于该项:

Table 5: 稀疏树
Key Desc Command
TAB 列表项像标题一样的被折叠,展开 org-cycle
TAB 用于还未输入文本信息的子项,第一个TAB变为子项,第二个TAB变为父项,第三个TAB恢复原有等级 (,->children->parent->initial)) org-cycle
M-RET 插入一个同级项(行首,把当前行转成列表项;行中,截断余下文本,在下一行生成列表项) org-insert-heading
M-S-RET 插入一个带 checkbox 的同级项(行为类似于M-RET)  
S-up/S-down 跳转到当前列表的上一项或者下一项  
M-up/M-down 和上一项或者下一项交换位置(同级之间)  
M-left/M-right 提升或者降低一项的等级,子项不变  
M-S-left/M-S-right 提升或者降低一项的等级,子项同等变化  
C-c C-c 当前项有 checkbox , 触发状态转换  
C-c - 循环改变将当前列表的项标志符  
C-c * 使列表项变为标题 (在当前位置生成子标题). org-toggle-heading
C-c C-* 使整个列表变成当前标题的子树 checkboxes 将变为 TODO 当未 unchecked  
S-left/right 循环改变将当前列表的项标志符  
C-c ^ Sort the plain list org-sort

1.3 Drawers

Sometimes you want to keep information associated with an entry, but you normally don’t want to see it. For this, Org mode has drawers. They can contain anything but a headline and another drawer.

You can interactively insert drawers at point by calling org-insert-drawer, which is bound to C-c C-x d. With an active region, this command will put the region inside the drawer. With a prefix argument, this command calls org-insert-property-drawer and add a property drawer right below the current headline. Completion over drawer keywords is also possible using M-TAB.

Visibility cycling on the headline will hide and show the entry, but keep the drawer collapsed to a single line. In order to look inside the drawer, you need to move the cursor to the drawer line and press TAB there. Org mode uses the PROPERTIES drawer for storing properties , and you can also arrange for state change notes and clock times to be stored in a drawer LOGBOOK. If you want to store a quick note in the LOGBOOK drawer, in a similar way to state changes, use C-c C-z Add a time-stamped note to the LOGBOOK drawer.

You can select the name of the drawers which should be exported with org-export-with-drawers. In that case, drawer contents will appear in export output. Property drawers are not affected by this variable: configure org-export-with-properties instead.

Drawers 如下所示:

** This is a headline
   Still outside the drawer
   :DRAWERNAME:
   This is inside the drawer.
   :END:
   After the drawer.

1.4

Org mode uses begin…end blocks for various purposes from including source code examples to capturing time logging information. These blocks can be folded and unfolded by pressing TAB in the begin line. You can also get all blocks folded at startup by configuring the option org-hide-block-startup or on a per-file basis by using

#+STARTUP: hideblocks
#+STARTUP: nohideblocks

1.5 脚注

A footnote is started by a footnote marker in square brackets in column 0, no indentation allowed. It ends at the next footnote definition, headline, or after two consecutive empty lines. The footnote reference is simply the marker in square brackets, inside text. Markers always start with fn:. For example:

The Org homepage[fn:1] now looks a lot better than it used to.
...
[fn:1] The link is: http://orgmode.org

Org mode extends the number-based syntax to named footnotes and optional inline definition. Here are the valid references:

[fn:name]
A named footnote reference, where name is a unique label word, or, for simplicity of automatic creation, a number.
[fn::This is the inline definition of this footnote]
A LATEX-like anonymous footnote where the definition is given directly at the reference point.
[fn:name:a definition]
An inline definition of a footnote, which also specifies a name for the note. Since Org allows multiple references to the same note, you can then use \[fn:name\] to create additional references.

Footnote labels can be created automatically, or you can create names yourself. This is handled by the variable org-footnote-auto-label and its corresponding #+STARTUP keywords. See the docstring of that variable for details.

示例如下: The Org homepage1 now looks a lot better than it used to.

Table 6: 脚注命令列表
Key Desc Command
C-c C-x f 当光标处于引用处时,跳转到它的定义;当光标处理定义处时,跳转到第一个引用处。其他情况下,新建一个脚注。当有前缀参数时,会提供一个菜单供选择操作,其中包括重新给脚注编号。 org-footnote-action
C-c C-c 当光标处于引用处时,跳转到它的定义;当光标处理定义处时,跳转到第一个引用处。当有前缀参数时,行为和 C-c C-x f 一样,提供同样操作菜单。  
C-c C-o 脚注标签也是指向相应定义/引用的链接,您可以使用常用(链接)命令来跟踪这些链接。 org-open-at-point
C-c ='= 在独立的窗口中,编辑引用关联的脚注定义。窗口可通过 C-c ='= 关闭 org-edit-special

C-c C-x f 命令加上附加前缀参数时(C-u C-c C-x f) ,一个操作菜单被提供:

s    Sort the footnote definitions by reference sequence.  During editing,
     Org makes no effort to sort footnote definitions into a particular
     sequence.  If you want them sorted, use this command, which will
     also move entries according to org-footnote-section.  Automatic
     sorting after each insertion/deletion can be configured using the
     option org-footnote-auto-adjust.
r    Renumber the simple fn:N footnotes.  Automatic renumbering
     after each insertion/deletion can be configured using the option
     org-footnote-auto-adjust.
S    Short for first r, then s action.
n    Normalize the footnotes by collecting all definitions (including
     inline definitions) into a special section, and then numbering them
     in sequence.  The references will then also be numbers.
d    Delete the footnote at point, and all definitions of and references
     to it.

1.6 The Orgstruct minor mode

If you like the intuitive way the Org mode structure editing and list formatting works, you might want to use these commands in other modes like Text mode or Mail mode as well. The minor mode orgstruct-mode makes this possible. Toggle the mode with M-x orgstruct-mode RET, or turn it on by default, for example in Message mode, with one of:

1
2
(add-hook 'message-mode-hook 'turn-on-orgstruct)
(add-hook 'message-mode-hook 'turn-on-orgstruct++)

1.7 Org 的语法

A reference document providing a formal description of Org’s syntax is available as a draft on Worg, written and maintained by Nicolas Goaziou. It defines Org’s core internal concepts such as headlines, sections, affiliated keywords, (greater) elements and objects. Each part of an Org file falls into one of the categories above.

To explore the abstract structure of an Org buffer, run this in a buffer:

M-: (org-element-parse-buffer) RET

It will output a list containing the bu↵er’s content represented as an abstract structure. The export engine relies on the information stored in this list. Most interactive commands (e.g., for structure editing) also rely on the syntactic meaning of the surrounding context.

You can check syntax in your documents using org-lint command.

2 表格

Org 提供了一个快速直观的表编辑器。 使用 Emacs 内嵌的 calc 的包可支持类似于制表软件的操作。

2.1 内置表编辑器

Org 能够很容易地格式化 ASCII 文本表格。 任何把'|'作为首个非空白字符的行都被视为表的一部分。 '|'也是列分隔符。 表如下所示:

名字 手机号 年龄
brantou 170xxxxxxxx 18

在表格内键入 TAB , RETC-c C-c 时,表格都会自动重新对齐。 TAB 也可以移动到下一个表格区域( RET 进入下一行),并在表的末尾或水平线之前创建新的表行。 表的缩进由第一行设置。 以"|-"开头的任何行都被视为水平分隔符行,并在下一个重新对齐时展开。所以,要创建上面的表,你只需要键入

| 名字 | 手机号 | 年龄 |
|-

然后按 TAB 扩展表格。 更快的是键入 |名称|手机号|年龄 后, 再键入 C-c RET

在表格区域中输入文本时,Org以特殊方式处理DEL,Backspace和所有字符键,以便插入和删除避免移动其他字段。 此外,当使用TAB,S-TAB或RET将光标移动到新的表格区域后会自动填充空格。 如果这种行为对您太不可预测,请配置选项 org-enable-table-editororg-table-auto-blank-field

2.1.1 创建和转换

=C-c= =|=                 ~org-table-create-or-convert-from-region~

将活动区域转换为表。 如果每行包含至少一个TAB字符,则认为 TAB 是分隔符。 如果每一行都包含逗号,则逗号作为分隔(CSV)。 如果不是,则将行以空格为分隔符。 您可以使用前缀参数强制指定分隔符: C-u 强制CSV, C-u C-u 强制TAB, C-u C-u C=u 将提示正则表达式匹配分隔符,数值参数N表示至少N个连续空格,或者 一个TAB将是分隔符。 如果没有活动区域,此命令将创建一个空的组织表。

2.1.2 调整和区域移动

Key Description Command
C-c C-c 重新对齐表格,不移动到其他字段。 org-table-align
C-c SPC 使用空格填充当前区域 org-table-blank-field
<TAB> 重新对齐表格,移动到下一区域。 如有必要,创建一个新行。 org-table-next-field
S-TAB 重新对齐,移动到上一区域。 org-table-previous-field
RET 重新对齐表格并向下移动到下一行。 如有必要,创建一个新行。 org-table-next-row
M-a 移动到当前表区域的开头,或移动到上一个区域。 org-table-beginning-of-field
M-e 移动到当前表区域的结尾,或移动到上一个区域。 org-table-end-of-field

2.1.3 列和行编辑

Key Description Command
M-left \ M-right 向左/向右移动当前列 org-table-move-column-left\right
M-S-left 删除当前列 org-table-delete-column
M-S-right 在光标位置的左侧插入一个新列 org-table-insert-column
M-up \ M-down 向上/向下移动当前行 org-table-move-row-up\down
M-S-up 删除当前行或水平分隔线 org-table-kill-row
M-S-down 在当前行上方插入新行。 使用前缀参数,该行在当前行下创建 org-table-insert-row
C-c - 在当前行下插入水平线。 使用前缀参数,在当前行之上创建 org-table-insert-hline
C-c RET 在当前行下插入水平线,将光标移动到该线下面的行 org-table-hline-and-move
C-c ^ 对区域中的表行进行排序 org-table-sort-lines

2.1.4 区域

Key Description Command
C-c C-x M-w 将矩形区域从表复制到特殊剪贴板。 点和标记确定矩形的边缘字段。 如果没有活动区域,只复制当前字段。 该过程忽略水平分隔线。 org-table-copy-region
C-c C-x C-w 将矩形区域从表格复制到特殊剪贴板,并将矩形中的所有字段都留空。 所以这是“剪切”操作。 org-table-cut-region
C-c C-x C-y 将矩形区域粘贴到表中。 左上角在当前字段中结束。 所有涉及的字段将被覆盖。 如果矩形不适合当前表格,则根据需要放大表格。 该过程忽略水平分隔线。 org-table-paste-rectangle
M-RET 在光标位置分割当前字段,并将其余部分移动到下面的行。 如果存在活动区域,并且点和标记都在同一列中,则列中的文本将包装为给定行数的最小宽度。 数字前缀参数可用于更改所需行的数量。 如果没有区域,但您指定了前缀参数,则将当前字段设置为空,并将内容追加到上面的字段。 org-table-wrap-region

2.1.5 计算

Key Description Command
C-c + 将当前列中的数字或由活动区域定义的矩形中的数字相加。 结果显示在echo区域中,可以用C-y插入。 org-table-sum
S-RET 当前字段为空时,从上面的第一个非空区域复制。 当不为空时,将当前区域复制到下一行,并将光标与其一起移动。 org-table-copy-down

2.1.6 杂项

Key Description Command
C-c ` 在单独的窗口中编辑当前区域。 这对于不完全可见的区域很有用。当使用C-u前缀调用时,仅仅使整个字段可见,以便可以在当前位置编辑 。 当使用两个C-u前缀调用时,使编辑器窗口跟随光标在表移动,并始终显示光标所在区域。 当光标离开表时,或者当您用C-u C-u C-c`重复此命令时,跟随模式将自动退出。 org-table-edit-field
M-x org-table-import RET 将文件作为表导入。 表格应该是TAB或空格分隔。 org-table-import
C-c \vert 也可以通过将表格文本粘贴到 Org buffer,使用 C-x C-x 选择粘贴的文本,然后使用C-c | 命令(请参阅上面的创建和转换)。 org-table-create-or-convert-from-region
M-x org-table-export RET 导出表,默认情况下作为 TAB 分隔的文件。 用于与例如电子表格或数据库程序进行数据交换。 用于导出文件的格式可以在选项 org-table-export-default-format 中配置。 您还可以使用属性 TABLEEXPORTFILETABLEEXPORT_ FORMAT 来指定子树中的表导出的文件名和格式。 Org支持导出表格的相当一般格式。 org-table-export

你可能因为‘|’开始的行,妨碍到你,而不喜欢自动表编辑器,你可以用下面的语句来关闭

(setq org-enable-table-editor nil)

然后唯一的表命令 C-c C-c 仍然工作, 做一个手动重新对齐。

2.2 列宽和对齐

列的宽度由表编辑器自动确定。 并且还可以从列中包含的数据类型(数字或者非数字)自动确定列的对齐方式。 有时一个区域或几个区域需要包含很多文本信息,会导致信息展示和编辑的诸多不便。 或者你想设定固定宽度的几列,而不管内容如何。 要设置列的宽度,列中任何位置的一个字段可能只包含字符串“N”,其中“N”是指定列的宽度(以字符为单位)的整数。 接下来重新对齐,然后将此列的宽度设置为此值。

<img src="/images/table-column-width.jpg" />

设定固定宽度后,长文本将会裁剪展示,多余部分用字符串 => 来替代展示。 要查看全文,请将鼠标悬停在该字段上—工具提示窗口(tool-tip window)将显示完整的内容。 要编辑这样一个区域,可使用 C-c ` 。 这将打开一个的新窗口。 编辑后用 C-c C-c 来提交编辑内容,并关闭窗口。

当浏览包含有固定宽度表的文件时,必需的隐藏内容尚未发生,需要对齐表来隐藏内容,来变美观。 可设置 org-startup-align-all-tables 是浏览时对文件中的所有表进行重新调整,但这样会减慢文件打开的速度。 也可以在每个文件中设置此选项:

#+STARTUP: noalign
#+STARTUP: align

如果不喜欢默认自动对齐的方式,您可以使用 <r> ,*<c>* 或者 <l> 来自定义对齐方式。 还可以将对齐和固定宽度组合使用,如下所示: <r10> 。 在导出文档时,将自动删除仅包含这些格式化信息的行。

2.3 列组

当Org导出表时,默认情况下不会有垂直线,因为在视觉上一般来说更令人满意。 然而,偶尔,垂直线对于将表结构化成一组列可能是有用的,就像水平线可以对于一组行所做的那样。 为了指定列组,您可以使用第一个字段仅包含"/"的特殊行。 其他字段可以包含'<'表示此列应该启动一个组,'>'表示组的结束,或'<>'('<'和'>'之间没有空格) 当前列自己一组。 导出后,列组之间的边界将用垂直线标记。 示例如下:

<img src="/images/table-column-groups.jpg" />

效果如下(好像没有效果):

N N2 N3 N4 sqrt(n) sqrt[4](N)
2 4 8 16 1.4142136 1.1892071
3 9 27 81 1.7320508 1.3160740

只插入列组启动器也是足够的:

<img src="/images/table-column-group-start.jpg" />

N N2 N3 N4 sqrt(n) sqrt[4](N)
2 4 8 16 1.4142136 1.1892071
3 9 27 81 1.7320508 1.3160740

2.4 The Orgtbl minor mode

If you like the intuitive way the Org table editor works, you might also want to use it in other modes like Text mode or Mail mode. The minor mode Orgtbl mode makes this possible. You can always toggle the mode with M-x orgtbl-mode RET. To turn it on by default, for example in Message mode, use

(add-hook 'message-mode-hook 'turn-on-orgtbl)

Furthermore, with some special setup, it is possible to maintain tables in arbitrary syntax with Orgtbl mode. For example, it is possible to construct LATEX tables with the underlying ease and power of Orgtbl mode, including spreadsheet capabilities.

3 超链接

就如 HTML 一样, Org 提供文件内部链接,到其他文件,Usenet文章,电子邮件等外部链接。

3.2 内部链接

如果一个链接不是URL形式的,它被当做当前文件中的内部链接。 最重要的情况是像 [ [#my-custom-id]] 这样的链接,它将链接到 CUSTOMID 属性是 my-custom-id 的条目。 自己要负责确保这些自定义ID在文件中是唯一的。 诸如 [ [MyTarget]][[MyTarget] [Findmytarget]] 的链接会在当前文件的文本中搜索。 在链接上输入 C-c C-o 或 鼠标点击时,会跳转到链接匹配处。 自定义ID的链接将指向相应的标题。

文本链接的首选匹配是 dedicated target :双角括号中的相同字符串,如 ←← My Target→→ 。 如果没有 dedicated target ,链接将尝试匹配缓冲区内元素的精确名称。 使用 #+NAME 关键字进行命名,必须将其放在引用的元素之前的行中,如以下示例所示:

#+NAME: My Target
| a  | table      |
|----+------------|
| of | four cells |

如果以上都没有成功,Org将搜索与链接文本完全相同的标题(也会搜索 TODO 关键字和标签)。

在导出过程中,内部链接被用于标记对象(并分配一个数字)。 标记的对象将被指向它们的链接引用。 特别地,没有 description 的链接将显示为分配给标记对象的编号。 以下摘录自 Org 缓冲区

- one item
- <<target>> another item
Here we refer to item [[target]].

导出时,最后一句将显示为 Here we refer to item 2

在非 Org 文件中,搜索将查找链接文本中的单词。 在上面的例子中搜索将是 my Target 。 链接后,将 mark 推到 Org 自己的 mark ring 上。 可使用 C-c & 返回到前一个位置。 直接连续使用这个命令多次可以回到前面记录的位置。

3.2.1 Radio targets

Org 可自动将正常文本中某些目标名称的任何出现转换为链接。 所以没有明确创建一个链接,文本就连接到 Radio targents 的位置。 Radio targets 由三角形括号括起来, 如 ←←← My Target→→→ 导致正常文本中的每个出现的 my target 被激活为链接。 仅当文件首次加载到Emacs中时,才会自动扫描 Radio targets 。 要在编辑过程中更新 Radio targets 列表,请在光标处于 Radio targets 位置时按 C-c C-c

3.3 外部链接

Org 支持链接到文件,网站,Usenet和电子邮件,BBDB数据库条目和链接到IRC对话及其日志。 外部链接是类似URL的 locators 。 它们以一个简短的识别字符串后面跟一个冒号开始。 冒号后没有空格。 下面列表显示每个链接类型的示例。

http://www.astro.uva.nl/~dominik           on the web
doi:10.1000/182                            DOI for an electronic resource
file:/home/dominik/images/jupiter.jpg      file, absolute path
/home/dominik/images/jupiter.jpg           same as above
file:papers/last.pdf                       file, relative path
./papers/last.pdf                          same as above
file:/myself@some.where:papers/last.pdf    file, path on remote machine
/myself@some.where:papers/last.pdf         same as above
file:sometextfile::NNN                     file, jump to line number
file:projects.org                          another Org file
file:projects.org::some words              text search in Org file
file:projects.org::*task                   heading search in Org file
docview:papers/last.pdf::NNN               open in doc-view mode at page
id:B7423F4D-2E8A-471B-8810-C40F074717E9    Link to heading by ID
news:comp.emacs                            Usenet link
mailto:adent@galaxy.net                    Mail link
mhe:folder                                 MH-E folder link
mhe:folder#id                              MH-E message link
rmail:folder                               RMAIL folder link
rmail:folder#id                            RMAIL message link
gnus:group                                 Gnus group link
gnus:group#id                              Gnus article link
bbdb:R.*Stallman                           BBDB link (with regexp)
irc:/irc.com/#emacs/bob                    IRC link
info:org#External links                    Info node or index link
shell:ls *.org                             A shell command
elisp:org-agenda                           Interactive Elisp command
elisp:(find-file-other-frame "Elisp.org")  Elisp form to evaluate

链接应包含在双括号中,当然可能想要显示的描述性文本而不是URL(参见链接格式),例如:

[[http://www.gnu.org/software/emacs/][GNU Emacs]]

如果描述是文件名或指向图像的URL,则HTML导出将内嵌图像作为可点击按钮。 如果没有任何描述和链接指向图像,该图像将被内联到导出的HTML文件中。

Org 能识别出正常文本中的外部链接,并将其作为链接激活。 如果空格必须是链接的一部分(例如在 bbdb:[Richard Stallman] 中), 或者如果需要消除关于链接结尾的歧义,请将其括在方括号中。

3.4 处理链接

Org 为了正确的创建链接,插入链接和跟随链接,提供了很多快捷键。

3.5 在Org之外使用链接

可以插入和跟踪具有Org语法的链接,不仅在组织中,而且可以在任何Emacs缓冲区中。 为此,应该创建两个全局命令,如下:

1
2
(global-set-key "\C-c L" 'org-insert-link-global)
(global-set-key "\C-c o" 'org-open-at-point-global)

3.6 链接缩写

长的URL输入起来会很麻烦,同时在文档中类似的链接可能会很频繁的出现。 为此,你可能需要使用链接缩写。 链接缩写看起来如下所示:

[[linkword:tag][description]]

tag 是可选的, linkword 必须是一个单词,以字母开头,后跟字母,数字,' - '和''。 根据将链接缩写词与替换文本相关联的变量 org-link-abbrev-alist 中的信息来解析缩写。 定义如下所示:

1
2
3
4
5
6
7
(setq org-link-abbrev-alist
'(("bugzilla" . "http://10.1.2.9/bugzilla/show_bug.cgi?id=")
("url-to-ja" . "http://translate.google.fr/translate?sl=en&tl=ja&u=%h")
("google" . "http://www.google.com/search?q=")
("gmap" . "http://maps.google.com/maps?q=%s")
("omap" . "http://nominatim.openstreetmap.org/search?q=%s&polygon=1")
("ads" . "http://adsabs.harvard.edu/cgi-bin/nph-abs_connect?author=%s&db_key=AST")))

如果替换文本包含字符串 %s ,它将被标签所替换。 使用 %h 而不是 %s ,是因为需要对标签进行url编码(参见上面示例,需要对URL参数进行编码)。 使用 %(my-function) 将标签传递给自定义函数 ,并将其替换为生成的字符串。 如果替换文本不包含任何说明符,则只需把标签添加到替换文本后即可创建链接。

如果只需要单个Org缓冲区的特殊缩写,可以在文件中定义它们

#+LINK: bugzilla  http://10.1.2.9/bugzilla/show_bug.cgi?id=
#+LINK: google    http://www.google.com/search?q=%s

3.7 文件链接的搜索选项

3.8 自定义搜索

4 待办事项

Org-mode 不把 TODO 列表作为单独的文档来维护。 相反, TODO 列表是笔记的组成部分,因为它通常产生于记录笔记时! 使用 Org-mode ,只需将树中的任何条目标记为 TODO 就可构造出 TODO 列表。 这种方式,信息不会冗余重复,并且始终显示 TODO 项出现的整个上下文。 当然,这种用于管理 TODO 项的方式会将它们分散在各个笔记文件中。 Org-mode 通过提供一些方法使我们可以把它们看作一个整体来处理。

4.1 基础的待办事项功能

TODO 关键字开始的任意标题都会变为代办事项,例如:

*** TODO Write letter to Sam Fortune
Key Desc Command
C-c C-t 转换当前项的TODO状态 _,-> (unmarked) -> TODO -> DONE –._ org-todo
C-u C-c C-t 当TODO关键字没有选择时,使用补全选择特定的关键字; 否则强制循环遍历TODO状态,没有提示。  
S-left/right 选择之后/之前的TODO状态,像是循环。  
C-c / t 构造出TODO列的稀疏树;折叠整个缓冲区,但显示所有TODO项( not-DONE 状态)和其上的标题层次结构。 使用前缀参数(或使用 C-c / T ),搜索特定的TODO。 系统提示输入关键字,还可以输入KWD1 | KWD2 | …等关键字,列出与这些关键字中的任何一个匹配的项。 使用数字前缀参数N,在选项 org-todo-keywords 中显示第N个关键字的树。 使用两个前缀参数,找到所有TODO状态,无论是完成还是未完成。 org-show-todo-tree
C-c a t 展示全局 TODO 列表;将所有agenda文件中的TODO项( not-DONE 状态)收集到一个缓冲区中。 新的缓冲区将处于 agenda-mode ,它提供了从新的缓冲区检查和操作TODO项的命令。 org-todo-list
S-M-RET 在当前项之后插入新的 TODO org-insert-todo-heading

注: 改变 TODO 状态也可触发标签发生变更。 请参阅 org-todo-state-tags-triggers 文档以了解详细信息, 也可可查看How to automatically trigger a change in TODO state in Emacs org-mode

4.2 待办事项扩展

默认情况下, 待办事项只能为以下两种状态之一: TODODONEOrg-mode 允许使用 TODO 关键字(存储在 org-todo-keywords )以更复杂的方式对 TODO 项目进行分类管理。 通过特殊设置, TODO 关键字系统可在不同的文件对不同的工作流程进行定制。

4.2.1 工作流状态应用

可以使用 TODO 关键字来表示项目进行过程中工作流状态,例如:

(setq org-todo-keywords
   '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED")))

垂直条将 TODO 关键字(需要处理的状态)从DONE状态分离(无需进一步操作)。 如果不提供垂直条,则最后一个状态用作 DONE 状态。 使用以上设置,命令 C-c C-t 将待办事项从 TODO 循环到 FEEDBACK ,然后到 VERIFY ,最后到 DONEDELEGATED 。 也可以使用数字前缀参数快速选择特定状态。 例如, C-3 C-c C-t 将立即将状态更改为VERIFY。 或者可以使用 S-left/right 向后/向前遍历序列。

4.2.2 类型标示应用

第二种可能性是使用TODO关键字来指示待办事项的隶属于不同类型。 例如,可能希望指出项目是 workhome 。 或者,当在一个项目中与多个人合作时,可能需要通过使用他们的名字作为 TODO 关键字来将项目任务直接分配给个人。 如下配置:

(setq org-todo-keywords '((type "Fred" "Sara" "Lucy" "|" "DONE")))

在这种情况下,不同的关键字不表示序列,而是不同的类型。 所以正常的工作流程是将任务分配给一个人,然后将其标记为DONE。 Org-mode 通过调整命令 C-c C-t 的工作机制来支持这种风格。 当连续使用多次时,它仍将循环遍历所有名称,以便首先为任务选择正确的类型。 但是,当经过一段时间后返回该项目并再次执行 C-c C-t ,它将从任何名称直接切换到 DONE 。 使用前缀参数或完成快速选择一个特定的名称。 还可以使用 C-c / t 的数字前缀来查看稀疏树中特定 TODO 类型的项目。 例如,要查看Lucy所做的一切事情,使用 C-3 C-c / t 。 要将Lucy的所有项目从所有议程文件收集到一个单独的库中,还可以在创建全局TODO列表时使用数字前缀参数: C-3 C-c a t

4.2.3 单个文件中多个关键字集合

有时可能需要并行使用不同的TODO关键字集。 例如,可能需要具有基本的 TODO / DONE ,还有一个修复错误的工作流程,以及指示某个项目已被取消的单独状态(因此它不是 DONE ,也不需要执行操作)。 设置如下所示:

(setq org-todo-keywords
      '((sequence "TODO" "|" "DONE")
	(sequence "REPORT" "BUG" "KNOWNCAUSE" "|" "FIXED")
	(sequence "|" "CANCELED")))

这些关键字应该是不同的,这有助于 Org-mode 跟踪给定条目应该使用哪个子序列。 在这个设置中, C-c C-t 只能在一个子序列中运行, 所以它从 DONE 切换到(无)到 TODO , 从 FIXED 切换到(无)到 REPORT 。 因此,需要一种机制来正确初始选择序列。 除了显式的键入关键字或使用补全外,还可应用以下命令:

C-u C-u C-c C-t C-S-right/left

这些键从一个 TODO 子集跳到下一个。 在上面的例子中, C-u C-u C-c C-tC-S-right 将从 TODODONE 跳到 REPORT , 而第二行中的任何一个字都可跳转到 CANCELED

S-right/left

S-right/left 并从所有集合中遍历所有关键字,例如在上面的例子中,S-right将从DONE切换到REPORT。

4.2.4 快速访问代办状态

如果要快速将条目更改为任意TODO状态,而不是循环遍历状态,则可以设置单个字符来快速访问状态的键。 这是通过在每个关键字后面的括号中添加选择字符来完成的。

(setq org-todo-keywords
     '((sequence "TODO(t)" "|" "DONE(d)")
       (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
       (sequence "|" "CANCELED(c)")))

如果按C-c C-t,后按选择键,则条目将切换到此状态。 SPC可用于从条目中删除任何TODO关键字。

4.2.5 为文件设置独立的关键字集合

在不同文件中使用 TODO 机制的不同方面是非常有用的。 对于文件本地设置,需要在文件中添加专用行,仅为该文件设置关键字和仅对当前文件起效。 例如,要设置上述两个示例之一,需要在文件中包含以下任何一行:

#+TODO: TODO FEEDBACK VERIFY | DONE CANCELED

或者

#+TYP_TODO: Fred Sara Lucy Mike | DONE

并行使用几组的设置如下:

#+TODO: TODO | DONE
#+TODO: REPORT BUG KNOWNCAUSE | FIXED
#+TODO: | CANCELED

在更改其中一行后,在行中使用 C-c C-c ,以使变更生效。

4.2.6 代办事项关键字的样式

Org-mode 突出显示具有特殊样式的TODO关键字:关键字的 org-todo 表示某个项目仍然需要执行,对于表示项目完成的关键字 org-done 。 如果使用两种以上的不同状态,可能需要为其中某些状态使用特殊样式。 可使用选项 org-todo-keyword-faces 来完成。 例如:

(setq org-todo-keyword-faces
      '(("TODO" . org-warning) ("STARTED" . "yellow")
	("CANCELED" . (:foreground "blue" :weight bold))))

4.2.7 待办事项的依赖关系

Org 结构(层次结构和列表)可以轻松定义TODO依赖关系。 通常,在将所有子任务标记为 DONE 之前,不应将父 TODO 任务标记为 DONE 。 有时,对于一些(子)任务有一个逻辑顺序,所以在完成上面的所有兄弟任务之前,一个任务不能被执行。 如果设置自定义选项 org-enforce-todo-dependencies ,Org将会阻塞任务从 TODO 更改为 DONE ,而它的子项不是DONE。 此外,如果条目具有 ORDERED 属性,则每个子项将被阻塞,直到所有较早的兄弟节点被标记为 DONE 。 设置 org-enforce-todo-dependencies,如下所示:

(setq org-enforce-todo-dependencies t)

依赖关系示例如下:

* TODO Blocked until (two) is done
** DONE one
** TODO two

* Parent
  :PROPERTIES:
  :ORDERED:  t
  :END:
** TODO a
** TODO b, needs to wait for (a)
** TODO c, needs to wait for (a) and (b)

可以使用 NOBLOCKING 属性确保从不阻塞输入:

* This entry is never blocked
  :PROPERTIES:
  :NOBLOCKING: t
  :END:
C-c C-x o

切换当前条目的 ORDERED 属性。 ORDERED 属性只适用于当前项,而不是像标签一样可继承。 但是,如果要使用标签跟踪该属性的值,以便更好地查看,请自定义选项 org-track-ordered-property-with-tag

C-u C-u C-u C-c C-t
改变 TODO 状态,规避任何状态阻塞。

如果设置选项 org-agenda-dim-blocked-tasks ,则由于这些依赖关系而无法关闭的TODO条目将以渐变字体显示,甚至在议程视图中不可见。 还可以通过查看复选框来阻止 TODO 状态的更改。 如果设置了选项 org-enforce-todo-checkbox-dependencies ,则将禁止具有未选中复选框的条目切换到 DONE 。 如果需要更复杂的依赖关系结构,例如不同树或文件中的条目之间的依赖关系,请查看模块 org-depend.el

4.3 进度记录

4.3.1 关闭项目

4.3.2 追踪TODO状态变化

4.3.3 追踪你的习惯

4.4 优先级

4.5 任务分解

4.6 复选框

5 标签

6 属性

7 日期和时间

8 捕获——转发——存档

9 议程视图

Footnotes:

1

org-mode 官方链接地址: http://orgmode.org

Last Updated 2017-10-13 Fri 17:33.
Render by hexo-renderer-org with Emacs 25.3.2 (Org mode 8.2.10)