翻译: Org 手册

本手册适用于 Org 版本 10.0。

版权所有 © 2004–2026 自由软件基金会。

依据自由软件基金会发布的 GNU 自由文档许可证 第 1.3 版 或其更新版本,您有权复制、分发、修改本文档。本文档无固定章节,前封面文字为 “一份 GNU 手册”,后封面文字如下文 (a) 所述。许可证副本收录在名为 “GNU 自由文档许可证” 的章节中。

(a) 自由软件基金会的后封面文字为:“您拥有复制和修改本 GNU 手册的自由。”

Table of Contents


1 Introduction


1.1 Summary

Org mode 是面向 GNU Emacs 的文档创作工具与待办事项管理器。 它基于轻量级纯文本标记语言,文件后缀名为 ‘.org’ 。

在 Emacs 中编辑 Org 文件可获得最佳支持,但你也可使用任意文本编辑器查看、理解与修改文件内容。

作为创作工具,Org 可帮助你编写结构化文档并提供导出能力。Org 文件同样适用于文学式编程与可复现研究。作为待办事项管理器,Org 可灵活组织各类任务,从日常事务到详细项目规划均可覆盖,支持日志记录、多视角查看任务、导出日程安排等功能。

Org 模式基于大纲模式(Outline mode)实现,可让大型文件内容保持清晰结构。可见性循环与结构编辑功能便于操作树形内容。内置表格编辑器可快速创建表格。类 URL 格式的纯文本链接可指向网页、邮件、新闻组消息、BBDB 条目及项目相关的任意文件。

Org 围绕包含列表或项目纯文本信息的笔记文件完成各类组织任务。项目规划与任务管理使用元数据,元数据隶属于大纲节点。基于这些数据,可通过查询提取特定条目,生成动态 日程视图 ,并与 Emacs 日历和日记功能集成。Org 可实现多种项目规划方法,例如戴维·艾伦的 GTD 体系(David Allen’s GTD system)。

Org 文件可作为单一源创作系统,导出为 HTML、LaTeX、开放文档格式、Markdown 等多种格式。新的导出后端可基于现有后端扩展,也可从零定义。

Org 文件可嵌入源代码块,使其特别适合编写包含代码示例的技术文档。Org 源代码块功能完整,可就地执行并将结果保存至文件中,从而实现单文件可复现研究汇编。

Org 坚持简单事务简单处理的设计理念。初次使用时,它是一款直观易用的大纲编辑器,不会强加复杂操作,但在需要时可提供丰富功能。Org 如同一个工具箱,许多用户仅使用符合自身习惯的部分功能,同时知晓更多能力可随时启用。

所有功能均基于纯文本文件实现,这是最具可移植性且面向未来的文件格式。Org 运行于 Emacs 之上,而 Emacs 是移植范围最广的软件之一,因此 Org 模式可在所有主流平台使用。

Org 设有官方网站,提供最新版本、补充资料、常见问题解答(FAQ)、教程链接等内容,网址为 https://orgmode.org

本手册早期版本(7.3)曾由 Network Theory Ltd. 出版公司发行平装本,该公司已于 2009 年停业。


1.2 Installation

Org 已内置在 GNU Emacs 发行版中,通常无需额外安装。大多数用户只需启用 Org 即可开始使用其功能。

若因特殊原因需要在预装版本之外另行安装 Org,可使用 Emacs 包管理器或克隆 Org 的 Git 仓库。我们 强烈建议 仅使用一种安装方式。

在预装版本之上安装 Org 时请注意:Org 稳定版与最近三个 Emacs 稳定版完全兼容,但不支持更早版本的 Emacs。

部分 Org 组件依赖包仓库提供的第三方软件包,Org 仅保证与这些第三方包的最新稳定版兼容。

Using Emacs packaging system

新版 Emacs 内置包管理器,可安装 Elisp 库。你可通过 M-x list-packages 打开 “包菜单(package menu)” 安装 Org,详见 Package Menu

Important: 请在未打开任何 ‘.org’ 文件的 Emacs 会话中执行此操作,即尚未加载任何 Org 内置函数的环境。否则自动加载的 Org 函数会导致安装异常。

为避免与内置 Org 模式冲突,可使用命令行安装(需 Emacs 30 及以上版本):

emacs -Q -batch -eval "(progn (require 'package) (package-initialize) (package-refresh-contents) (package-upgrade 'org))"

该方式可将升级过程与运行中的 Emacs 会话隔离,避免出现版本冲突。

Using Org’s Git repository

可克隆 Org 仓库并按以下步骤安装:

$ cd ~/src/
$ git clone https://https.git.savannah.nongnu.org/git/org-mode.git
$ # 也可使用镜像仓库
$ # git clone https://git.sr.ht/~bzg/org-mode
$ cd org-mode/
$ make autoloads

注意此场景下 ‘make autoloads’ 为必需步骤:它会在 ‘org-version.el’ 中定义 Org 版本,并在 ‘org-loaddefs.el’ 中生成自动加载配置。

请在 Emacs 初始化文件中正确配置加载路径:

(add-to-list 'load-path "~/src/org-mode/lisp")

你还可使用 ‘make’ 编译、 ‘make doc’ 生成文档、 ‘make config’ 创建本地配置、 ‘make install’ 安装 Org。执行 ‘make help’ 可查看完整编译与安装选项。

如需更详细的 Org 构建系统说明,可查阅 Worg 上的 Org Build System 页面。

Installing Org’s contributed packages

Org 仓库曾包含 ‘contrib/’ 目录,用于存放社区贡献的扩展。自 Org 9.5 起,该目录已迁移至独立的 org-contrib 仓库,可作为 package 包从 NonGNU ELPA 单独安装。

Org 仓库外有许多优质扩展包,Worg 网站提供 org-contrib 与外部扩展包 列表,该列表并未完全收录所有相关项目。


1.3 Activation

Org 模式缓冲区需要启用字体锁定功能,这是 Emacs 的默认设置1

Org 模式与部分 Elisp 包存在兼容问题(见 Packages that conflict with Org mode),建议查阅相关列表。

为提升使用体验, org-store-linkorg-captureorg-agenda 三个核心命令应可在 Emacs 全局环境调用,而非仅限 Org 缓冲区。为此需要将其绑定到全局快捷键,例如用户自定义保留按键(见 (elisp)Key Binding Conventions)。以下为推荐配置,可在 个人初始化文件 中根据习惯修改。

(global-set-key (kbd "C-c l") #'org-store-link)
(global-set-key (kbd "C-c a") #'org-agenda)
(global-set-key (kbd "C-c c") #'org-capture)

后缀为 ‘.org’ 的文件默认启用 Org 模式。若要在非 ‘.org’ 后缀文件中启用 Org 模式,可将文件首行设置为:

MY PROJECTS    -*- mode: org; -*-

无论文件名如何,该写法都会为当前缓冲区启用 Org 模式。相关配置可参考变量 org-insert-mode-line-in-empty-file

Org 中许多命令会在区域处于 激活 状态时作用于该区域。此功能需要开启瞬态标记模式(Transient Mark mode),该模式为 Emacs 默认设置。若不喜欢该模式,可通过鼠标选择区域,或在移动光标前按两次 C-SPC 激活区域。


1.4 Feedback

如果你在使用 Org 时发现问题,或有相关疑问、意见与建议, 请发送邮件至 Org 邮件列表 。 你可以通过该网页订阅该邮件列表。 若你并非邮件列表成员,你的邮件需经管理员审核后才会发布至列表2。 在该邮件列表发言时,请阅读并遵守GNU 友好交流准则。 反馈后请耐心等待最长一个月的回复时间,若错误报告未收到回应可再次跟进。

提交错误报告时,请先使用最新版本的 Org 尝试复现问题— 如果你使用的是过时版本,该问题很可能已被修复。 若问题仍然存在,请准备报告并尽可能提供详细信息, 包括 Emacs 版本信息(M-x emacs-version)、 Org 版本信息(M-x org-version), 以及 Emacs 初始化文件中与 Org 相关的配置。 完成此事最简单的方式是执行命令:

M-x org-submit-bug-report <RET>

该命令会将所有相关信息填入 Emacs 邮件缓冲区, 你只需补充问题描述即可。 若你并非在 Emacs 内发送邮件,请将相关内容复制粘贴到你的邮件客户端中。

有时你遇到的问题可能源于 Emacs 或 Org 模式的配置错误。 提交错误报告前,以最小化自定义配置启动 Emacs 并复现问题会很有帮助。 这样做通常能帮你判断问题出自你的自定义配置还是 Org 模式本身。 你可以通过类似下方示例的命令启动典型的最小化会话。

$ emacs -Q -l /path/to/minimal-org.el

但如果你使用的是 Emacs 自带的 Org 模式版本,则无需最小化配置, 直接以 ‘emacs -Q’ 启动 Emacs 即可。 ‘minimal-org.el’ 配置文件可包含如下内容:

;;; 用于加载最新 `org-mode' 的最小化配置

;; 启用调试
(setq debug-on-error t
      debug-on-signal nil
      debug-on-quit nil)

;; 将最新 Org 模式加入加载路径
(add-to-list 'load-path (expand-file-name "/path/to/org-mode/lisp"))

若你使用的是 Git 仓库中的 Org 模式版本, 可通过 ‘make’ 启动最小化会话。

# 纯净 Emacs
make repro
# 或传入额外参数
make repro REPRO_ARGS="-l /path/to/minimal/config.el /tmp/bug.org"

若出现错误,“调用栈回溯(backtrace)” 信息会非常有用— 下文会说明如何生成该信息。 通常一份小型示例文件会很有帮助,同时请清晰说明以下内容:

  1. 你具体执行了什么操作?
  2. 你期望发生什么结果?
  3. 实际发生了什么?

若你感受到性能下降,可录制一份 “性能剖析文件(profile)” 并分享至 Org 邮件列表。 下文会说明如何生成有效的性能剖析数据。

感谢你帮助改进这款程序。

How to create a useful backtrace

若使用 Org 时出现无法理解的错误提示,你可能遇到了程序缺陷。 报告此类问题的最佳方式是,除上述信息外,额外提供一份调用栈回溯信息。 该信息来自内置调试器,记录了错误发生的位置与原因。 以下是生成有效调用栈回溯信息的方法:

  1. 重新加载所有未编译的 Org 模式 Lisp 文件。 使用未编译代码生成的回溯信息会丰富得多。 执行此操作的命令为:
    C-u M-x org-reload <RET>
    

    或通过菜单操作:Org → 刷新/重新加载 → 以未编译形式重新加载 Org。

  2. 随后启用调试器:
    M-x toggle-debug-on-error <RET>
    

    或通过菜单:选项 → 出错时进入调试器。

  3. 执行触发错误的操作,并记得记录操作步骤。
  4. 触发错误后,屏幕会出现 ‘*Backtrace*’ 缓冲区。 将该缓冲区保存为文件(例如使用 C-x C-w), 并附加到错误报告中。

How to profile Org performance

有时 Org 会无故运行缓慢。 这类卡顿通常由第三方包与 Org 模式的交互导致, 但定位根本原因并非总是易事。

Emacs 可以记录性能统计数据, 借此找出执行耗时最长的函数。 记录统计数据需要使用性能剖析器。 使用 Emacs 剖析器建议按以下步骤操作:

  1. 确保当前无剖析器正在运行:
    M-x profiler-stop <RET>
    
  2. 启动新的 CPU 性能剖析会话:
    M-x profiler-start <RET> cpu <RET>
    
  3. 正常使用 Emacs,执行那些感觉卡顿的操作。
  4. 查看并分析记录的性能统计数据:
    M-x profiler-report <RET>
    

    该命令会显示 profiler-startprofiler-report 执行期间所运行的命令与函数摘要,耗时最长的命令会显示在顶部。

    可在剖析器缓冲区中按 ‘<TAB>’ 键折叠或展开行。 展开后显示的子项即为被展开父项所调用的函数与命令。

    根本原因通常深藏在剖析器的子项中。 你可以按 ‘B’ (profiler-report-render-reversed-calltree) 快速定位实际耗时最长的函数/命令。

    按 ‘Cprofiler-report-render-calltree 可恢复原始视图。

  5. 若需要进一步帮助,可分享统计数据。

    保存数据的命令为:

    M-x profiler-report-write-profile <RET>
    /path/to/profile-file-to-be-saved <RET>
    

    随后将保存的文件附加到发送至 Org 邮件列表的邮件中, 并详细说明触发卡顿的操作。

    注意:保存的统计数据仅包含函数名与执行耗时, 不会记录任何隐私数据。


1.5 Typesetting Conventions Used in this Manual

TODO keywords, tags, properties, etc.

Org 使用多种语法元素:TODO 关键字、标签、属性名、关键字、块等。 本手册使用以下约定:

TODO’, ‘WAITING

TODO 关键字全部使用大写书写,即使用户自定义也是如此。

boss’, ‘ARCHIVE

标签区分大小写。用户自定义标签通常使用小写; 具有特殊含义的内置标签按其在文档中的实际形式书写,一般为全大写。

Release’, ‘PRIORITY

用户自定义属性首字母大写; 具有特殊含义的内置属性全部使用大写。

TITLE’, ‘BEGIN’ … ‘END

关键字与代码块使用大写以提升可读性, 但你在自己的 Org 文件中可以使用小写。

Key bindings and commands

本手册会同时列出功能对应的快捷键与命令。 Org 模式常会根据上下文,将同一个快捷键用于不同功能。 绑定到这类快捷键的命令通常使用通用名称,例如 org-metaright 。 手册会尽可能给出该通用命令内部实际调用的函数。 例如,在文档结构章节中,M-RIGHT 会标注为调用 org-do-demote , 而在表格章节中,该快捷键则标注为调用 org-table-move-column-right


2 Document Structure

Org 是一款大纲编辑模式。大纲可以让文档以层级结构进行组织,至少对我而言,这是呈现笔记与思路的最佳方式。通过折叠可以概览该结构,也就是隐藏文档的大部分内容,只显示整体文档结构和当前正在处理的部分。Org 将显示与隐藏功能精简为单一命令 org-cycle 并绑定到 TAB 按键,极大简化了大纲的使用。


2.1 Headlines

标题定义了大纲树的结构。Org 标题从行首3开始,由一个或多个星号后跟空格构成。示例如下:

* 第一级(顶层)标题
** 第二级
*** 第三级
    一些文本
*** 第三级
    更多文本
* 另一个第一级(顶层)标题

org-footnote-section 中定义的名称为保留名称,请勿将其用作自定义标题。

部分用户觉得大量星号显得杂乱,希望大纲标题标记为空白加单个星号的形式。这可以通过 Org 缩进次要模式实现,更多信息详见 A Cleaner Outline View

标题默认不编号,但你可以对部分或全部标题进行动态编号,详见 Dynamic Headline Numbering

子树末尾的空行会被视为该子树的一部分,子树折叠时会一同隐藏。若保留至少两个空行,折叠子树后会保留一个空行可见,用于规整折叠后的视图。可通过变量 org-cycle-separator-lines 修改该行为。


2.2 Visibility Cycling


2.2.1 Global and local cycling

大纲支持隐藏缓冲区中的部分文本。Org 仅使用两个绑定到 TABS-TAB 的命令,即可切换缓冲区的可见性。

TAB (org-cycle)

子树循环切换: 将当前子树在以下状态间循环切换

,-> FOLDED -> CHILDREN -> SUBTREE --.
'-----------------------------------'

光标需位于标题上该命令才会生效4

S-TAB (org-global-cycle), C-u TAB

全局循环切换: 将整个缓冲区在以下状态间循环切换

,-> OVERVIEW -> CONTENTS -> SHOW ALL --.
'--------------------------------------'

S-TAB 携带数字前缀参数 N 时,仅显示至第 N 级标题的内容。

注意在表格内部(详见 Tables),S-TAB 会跳转到上一个字段。

仅当光标位于缓冲区最开头且不在标题上,同时 org-cycle-global-at-bob 设置为非 nil 值时,才能通过 TAB 执行全局循环切换。

C-u C-u TAB (org-cycle-set-startup-visibility)

恢复为缓冲区的启动可见性状态(详见 Initial visibility)。

C-u C-u C-u TAB (org-fold-show-all)

显示全部内容,包括抽屉。

C-c C-r (org-reveal)

显示光标周围的上下文,展示当前条目、后续标题以及上层层级结构。该命令适用于在稀疏树命令(详见 Sparse Trees)或日程命令(详见 Commands in the Agenda Buffer)所显示的位置附近编辑。携带前缀参数时,每层均显示所有同级标题;携带双重前缀参数时,还会显示父节点的完整子树。

C-c C-k (org-show-branches)

展开子树的所有标题,但不显示其正文内容。

C-c TAB (org-fold-show-children)

展开子树的所有直接子节点。携带数字前缀参数 N 时,展开至第 N 级的所有子节点。

C-c C-x b (org-tree-to-indirect-buffer)

在间接缓冲区5中显示当前子树。携带数字前缀参数 N 时,向上跳转至第 N 级并取该子树;若 N 为负数,则向上跳转对应级数。携带 C-u 前缀时,不删除此前使用的间接缓冲区。

C-c C-x v (org-copy-visible)

将区域内 可见 文本复制到剪切环。


2.2.2 Initial visibility

Emacs 首次打开 Org 文件时,全局状态默认为 showeverything ,即文件所有内容均可见6。可通过变量 org-startup-folded 进行配置,也可在缓冲区任意位置添加以下行实现按文件单独设置:

#+STARTUP: overview
#+STARTUP: content
#+STARTUP: showall
#+STARTUP: show2levels
#+STARTUP: show3levels
#+STARTUP: show4levels
#+STARTUP: show5levels
#+STARTUP: showeverything

此外,带有 ‘VISIBILITY’ 属性的条目(详见 Properties and Columns)会自动适配对应可见性,该属性允许的值为 ‘folded=、=children=、=content’ 和 ‘all’ 。

C-u C-u TAB (org-cycle-set-startup-visibility)

恢复为缓冲区的启动可见性状态,即由启动选项和各条目 ‘VISIBILITY’ 属性指定的状态。


2.2.3 Catching invisible edits

有时你会误操作编辑缓冲区的不可见部分,导致不清楚修改内容以及如何撤销错误。默认情况下,Org 会对部分用户命令禁止此类编辑,用户可通过自定义 org-fold-catch-invisible-edits-commands 控制生效的命令。

判断指定编辑是否存在风险的策略由 org-fold-catch-invisible-edits 控制,可用策略详见该选项的文档字符串。将该选项设为 nil 可完全关闭不可见编辑拦截功能。


2.3 Motion

下列命令可在缓冲区中跳转到其他标题。

C-c C-n (org-next-visible-heading)

下一个标题。

C-c C-p (org-previous-visible-heading)

上一个标题。

C-c C-f (org-forward-heading-same-level)

同层级下一个标题。

C-c C-b (org-backward-heading-same-level)

同层级上一个标题。

C-c C-u (outline-up-heading)

向上跳转到更高层级标题。

C-c C-j (org-goto)

跳转到其他位置,同时不改变当前大纲的显示状态。在临时缓冲区中显示文档结构, 可使用以下按键定位目标位置:

TAB循环切换显示状态。
DOWN / UP下一个/上一个可见标题。
RET选中当前位置。
/执行稀疏树搜索

关闭 org-goto-auto-isearch 后,以下按键生效。

n / p下一个/上一个可见标题。
f / b同层级下一个/上一个标题。
u向上提升一级。
09数字前缀参数。
q退出。

另请参阅变量 org-goto-interface


2.4 Structure Editing

M-RET (org-meta-return)

插入新标题、列表项或表格行。

若在 行首 执行该命令,且光标处为标题或普通列表项(见 Plain Lists), 新标题/项将插入到当前行 之前 。在普通文本行首执行时,会将该行转为标题。

在行中间执行时,会拆分该行,后半部分成为新的列表项或标题。 若不希望拆分行,可自定义 org-M-RET-may-split-line

搭配 C-u 前缀执行时,将无条件在当前子树末尾插入新标题, 保留原有内容。搭配双重前缀 C-u C-u 时,新标题将创建在父级子树末尾。

C-RET (org-insert-heading-respect-content)

在当前子树末尾插入新标题。

M-S-RET (org-insert-todo-heading)

插入与当前标题同级的新 TODO 条目。另请参阅变量 org-treat-insert-todo-heading-as-state-change

C-S-RET (org-insert-todo-heading-respect-content)

插入与当前标题同级的新 TODO 条目。与 C-RET 类似, 新标题将插入到当前子树之后。

TAB (org-cycle)

在尚无内容的新条目中,首次按下 TAB 会将该条目降级为前一条目的子项。 再次按下 TAB 会将其升级为父级,依此类推直至最顶层。 继续按下 TAB 则会回到初始层级。

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)

将子树下移,即与同层级下一个子树交换位置。

C-c @ (org-mark-subtree)

标记光标处的子树。重复按键可依次标记与已标记子树同级的后续子树。

C-c C-x C-w (org-cut-subtree)

剪切子树,即从缓冲区移除并保存至剪切环。 搭配数字前缀参数 N 时,剪切连续 N 个子树。

C-c C-x M-w (org-copy-subtree)

复制子树至剪切环。搭配数字前缀参数 N 时,复制连续 N 个子树。

C-c C-x C-y (org-paste-subtree)

从剪切环粘贴子树。会自动调整子树层级,使其适配粘贴位置。 粘贴层级也可通过数字前缀参数指定,或粘贴在类似 ‘****’ 的标题标记之后。 搭配 C-u 前缀时,强制作为同级节点插入。 搭配 C-u C-u 前缀时,强制作为子节点插入。

C-y (org-yank)

根据变量 org-yank-adjusted-subtreesorg-yank-folded-subtrees 的设置, Org 内置的 yank 命令会以折叠状态智能粘贴子树,逻辑与 C-c C-x C-y 一致。 默认设置下不调整层级,但粘贴的子树会折叠,除非此举会遮挡原本可见的文本。 该命令的任何前缀参数都会强制执行普通 yank 并传递前缀。 强制普通粘贴的常用方式为 C-u C-y。 粘贴后使用 yank-pop 时,会直接粘贴之前的剪切内容,不做调整与折叠。

C-c C-x c (org-clone-subtree-with-time-shift)

克隆子树,创建多个同级副本。系统会提示输入副本数量, 并可选择是否偏移条目中的时间戳。 例如可用于快速创建一系列备课相关任务。 更多细节请参阅该命令的文档字符串 org-clone-subtree-with-time-shift

C-c C-w (org-refile)

将条目或区域归档至其他位置。见 Refile and Copy

C-c ^ (org-sort)

对同层级条目排序。存在激活区域时,对区域内所有条目排序; 否则对当前标题的子项排序。命令会提示选择排序方式, 可按字母、数字、时间(优先首个激活时间戳、创建时间、计划时间、截止时间)、 优先级、TODO 关键字(按配置中定义顺序)或属性值排序。也支持反向排序, 还可自定义提取排序键的函数。搭配 C-u 前缀时,排序区分大小写。

C-x n s (org-narrow-to-subtree)

将缓冲区限制显示为当前子树。

C-x n b (org-narrow-to-block)

将缓冲区限制显示为当前块。

C-x n w (widen)

取消限制,恢复显示整个缓冲区。

C-c * (org-toggle-heading)

将普通行或普通列表项转为标题,即在当前位置成为子标题; 也可移除标题星号,将标题还原为普通行。 存在激活区域时,将区域内所有行转为标题。 若区域首行为列表项,则仅将列表项行转为标题。 若区域首行为标题,则移除区域内所有标题的星号。

注意,当光标位于表格内时(见 Tables),Meta+方向键功能不同。


2.5 Sparse Trees

Org 模式的一项重要功能是可为大纲树中的指定内容构建 稀疏树(sparse trees) , 使整个文档尽可能折叠,但选中内容及其上方的标题结构保持可见7。 实际操作一次即可直观理解其工作方式。

Org 模式提供多个创建稀疏树的命令,均可通过调度器调用:

C-c / (org-sparse-tree)

提示输入额外按键,选择创建稀疏树的对应命令。

C-c / rC-c / / (org-occur)

提示输入正则表达式(见 Regular Expressions)并显示包含所有匹配项的稀疏树。 若匹配项在标题中,则显示该标题;若在条目正文中,则显示标题与正文。 为提供基础上下文,匹配项上方的完整标题层级及匹配项后的标题也会显示。 每个匹配项会高亮显示;执行编辑操作修改缓冲区或按下 C-c C-c 后高亮消失8。 搭配 C-u 前缀执行时,会保留之前的高亮,可多次叠加执行该命令。

M-g nM-g M-n (next-error)

跳转到当前缓冲区中下一个稀疏树匹配项。

M-g pM-g M-p (previous-error)

跳转到当前缓冲区中上一个稀疏树匹配项。

对于常用的特定搜索字符串稀疏树,可通过变量 org-agenda-custom-commands 定义快捷键快速访问。这些命令可通过日程调度器调用(见 The Agenda Dispatcher)。 示例:

(setq org-agenda-custom-commands
      '(("f" occur-tree "FIXME")))

该配置将按键 f 设为创建匹配 ‘FIXME’ 字符串稀疏树的快捷方式。

其他稀疏树命令可根据 TODO 关键字、标签或属性筛选标题,将在手册后续章节介绍。

打印稀疏树时,可使用 Emacs 命令 ps-print-buffer-with-faces , 该命令不会打印文档中不可见部分。也可使用命令 C-c C-e C-v 仅导出文档可见部分并打印生成的文件。


2.6 Plain Lists

在大纲树的条目内部,手动格式化的列表可提供额外结构, 也可用于创建复选框列表(见 Checkboxes)。 Org 支持编辑此类列表,所有导出器(见 Exporting)均可解析并格式化。

Org 支持有序列表、无序列表与描述列表。

  • 无序(unordered) 列表项以 ‘-’ 、 ‘+’ 或 ‘*’ 作为项目符号9
  • 有序(ordered) 列表项以数字后跟句点或右括号开头10, 如 ‘1.’ 或 ‘1)11。若希望列表从其他数值开始(如 20), 可在项文本开头使用 ‘[@20]12。该写法可用于列表任意项,强制指定编号。
  • 描述(description) 列表项为无序列表项,使用分隔符 ‘::’ 区分描述 术语(term) 与描述文本。

同属一个列表的项,首行缩进必须一致。 特别地,有序列表编号达到 ‘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.
3. Peter Jackson being shot by Legolas
   - on DVD only
   He makes a really funny face when it happens.
8. [@8] <favorite scenes 4 to 8 are skipped for brevity>
But in the end, no individual scenes matter but the film as a whole.
Important actors in this film are:
- Elijah Wood :: He plays Frodo
- Sean Astin :: He plays Sam, Frodo's friend.  I still remember him
     very well from his role as Mikey Walsh in /The Goonies/.

Org 通过优化填充与自动换行命令适配列表,并正确导出(见 Exporting)。 由于缩进决定列表结构,许多结构块(如 ‘#+BEGIN_’ 块)可通过缩进表明归属某一项。

若希望子列表使用与当前层级不同的项目符号以提升可读性, 可自定义变量 org-list-demote-modify-bullet 。 若希望项与子项缩进差异更大,可自定义 org-list-indent-offset

下列命令在光标位于项首行(含项目符号或数字的行)时生效。 部分命令会应用自动规则以保持列表结构完整。 若某些行为不符合需求,可配置 org-list-automatic-rules 单独禁用。

TAB (org-cycle)

列表项可像标题层级一样折叠显示。通常仅当光标在普通列表项上时生效。 更多细节见变量 org-cycle-include-plain-lists 。 若该变量设为 integrate ,普通列表项将被视为低级标题, 项的层级由项目符号/数字的缩进决定。 但列表项始终从属于真实标题,两者层级完全分离。 在尚无内容的新项中,首次按下 TAB 会将该项降级为前一项的子项, 后续按下 TAB 会在列表中切换有效层级,最终回到初始位置。

M-RET (org-insert-item)

在当前层级插入新项。搭配前缀参数时,强制插入新标题(见 Structure Editing)。 若在项中间执行,该项会 拆分 为两部分,后半部分成为新项13。 若在项正文之前执行,新项会插入到当前项 之前

M-S-RET

插入带复选框的新项(见 Checkboxes)。

S-UP, S-DOWN

跳转到当前列表的上一个/下一个项,但仅当 org-support-shift-select 关闭时生效14。 未关闭时,可使用 C-UPC-DOWN 等段落跳转命令实现类似效果。

M-UP, M-DOWN

将项及其子项整体上移/下移15, 即与同缩进的上一个/下一个项交换位置。若为有序列表,会自动重新编号。

M-LEFT, M-RIGHT

减小/增大项的缩进,子项保持不变。

M-S-LEFT, M-S-RIGHT

减小/增大项及其所有子项的缩进。 初始时根据当前缩进选择项树,连续多次执行时, 即使新缩进对应不同层级,仍使用初始选中区域。 若要应用新层级,需移动光标中断连续操作。

特殊情况:在列表首个项上执行该命令会移动整个列表。 可通过配置 org-list-automatic-rules 禁用该行为。 列表的整体缩进不影响列表 的文本。

C-c C-c

若项行包含复选框(见 Checkboxes),切换复选框状态。 无论何种情况,都会检查整个列表的项目符号与缩进一致性。

C-c -

将整个列表层级循环切换为不同项目符号( ‘-’ 、 ‘+’ 、 ‘*’ 、 ‘1.’ 、 ‘1)’ )或其子集, 具体取决于 org-plain-list-ordered-item-terminator 、列表类型与缩进。 搭配数字前缀参数 N 时,选择列表中第 N 种项目符号。 执行时若存在激活区域,将所有行转为列表项。 搭配前缀参数时,选中文本转为单个项。 若首行已是列表项,则移除所有项标记。 即使无激活区域,普通行也会转为列表项。

C-c *

将普通列表项转为标题,即在当前位置成为子标题。 详细说明见 Structure Editing

C-c C-*

将整个普通列表转为当前标题的子树。 复选框(见 Checkboxes)未选中时转为 ‘TODO’ 关键字,选中时转为 ‘DONE’ 关键字。

S-LEFT, S-RIGHT

当光标在项目符号上或项行任意位置时,该命令也会循环切换项目符号样式, 具体细节取决于 org-support-shift-select

C-c ^

对普通列表排序。提示选择排序方式:数字、字母、时间或自定义函数。


2.7 Drawers

有时需要保存与条目关联的信息,但通常不希望显示。 为此 Org 模式提供了 抽屉(drawers) 。 抽屉可容纳除标题与其他抽屉外的任意内容。抽屉格式如下:

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

可通过调用绑定在 C-c C-x d 上的 org-insert-drawer 命令, 在光标处交互式插入抽屉。存在激活区域时,该命令会将区域放入抽屉。 搭配前缀参数时,调用非交互式函数 org-insert-property-drawer , 在当前标题下方创建 ‘PROPERTIES’ 抽屉。 Org 模式使用该特殊抽屉存储属性(见 Properties and Columns),不可用作其他用途。

也可通过 M-TAB 对抽屉关键字补全16

对标题执行显示状态循环(见 Visibility Cycling)时,会隐藏或显示条目, 但抽屉始终折叠为单行。若要查看抽屉内部,需将光标移至抽屉行并按下 TAB

还可设置将状态变更记录(见 Tracking TODO state changes) 与计时时间(见 Clocking Work Time)保存在 ‘LOGBOOK’ 抽屉中。 若要像状态变更一样快速添加备注,可使用:

C-c C-z

向 ‘LOGBOOK’ 抽屉添加带时间戳的备注。


2.8 Blocks

Org 模式使用 ‘#+BEGIN’ … ‘#+END’ 块实现多种用途, 包括插入源代码示例(见 Literal Examples)、记录计时信息(见 Clocking Work Time)等。 在 ‘#+BEGIN’ 行按下 TAB 可折叠或展开这些块。 可通过配置变量 org-hide-block-startup 让所有块在启动时折叠, 或针对单个文件使用以下设置:

#+STARTUP: hideblocks
#+STARTUP: nohideblocks

3 Tables

Org 内置了一款高效易用的表格编辑器。借助 Emacs Calc 软件包,还支持类似电子表格的计算功能(参见 GNU Emacs Calculator Manual)。


3.1 Built-in Table Editor

Org 可以轻松在纯 ASCII 文本中排版表格。任何以 ‘|’ 作为首个非空白字符的行都会被视为表格的一部分。 ‘|’ 同时也用作列分隔符17。 此外,以 ‘|-’ 开头的行表示水平分隔线,用于显式分隔行。 第一条水平分隔线之前的行均为表头行。一个表格示例如下:

| Name  | Phone | Age |
|-------+-------+-----|
| Peter |  1234 |  17 |
| Anna  |  4321 |  25 |

在表格内按下 TABRETC-c C-c 时,表格会自动重新对齐。 TAB 还会跳至下一个单元格—RET 跳至下一行— 并在表格末尾或水平分隔线之前创建新的表格行。表格的缩进由第一行决定。 每次重新对齐时,水平分隔线会自动扩展至整个表格宽度。因此,要创建上面的表格,你只需输入:

|Name|Phone|Age|
|-

然后按下 TAB 对齐表格并开始填写内容。 更快的方式是输入 ‘|Name|Phone|Age’ ,随后按下 C-c RET

在单元格中输入文本时,Org 会对 DELBackspace 以及所有字符按键做特殊处理,确保插入和删除操作不会打乱其他单元格。 此外,在通过 TABS-TABRET 移动到新单元格后 立即(immediately) 输入内容时,该单元格会自动清空。 如果你觉得该行为不够可控,可配置选项 org-table-auto-blank-field

Creation and conversion

C-c | (org-table-create-or-convert-from-region)

将选中区域转换为表格。如果每行至少包含一个 TAB 字符, 函数会判定内容为制表符分隔。如果每行包含逗号,则判定为逗号分隔值(CSV)。 否则按空白字符分割为单元格。你可以使用前缀参数强制指定分隔符: C-u 强制为 CSV,C-u C-u 强制为 TABC-u C-u C-u 会提示输入匹配分隔符的正则表达式, 数字前缀参数 N 表示至少连续 N 个空格或一个 TAB 作为分隔符。

如果没有选中区域,该命令会创建一个空的 Org 表格。 不过更简单的方式是直接开始输入,例如 | N a m e | P h o n e | A g e RET | - TAB

Re-aligning and field motion

C-c C-c (org-table-align)

重新对齐表格,光标位置不变。

TAB (org-table-next-field)

重新对齐表格,跳至下一个单元格,必要时创建新行。

M-x org-table-blank-field

清空当前表格单元格或选中区域。

S-TAB (org-table-previous-field)

重新对齐表格,跳至上一个单元格。

RET (org-table-next-row)

重新对齐表格并跳至下一行,必要时创建新行。 在行首或行尾时,RET 仍会插入新行,因此可用于拆分表格。

M-a (org-table-beginning-of-field)

跳至当前表格单元格开头,或跳至上一个单元格。

M-e (org-table-end-of-field)

跳至当前表格单元格末尾,或跳至下一个单元格。

Column and row editing

M-LEFT (org-table-move-column-left)

将当前列左移。

M-RIGHT (org-table-move-column-right)

将当前列右移。

M-S-LEFT (org-table-delete-column)

删除当前列。

M-S-RIGHT (org-table-insert-column)

在光标位置插入新列,将当前列及右侧所有单元格右移。

M-UP (org-table-move-row-up)

将当前行上移。

M-DOWN (org-table-move-row-down)

将当前行下移。

M-S-UP (org-table-kill-row)

与上方相邻单元格交换位置,实现单元格上移。

S-UP (org-table-move-cell-up)

Move cell up by swapping with adjacent cell.

S-DOWN (org-table-move-cell-down)

与下方相邻单元格交换位置,实现单元格下移。

S-LEFT (org-table-move-cell-left)

与左侧相邻单元格交换位置,实现单元格左移。

S-RIGHT (org-table-move-cell-right)

与右侧相邻单元格交换位置,实现单元格右移。

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)

对区域内的表格行排序。光标位置指定排序列, 行范围为最近的水平分隔线之间的区域或整个表格。 如果光标在第一列之前,会提示选择排序列。 如果存在选中区域,标记指定首行与排序列,光标应位于排序包含的最后一行。 命令会提示排序类型:字母序、数字序或时间序。 可选择正序或倒序,也可使用自定义的键提取与比较函数。 带前缀参数调用时,字母排序区分大小写。

Regions

C-c C-x M-w (org-table-copy-region)

将表格中的矩形区域复制到专用剪贴板。 光标与标记确定矩形的边界单元格。若无选中区域,则仅复制当前单元格。 该过程会忽略水平分隔线。

C-c C-x C-w (org-table-cut-region)

将表格中的矩形区域复制到专用剪贴板,并清空该矩形内所有单元格,即 “剪切(cut)” 操作。

C-c C-x C-y (org-table-paste-rectangle)

将矩形区域粘贴到表格中,左上角对齐当前单元格,覆盖所有相关单元格。 如果矩形大小超出当前表格,表格会按需扩展。该过程忽略水平分隔线。

M-RET (org-table-wrap-region)

在光标位置拆分当前单元格,将剩余内容移至下一行。 如果存在选中区域且光标与标记在同一列,该列文本会自动换行至指定行数的最小宽度。 数字前缀参数可修改目标行数。若无选中区域但指定前缀参数, 则清空当前单元格,并将内容追加到上方单元格。

Calculations

C-c + (org-table-sum)

对当前列或选中区域矩形内的数字求和。 结果显示在回显区,可通过 C-y 插入。

S-RET (org-table-copy-down)

当前单元格为空时,从上方第一个非空单元格复制内容。 不为空时,将当前单元格内容复制到下一行并同步移动光标。

根据变量 org-table-copy-increment 的设置, 整数、时间戳字段以及前后带整数的字段在复制时可自动递增。 前缀参数 0 可临时禁用递增功能。

该快捷键同样用于选区切换及相关模式(详见 Packages that conflict with Org mode)。

Miscellaneous

C-c ` (org-table-edit-field)

在独立窗口中编辑当前单元格,适用于内容无法完全显示的单元格(详见 Column Width and Alignment)。 带一个 C-u 前缀调用时,仅完整显示单元格以便原地编辑。 带两个 C-u 前缀调用时,编辑窗口会跟随光标在表格中移动并始终显示当前单元格。 跟随模式在光标离开表格或重复执行 C-u C-u C-c ` 时自动退出。

M-x org-table-import

导入文件作为表格。表格内容应为制表符或空白字符分隔。 例如可用于导入电子表格或数据库数据,这类程序通常可导出制表符分隔的文本文件。 该命令先将文件插入缓冲区,再将区域转换为表格。 所有前缀参数都会传递给转换器,用于确定分隔符。

C-c | (org-table-create-or-convert-from-region)

也可通过以下方式导入表格:将表格文本粘贴到 Org 缓冲区, 使用 C-x C-x 选中粘贴内容,然后执行 C-c | 命令(详见 Creation and conversion)。

M-x org-table-export

导出表格,默认格式为制表符分隔文件,用于与电子表格或数据库程序交换数据。 导出格式可通过变量 org-table-export-default-format 配置。 也可使用属性 ‘TABLE_EXPORT_FILE’ 与 ‘TABLE_EXPORT_FORMAT’ 在子树中指定导出文件名与格式。Org 支持非常通用的表格导出格式, 导出器格式与 Orgtbl 无线电表格所用格式一致,详见 Translator functions

M-x org-table-header-line-mode

当表格首行数据在缓冲区中不可见时,在窗口标题栏显示该行内容。 可将选项 org-table-header-line-p 设置为 t 以默认启用该次要模式。

M-x org-table-transpose-table-at-point

对光标处的表格进行转置并移除水平分隔线。


3.2 Column Width and Alignment

列宽由表格编辑器自动确定。 列的对齐方式则根据该列中数值型与非数值型单元格的占比自动判断。

编辑单元格可能会改变表格的对齐方式。 移动连续的行或列——例如使用 TABRET—会自动重新对齐表格。 如果你想禁用该行为,可将 org-table-automatic-realign 设置为 nil 。 无论如何,你都可以手动对齐表格:

C-c C-c (org-table-align)

对齐当前表格。

设置选项 org-startup-align-all-tables 会在打开文件时重新对齐文件内所有表格。 你也可以按单个文件设置该选项:

#+STARTUP: align
#+STARTUP: noalign

有时单个或少数单元格需要容纳较多文本,会导致列宽过大,使用不便。 你可能希望隐藏若干列,或按固定宽度显示而不考虑内容,如下例所示。

|---+---------------------+--------|           |---+-------…+…|
|   | <6>                 |        |           |   | <6>   …|…|
| 1 | one                 | some   |   ----\   | 1 | one   …|…|
| 2 | two                 | boring |   ----/   | 2 | two   …|…|
| 3 | This is a long text | column |           | 3 | This i…|…|
|---+---------------------+--------|           |---+-------…+…|

要设置列宽,可在该列任意一个单元格中只填写字符串 ‘<N>’ , 其中 N 为以字符数表示的宽度。 你可以使用以下工具控制列的显示宽度:

C-c TAB (org-table-toggle-column-width)

收缩或展开当前列。

如果某列通过宽度标记指定了宽度 W,收缩时只显示前 W 个可见字符。 否则该列会收缩至仅一个字符宽度。

若在第一列之前或最后一列之后调用,会提示输入要操作的列范围列表。

C-u C-c TAB (org-table-shrink)

收缩所有设置了宽度的列,展开其余列。

C-u C-u C-c TAB (org-table-expand)

展开所有列。

将鼠标悬停在收缩后的单元格上即可查看完整文本, 提示窗口会显示该单元格的全部内容。 或者使用 C-h . (display-local-help) 也可显示完整内容。 为方便使用,在收缩列附近进行任何修改都会自动展开该列。

设置选项 org-startup-shrink-all-tables 会在打开文件时立即收缩所有包含宽度标记的列。 你也可以按单个文件设置:

#+STARTUP: shrink

如果你想覆盖自动对齐规则(数值多的列右对齐、文本多的列左对齐), 可以类似地使用 ‘<r>=、=<c>’ 或 ‘<l>’ 。 你还可以同时设置对齐方式和列宽,例如 ‘<r10>’ 。

仅包含这些格式标记的行会在导出文档时自动移除。


3.3 Column Groups

Org 导出表格时默认不显示竖线,因为这样通常视觉效果更好。 但有时竖线有助于将表格按列分组,就像横线可以按行分组一样。 要指定列组,可以使用一行特殊格式,该行第一个单元格只填写 ‘/=。 后续单元格可以用 =<’ 表示该列开始一个分组, ‘>’ 表示该列结束一个分组, 或者 ‘<>’ ( ‘<’ 和 ‘>’ 之间无空格)表示该列单独成组。 导出时,列组之间的边界会用竖线标记。示例如下:

| N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
|---+-----+-----+-----+---------+------------|
| / |  <  |     |  >  |       < |          > |
| 1 |  1  |  1  |  1  |       1 |          1 |
| 2 |  4  |  8  | 16  |  1.4142 |     1.1892 |
| 3 |  9  | 27  | 81  |  1.7321 |     1.3161 |
|---+-----+-----+-----+---------+------------|
#+TBLFM: $2=$1^2::$3=$1^3::$4=$1^4::$5=sqrt($1)::$6=sqrt(sqrt(($1)))

更简单的方式是,在你希望出现竖线的位置后方插入列组起始标记即可:

| N | N^2 | N^3 | N^4 | sqrt(n) | sqrt[4](N) |
|---+-----+-----+-----+---------+------------|
| / | <   |     |     | <       |            |

3.4 The Orgtbl Minor Mode

如果你喜欢 Org 表格编辑器直观的操作方式, 也可以在文本模式、邮件模式等其他模式中使用。 Orgtbl 次要模式可以实现这一点。 你可以随时通过 M-x orgtbl-mode 切换该模式。 要默认启用,例如在消息模式中启用,可使用:

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

此外,通过一些特殊配置,还可以在 Orgtbl 模式下维护任意语法格式的表格。 例如,可以借助 Orgtbl 模式便捷强大的功能(包括电子表格计算能力)来编写 LaTeX 表格。 详情参见 Tables in Arbitrary Syntax


3.5 The Spreadsheet

表格编辑器借助 Emacs Calc 软件包实现了类似电子表格的功能。 它还可以执行 Emacs Lisp 表达式,根据其他单元格的值计算出新单元格的内容。 尽管功能完备,Org 的实现与其他电子表格并不完全相同。 例如,Org 引入了 列公式(column formula) 的概念:一条公式即可应用于整列的所有非表头单元格, 无需将公式复制到每个相关单元格。此外还提供公式调试器, 以及具备以下特性的公式编辑器:高亮表格中与光标所在公式引用对应的单元格, 并可通过方向键移动这些引用。


3.5.1 References

要根据表格中其他单元格计算当前单元格,公式必须引用其他单元格或区域。 在 Org 中,单元格可以通过名称、绝对坐标和相对坐标引用。 若要查看某个单元格的坐标,可在该单元格内按下 C-c ?, 或按下 C-c } 切换显示坐标网格。

Field references

公式可以通过两种方式引用其他单元格的值。 与其他电子表格一样,你可以用字母+数字的组合如 ‘B3’ 引用单元格, 表示第三行第二个单元格。不过 Org 更推荐使用另一种更通用的表示形式,形如:18

@ROW$COLUMN

列的指定方式可以是绝对引用,如 ‘$1’ 、 ‘$2’ 、…、 ‘$N’ , 也可以是相对于当前列(即正在计算的单元格所在列)的引用,如 ‘$+1’ 或 ‘$-2=。 =$<’ 和 ‘$>’ 分别固定指向第一列和最后一列, 你还可以用 ‘$>>>’ 表示从右数第三列。

行的编号只统计数据行,忽略水平分隔线(hline)。 与列类似,你可以使用绝对行号 ‘@1’ 、 ‘@2’ 、…、 ‘@N’ , 以及相对于当前行的行号,如 ‘@+3’ 或 ‘@-1=。 =@<’ 和 ‘@>’ 分别固定指向表格第一行和最后一行。 你还可以相对于某条水平分隔线指定行: ‘@I’ 指向第一条水平分隔线, ‘@II’ 指向第二条,依此类推。 ‘@-I’ 指向当前行上方的第一条分隔线, ‘@+I’ 指向下方的第一条分隔线。 你也可以写成 ‘@III+2’ ,表示表格第三条分隔线之后的第二行数据。

@0’ 和 ‘$0’ 分别指向当前行和当前列, 即正在计算结果的单元格所在行/列。 此外,如果省略引用中的行或列部分,则默认使用当前行/列。

Org 中 无符号数字unsigned() 的引用是固定引用: 如果在两个不同单元格的公式中使用相同引用,每次都指向同一个单元格。 带 符号数字(signed) 的引用是浮动引用: 同一个引用运算符会根据公式计算的目标单元格指向不同位置。

以下是一些示例:

@2$3第二行第三列(等同于 =C2=)
$5当前行第五列(等同于 =E&=)
@2当前列第二行
@-1$-3上一行、左三列的单元格
@-I$2当前行上方分隔线正下方、第二列的单元格
@>$5最后一行第五列的单元格

Range references

你可以通过两个单元格引用以两个点 ‘..’ 连接的方式,指定一个矩形单元格区域。 区域包含起止两个端点。 如果两个单元格都在当前行,你可以直接写成 ‘$2..$7’ ; 但如果至少有一个单元格在其他行,则至少第一个单元格需要使用完整的 ‘@ROW$COLUMN’ 格式, 即引用必须以 ‘@’ 开头才能被正确解析。示例:

$1..$3当前行前三个单元格
$P..$Q使用列名的区域(参见 Advanced features
$<<<..$>>从第三列开始到倒数第二列
@2$1..@4$3两个单元格之间的 9 个单元格(等同于 ‘A2..C4’ )
@-1$-2..@-1上一行从左数第二列开始的三个单元格
@I..II第一条与第二条分隔线之间,是 ‘@I..@II’ 的简写

区域引用会返回一个数值向量,可直接传入 Calc 的向量函数。 区域中的空单元格通常会被忽略,因此向量只包含非空单元格。 关于模式开关 ‘E=、=N’ 及其他选项与示例,参见 Formula syntax for Calc

Field coordinates in formulas

在执行 Calc 公式和 Lisp 公式时,最先执行的操作之一就是将公式中的 ‘@#’ 和 ‘$#’ 替换为当前结果单元格所在的行号和列号。 传统 Lisp 公式中对应的变量是 org-table-current-dline 和 ~org-table-current-column~。 示例:

if(@# % 2, $#, string(""))

奇数行显示列号,偶数行清空单元格。

$2 = '(identity remote(FOO, @@#$1))

将名为 FOO 的表格中每一行第一列的文本或数值, 复制到当前表格的第二列。

@3 = 2 * remote(FOO, @1$$#)

将名为 FOO 的表格中第一行每一列的值翻倍后, 写入当前表格的第三行。

第二、第三个示例中,表格 FOO 的行/列数至少要与当前表格相同。 注意这种方式效率较低19,不适用于大量行。

Named references

$name’ 会被解析为列名、参数或常量。 常量可以通过变量 org-table-formula-constants 全局定义, 也可以在文件内通过如下形式的行局部定义:

#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6

此外,属性(参见 Properties and Columns)也可作为表格公式中的常量: 对于属性 ‘Xyz’ ,可使用名称 ‘$PROP_Xyz’ , 系统会在当前大纲条目及上层层级中查找该属性。 如果你安装了 ‘constants.el’ 包,它也会被用于解析常量, 包括自然常数如 ‘$h’ 表示普朗克常数,以及单位如 ‘$km’ 表示千米20。 列名和参数可以在特殊的表格行中指定,详见下文 Advanced features。 所有名称必须以字母开头,后续可由字母和数字组成。

Remote references

你还可以引用当前文件甚至其他文件中另一张表格的常量、单元格和区域。 语法为:

remote(NAME,REF)

其中 NAME 可以是当前文件中某张表格的名称, 由表格前的 ‘#+NAME:’ 行设定;也可以是某个条目的 ID(即便在其他文件中), 此时引用指向该条目中的第一张表格。 REF 是上文所述的绝对单元格或区域引用, 例如 ‘@3$3’ 或 ‘$somename’ ,在被引用表格中有效。

NAME 格式为 ‘@ROW$COLUMN’ 时, 会被替换为当前表格该单元格中的名称或 ID。 例如 ‘remote($1, @@>$2)’ ⇒ ‘remote(year_2013, @@>$1)’ 。 不支持 ‘B3’ 格式,因为无法与普通表格名或 ID 区分。


3.5.2 Formula syntax for Calc

公式可以是 Emacs Calc 包能理解的任意代数表达式。 注意 Calc 有一个非标准约定: ‘/’ 的优先级低于 ‘*=, 因此 =a/b*c’ 会被解析为 ‘(a/(b*c))’ 。 在由 calc-eval 执行计算前(参见 从 Lisp 程序中调用 Calc]​)), 会按照上述规则进行变量替换。

区域向量可以直接传入 vmean~、~vsum 等 Calc 向量函数。

公式可以在分号后包含可选的模式字符串, 由一系列标志组成,用于影响执行期间 Calc 及其他模式的行为。 默认情况下,Org 使用标准 Calc 模式(精度 12、角度单位为度、分数与符号模式关闭)。 不过显示格式已改为 ‘(float 8)’ 以保持表格紧凑。 默认设置可通过变量 org-calc-default-modes 配置。

p20

将 Calc 内部计算精度设为 20 位。

n3’, ‘s3’, ‘e2’, ‘f4

将 Calc 计算结果以普通、科学、工程或定点格式返回给 Org。 只要 Calc 计算精度足够,其格式化精度不受限制。

D’, ‘R

Calc 的角度模式:角度制 / 弧度制。

F’, ‘S

Calc 的分数模式与符号模式。

u

Calc 的单位简化模式。Calc 同时也是符号计算器, 可以处理带单位的数值,在 Org 表格单元格中以数字后接单位字符串表示。 该模式指示 Calc 在返回结果前简化计算表达式中的单位。

T’, ‘t’, ‘U

Calc 或 Lisp 中的时长计算,参见 Durations and time values

E

是否以及如何处理空单元格。 不带 ‘E’ 时,区域引用中的空单元格会被忽略, Calc 向量或 Lisp 列表只包含非空值。 带 ‘E’ 时空单元格会被保留。 区域或单元格引用为空时,Calc 公式中使用 ‘nan’ (非数值), Lisp 公式中使用空字符串。添加 ‘N’ 可对两类公式都改用 0 代替空值。 对单个单元格而言,模式 ‘N’ 优先级高于 ‘E’ 。

N

将所有单元格按数值解析,非数值按 0 处理。 下一节会说明这对 Lisp 公式计算至关重要。 在 Calc 公式中偶尔使用,因为不带 ‘N’ 时数串已会被解析为数值。

L

字面量模式(Literal),仅用于 Lisp 公式。见下一节。

你还可以提供一个类似 printf 的格式说明符 format21,在 Calc 将计算结果返回给 Org 之后重新格式化,而不是由 Calc 自行处理格式。以下是几个示例:

$1+$2第一、第二单元格之和
$1+$2;%.2f同上,结果保留两位小数
exp($2)+exp($1)可使用数学函数
$0;%.1f将当前单元格重新格式化为一位小数
($3-32)*5/9华氏度转摄氏度
$c/$1/$cm利用 ‘constants.el’ 实现赫兹转厘米
tan($1);Dp3s1角度制计算,精度 3,科学计数法显示 1 位
sin($1);Dp3%.1e同上,但使用 format 格式化字符串控制显示
vmean($2..$7)使用向量函数计算列区域平均值
vmean($2..$7);EN同上,但将空单元格视为 0
taylor($3,x=7,2)$3 在 x=7 处的二阶泰勒展开式

Calc 还包含完整的逻辑运算集合(参见 逻辑运算)。例如:

if($1 < 20, teen, string(""))

若年龄 ‘$1’ 小于 20 则显示 ‘"teen"’ ,否则 Org 表格结果单元格置空。

if("$1" =​= "nan" || "$2" =​= "nan", string(""), $1 + $2); E f-1

前两列之和。若任一输入单元格为空,则结果单元格置空。 ‘E’ 用于避免将空单元格转为 0。 ‘f-1’ 是可选的 Calc 格式字符串, 类似 ‘%.1f’ ,但会保留空结果。

if(typeof(vmean($1..$7)) =​= 12, string(""), vmean($1..$7)); E

计算区域的平均值,若区域中存在任意空单元格则结果为空。 区域内的每个空单元格都会被替换为 ‘nan’ ,这会导致 ‘vmean’ 函数返回 ‘nan’ 。 随后 ‘typeof =’ 12= 会检测出 ‘vmean’ 返回的 ‘nan’ ,并将 Org 表格的结果单元格设为空。 当预期数据集永远不会存在缺失值时,使用此方式。

if("$1..$7" =​= "[]", string(""), vmean($1..$7))

区域平均值,跳过空单元格。 区域内所有空单元格均被忽略;若全部为空则平均值无定义,结果置空。 适用于数据集大小可变的场景。

vmean($1..$7); EN

区域平均值,空单元格按 0 计算。 仅适用于需要用 0 填充不完整样本的场景。

你可以用 defmath 在 Emacs Lisp 中自定义 Calc 函数,并在 Calc 公式语法中使用。


3.5.3 Emacs Lisp forms as formulas

也可以使用 Emacs Lisp 编写公式。如果 Calc 的功能不足以满足需求,这种方式在字符串处理和控制结构方面会非常有用。

当公式以单引号后跟左括号开头时,会被当作 Lisp 表达式求值。表格单元格引用会在执行前代入到 Lisp 表达式中。求值结果应当为字符串或数字。求值模式以及用于渲染返回值的 format 字符串(类似 printf22 可以在分号后指定。

默认情况下,单元格引用会作为字面量 Lisp 字符串代入:字段内容会去除首尾空白后,用双引号包裹并替换到 Lisp 表达式中。例如:

'(concat $1 $2)

会将第 1 列和第 2 列的内容拼接在一起。

使用 ‘N’ 标记时,所有引用的元素会被解析为数字,并作为无引号的 Lisp 数字代入。无法解析为数字的字段会以 0 代入。例如:

'(+ $1 $2);N

会将第 1 列和第 2 列相加,等价于 Calc 中的 ‘$1+$2’ 。范围会以空格分隔的字段形式插入,因此可以嵌入到列表或向量语法中。例如:

'(apply '+ '($1..$4));N

计算第 1 列到第 4 列的和,与 Calc 的 ‘vsum($1..$4)’ 效果相同。

使用 ‘L’ 标记时,所有字段会按字面量代入:单元格内容去除首尾空白后,不带引号直接替换到 Lisp 表达式中。如果希望 Lisp 表达式将某个引用当作字符串处理,需要将引用本身用双引号包裹,例如 ‘"$3"’ 。 ‘L’ 标记在同一个 Lisp 表达式中同时使用字符串和数字时非常实用。例如:

'(substring "$1" $2 $3);L

提取第 1 列字符串中,由第 2、3 列整数指定的字符位置之间的子串,可读性优于等价写法:

'(substring $1 (string-to-number $2) (string-to-number $3))

如果公式本身包含 ‘;’ 符号,Org mode 可能会错误地将分号后的内容当作格式说明符:

'(concat $1 ";")

可以在末尾额外添加一个 ‘;’ ,表示前面所有的 ‘;’ 都属于公式本身:

'(concat $1 ";");

3.5.4 Durations and time values

如果需要计算时间值,可以在 Calc 公式或 Elisp 公式中使用 ‘T’ 、 ‘t’ 或 ‘U’ 标记:

|  Task 1 |   Task 2 |    Total |
|---------+----------+----------|
|    2:12 |     1:47 | 03:59:00 |
|    2:12 |     1:47 |    03:59 |
| 3:02:20 | -2:07:00 |     0.92 |
#+TBLFM: @2$3=$1+$2;T::@3$3=$1+$2;U::@4$3=$1+$2;t

输入的时长必须为 ‘HH:MM[:SS]’ 格式,秒数部分可选。使用 ‘T’ 标记时,计算出的时长以 ‘HH:MM:SS’ 格式显示(见上方第一个公式)。使用 ‘U’ 标记时会省略秒数,结果仅为 =HH:MM=(见上方第二个公式)。小时字段是否补前导零由变量 org-table-duration-hour-zero-padding 决定。

使用 ‘t’ 标记时,计算出的时长会根据选项 org-table-duration-custom-format 的值显示,该选项默认为 hours ,结果以小时小数形式展示(见示例中第三个公式)。

负时长同样可以参与运算,加减法中的整数会被当作秒数处理。


3.5.5 Field and range formulas

要为某个特定字段指定公式,可以直接在字段中输入,以 ‘:=’ 开头,例如 ‘vsum(@II..III)’ 。当光标仍在该字段内时按下 TABRETC-c C-c,公式会被保存为该字段的公式并执行,当前字段会被结果替换。

公式会保存在表格正下方专用的 ‘TBLFM’ 关键字中。如果在表格第三行数据的第四个字段输入公式,形式为 ‘@3$4=$1+$2’ 。使用相应命令插入、删除或交换行列时,已保存公式中的 绝对引用(absolute reference) (而非相对引用)会自动调整,以保持指向原单元格。为避免这种情况,尤其是在范围引用中,可将范围锚定在表格边界(使用 ‘@<’ 、 ‘@>’ 、 ‘$<’ 、 ‘$>’ )或使用 ‘@I’ 标记锚定在水平分隔线上。如果使用普通编辑命令修改表格结构,字段引用不会自动适配,需要手动修正公式。

除了直接在字段中输入等式,也可以使用以下命令:

C-u C-c = (org-table-eval-formula)

为当前字段设置新公式。该命令会提示输入公式,默认值取自 ‘TBLFM’ 关键字,应用到当前字段并保存。

公式左侧也可以使用特殊表达式,将公式应用到多个不同字段。这类范围公式没有快捷键,可通过公式编辑器(见 Editing and debugging formulas)或直接编辑 ‘TBLFM’ 关键字添加。

$2=

列公式,对整列生效。这类用法非常常见,Org 会对其做特殊处理,详见 Column formulas

@3=

行公式,应用到指定行的所有字段。 ‘@>=’ 表示最后一行。

@1$2..@4$3=

范围公式,应用到指定矩形区域内的所有字段。也可用于为某一行中的部分字段指定公式。

$NAME=

命名字段,详见 Advanced features


3.5.6 Column formulas

当为简单列引用(如 ‘$3=’ )指定公式时,该列所有字段都会使用同一公式,但有以下便捷例外:(i) 如果表格包含水平分隔线,且分隔线上下均有数据行,第一条分隔线以上的内容会被视为表格表 ,列公式不会修改表头内容。因此,使用列公式并希望用分隔线分组行时(例如将底部总计行与上方求和行分开),必须设置表头。(ii) 已通过字段/范围公式赋值的字段,列公式不会覆盖。这些规则让列公式使用起来非常简便。

要为某列指定公式,可直接在该列任意字段输入,以等号开头,例如 ‘=$1+$2’ 。当光标仍在该字段内时按下 TABRETC-c C-c,公式会保存为当前列的公式并执行,当前字段被结果替换。如果字段仅包含 ‘=’ ,则使用该列之前保存的公式。Org 对每一列只记录最近使用的公式。在 ‘TBLFM’ 关键字中,列公式形如 ‘$4=$1+$2’ 。列公式左侧不能使用列名,必须为数字列引用或 ‘$>’ 。

除了直接在字段中输入等式,也可以使用以下命令:

C-c = (org-table-eval-formula)

为当前列设置新公式,并将当前字段替换为公式结果。命令会提示输入公式,默认值取自 ‘TBLFM’ 关键字,应用到当前字段并保存。若带数字前缀参数,例如 C-5 C-c =,则会将公式应用到当前列连续指定数量的字段。


3.5.7 Lookup functions

Org 内置了三个 Emacs Lisp 函数用于表格查找。

(org-lookup-first VAL S-LIST R-LIST &optional PREDICATE)

在列表 S-LIST 中查找第一个使

(PREDICATE VAL S)

nil 的元素 S,并返回列表 R-LIST 中对应位置的值。默认 PREDICATEequal 。注意参数 VALS 传入 PREDICATE 的顺序与 org-lookup-first 调用时一致,即 VALS-LIST 之前。若 R-LISTnil ,则返回 S-LIST 中匹配的元素 S

(org-lookup-last VAL S-LIST R-LIST &optional PREDICATE)

与上述 org-lookup-first 类似,但查找使 PREDICATEnil 的最后一个元素。

(org-lookup-all VAL S-LIST R-LIST &optional PREDICATE)

org-lookup-first 类似,但查找 所有 使 PREDICATEnil 的元素,并返回 所有 对应值。该函数不能单独在公式中使用,因为它返回值列表。但与其他 Emacs Lisp 函数结合时,可实现强大的查找功能。

如果这些函数使用的范围包含空字段,通常需要为公式指定 ‘E’ 模式,否则空字段不会被包含在 S-LIST 和/或 R-LIST 中,可能导致 S-LIST 元素与 R-LIST 元素映射错误。

这三个函数可用于实现关联数组、统计匹配单元格、结果排序、数据分组等。实用示例参见 Worg 上的教程


3.5.8 Editing and debugging formulas

可以在迷你缓冲区或直接在字段中编辑单个公式。Org 也可以打开专用缓冲区,显示表格所有生效公式。提供公式编辑时,Org 会尽可能将引用转为标准格式(如 ‘B3’ 或 ‘D&’ )。如果希望只使用内部格式(如 ‘@3$2’ 或 ‘$4’ ),可配置变量 org-table-use-standard-references

C-c =C-u C-c = (org-table-eval-formula)

在迷你缓冲区中编辑当前列/字段关联的公式。详见 Column formulasField and range formulas

C-u C-u C-c = (org-table-eval-formula)

将当前生效公式(字段公式或列公式)重新插入当前字段,可直接在字段内编辑。相比迷你缓冲区编辑,优势是可以使用 C-c ? 命令。

C-c ? (org-table-field-info)

在表格字段中编辑公式时,高亮光标所在引用指向的字段。

C-c } (org-table-toggle-coordinate-overlays)

通过覆盖层开关表格行号和列号的显示。表格对齐时会自动更新,也可通过 C-c C-c 强制刷新。

C-c { (org-table-toggle-formula-debugger)

开关公式调试器。详见下文。

C-c ' (org-table-edit-formulas)

在专用缓冲区中编辑当前表格的所有公式,每行显示一个公式。如果当前字段有生效公式,公式编辑器光标会定位到该公式。在专用缓冲区中,Org 会自动高亮光标所在的字段或范围引用。可编辑、删除、添加公式,并使用以下命令:

C-c C-c or C-x C-s (org-table-fedit-finish)

退出公式编辑器并保存修改后的公式。带 C-u 前缀时,会同时将新公式应用到整个表格。

C-c C-q (org-table-fedit-abort)

退出公式编辑器且不应用修改。

C-c C-r (org-table-fedit-toggle-ref-type)

在公式编辑器中切换所有引用的显示格式,在标准格式(如 ‘B3’ )和内部格式(如 ‘@3$2’ )之间切换。

TAB (org-table-fedit-lisp-indent)

对光标所在的 Lisp 公式进行美化打印或缩进。当行内包含 Lisp 公式时,按 Emacs Lisp 规则格式化。再次按下 TAB 会将公式折叠回去。展开的公式中,TAB 会像在 Emacs Lisp 模式中一样重新缩进。

M-TAB (lisp-complete-symbol)

补全 Lisp 符号,与 Emacs Lisp 模式一致。

S-UP, S-DOWN, S-LEFT, S-RIGHT

移动光标所在的引用。例如引用为 ‘B3’ 时按下 S-RIGHT,会变为 ‘C3’ 。相对引用和分隔线引用同样适用。

M-S-UP (org-table-fedit-line-up)

在 Org 缓冲区中将列公式的测试行上移。

M-S-DOWN (org-table-fedit-line-down)

在 Org 缓冲区中将列公式的测试行下移。

M-UP (org-table-fedit-scroll-up)

向上滚动显示表格的窗口。

M-DOWN (org-table-fedit-scroll-down)

向下滚动显示表格的窗口。

C-c }

开关表格中的坐标网格显示。

将表格字段置空并不会删除该字段关联的公式,因为公式保存在独立的 ‘TBLFM’ 关键字行中。下次重新计算时,字段会再次被填充。要删除字段的公式,需要在提示输入公式时给出空值,或直接编辑 ‘TBLFM’ 关键字。

可以直接编辑 ‘TBLFM’ 关键字,并在该行按下 C-c C-c 或使用表格常规重计算命令重新应用修改后的等式。

Using multiple ‘TBLFM’ lines

可以临时应用某个公式。在需要切换表格应用的公式时非常实用。在表格下方放置多个 ‘TBLFM’ 关键字,然后在对应公式行按下 C-c C-c 即可应用。示例如下:

| x | y |
|---+---|
| 1 |   |
| 2 |   |
#+TBLFM: $2=$1*1
#+TBLFM: $2=$1*2

在 ‘#+TBLFM: $2=$1*2’ 行按下 C-c C-c 后结果为:

| x | y |
|---+---|
| 1 | 2 |
| 2 | 4 |
#+TBLFM: $2=$1*1
#+TBLFM: $2=$1*2

如果使用 C-u C-c * 重计算表格,只会应用第一个 ‘TBLFM’ 关键字,结果如下:

| x | y |
|---+---|
| 1 | 1 |
| 2 | 2 |
#+TBLFM: $2=$1*1
#+TBLFM: $2=$1*2

Debugging formulas

当公式求值出错时,字段内容会变为字符串 ‘#ERROR’ 。如果希望查看变量替换和计算过程以排查错误,可以在表格菜单中开启公式调试,然后重新计算,例如在字段中按下 C-u C-u C-c = RET,会显示详细信息。


3.5.9 Updating the table

表格通常不会自动重计算,需要通过命令触发。如需实现至少半自动重计算,详见 Advanced features

重计算表格某一行或整个表格可使用以下命令:

C-c * (org-table-recalculate)

重计算当前行:先从左到右应用已保存的列公式,再执行当前行所有字段/范围公式。

C-u C-c * or C-u C-c C-c

逐行重计算整个表格。第一条水平分隔线以上的行会被忽略,视为表头。

C-u C-u C-c * or C-u C-u C-c C-c (org-table-iterate)

迭代重计算表格,直到不再发生变化。当某些计算字段依赖计算顺序更 靠后 的其他字段时,需要使用该命令。

M-x org-table-recalculate-buffer-tables

重计算当前缓冲区中的所有表格。

M-x org-table-iterate-buffer-tables

迭代当前缓冲区中的所有表格,使表格间依赖关系收敛。


3.5.10 Advanced features

如果希望字段自动重计算,或为字段和列指定 名称23,需要将表格第一列预留为特殊标记字符。

C-# (org-table-rotate-recalc-marks)

将第一列的计算标记在 ‘#’ 、 ‘*’ 、 ‘!’ 、 ‘$’ 之间循环切换。若有选中区域,则修改区域内所有标记。

以下示例表格用于统计学生考试成绩,并使用了这些功能:

|---+---------+--------+--------+--------+-------+------|
|   | Student | Prob 1 | Prob 2 | Prob 3 | Total | Note |
|---+---------+--------+--------+--------+-------+------|
| ! |         |     P1 |     P2 |     P3 |   Tot |      |
| # | Maximum |     10 |     15 |     25 |    50 | 10.0 |
| ^ |         |     m1 |     m2 |     m3 |    mt |      |
|---+---------+--------+--------+--------+-------+------|
| # | Peter   |     10 |      8 |     23 |    41 |  8.2 |
| # | Sam     |      2 |      4 |      3 |     9 |  1.8 |
|---+---------+--------+--------+--------+-------+------|
|   | Average |        |        |        |  25.0 |      |
| ^ |         |        |        |        |    at |      |
| $ | max=50  |        |        |        |       |      |
|---+---------+--------+--------+--------+-------+------|
#+TBLFM: $6=vsum($P1..$P3)::$7=10*$Tot/$max;%.1f::$at=vmean(@-II..@-I);%.1f

Important: 注意,对于此类特殊表格,使用 C-u C-c * 重计算时,仅影响标记为 ‘#’ 或 ‘*’ 的行,以及本身带有公式的字段。第一列为空的行不会应用列公式。

标记字符含义如下:

!

该行字段用于定义列名,可使用 ‘$Tot’ 代替 ‘$6’ 引用该列。

^

该行为 上方 的字段定义名称。定义后,表格中任意公式可使用 ‘$m1’ 引用值 ‘10’ 。此外,为命名字段指定公式时,会保存为 ‘$name = ...’ 。

_

与 ‘^’ 类似,但为 下方 行的字段定义名称。

$

该行字段可定义公式 参数 。例如 ‘$’ 行某字段为 ‘max=50’ ,表格中公式可使用 ‘$max’ 引用 50。参数与常量用法完全一致,仅支持按表格单独定义。

#

在该行按下 TABRETS-TAB 时,字段会自动重计算。同时,使用 C-u C-c * 全局重计算时会包含该行。未标记行不会被该命令处理。

*

使用 C-u C-c * 全局重计算时包含该行,但不参与自动重计算。适合自动重计算影响编辑效率的场景。

/

不导出该行。适用于包含收缩标记 ‘<N>’ 或列分组标记的行。

最后,为展示强大的 Calc 包功能,以下表格计算了若干函数在 x 处的 n 阶泰勒级数:

|---+-------------+---+-----+--------------------------------------|
|   | Func        | n | x   | Result                               |
|---+-------------+---+-----+--------------------------------------|
| # | exp(x)      | 1 | x   | 1 + x                                |
| # | exp(x)      | 2 | x   | 1 + x + x^2 / 2                      |
| # | exp(x)      | 3 | x   | 1 + x + x^2 / 2 + x^3 / 6            |
| # | x^2+sqrt(x) | 2 | x=0 | x*(0.5 / 0) + x^2 (2 - 0.25 / 0) / 2 |
| # | x^2+sqrt(x) | 2 | x=1 | 2 + 2.5 x - 2.5 + 0.875 (x - 1)^2    |
| * | tan(x)      | 3 | x   | 0.0175 x + 1.77e-6 x^3               |
|---+-------------+---+-----+--------------------------------------|
#+TBLFM: $5=taylor($2,$4,$3);n3

3.6 Org Plot

Org Plot 可以根据 Org 表格中存储的信息生成图表, 既可以是图形化图表,也可以是 ASCII 艺术图表。

Graphical plots using Gnuplot

Org Plot 可以借助 GnuplotGnuplot mode, 将 Org 表格中的数据生成二维与三维图表。 想要实际体验该功能,请先确保系统已安装 Gnuplot 与 Gnuplot mode, 随后将光标置于下方表格处,执行 C-c " gM-x org-plot/gnuplot

#+PLOT: title:"Citas" ind:1 deps:(3) type:2d with:histograms set:"yrange [0:]"
| Sede      | Max cites | H-index |
|-----------+-----------+---------|
| Chile     |    257.72 |   21.39 |
| Leeds     |    165.77 |   19.68 |
| Sao Paolo |     71.00 |   11.50 |
| Stockholm |    134.19 |   14.33 |
| Morelia   |    257.56 |   17.67 |

Org Plot 支持多种图表类型,也支持自行扩展更多类型。 例如可以按如下方式生成雷达图:

#+PLOT: title:"An evaluation of plaintext document formats" transpose:yes type:radar min:0 max:4
| Format            | Fine-grained-control | Initial Effort | Syntax simplicity | Editor Support | Integrations | Ease-of-referencing | Versatility |
|-------------------+----------------------+----------------+-------------------+----------------+--------------+---------------------+-------------|
| Word              |                    2 |              4 |                 4 |              2 |            3 |                   2 |           2 |
| LaTeX             |                    4 |              1 |                 1 |              3 |            2 |                   4 |           3 |
| Org Mode          |                    4 |              2 |               3.5 |              1 |            4 |                   4 |           4 |
| Markdown          |                    1 |              3 |                 3 |              4 |            3 |                   3 |           1 |
| Markdown + Pandoc |                  2.5 |            2.5 |               2.5 |              3 |            3 |                   3 |           2 |

可以看到 Org Plot 能够自动将表格表头用作图表标签。 通过表格前方的 ‘PLOT’ 关键字,还可以进一步控制图表的标签、类型、内容与外观。 下方列出 Org Plot 的全部可用选项。 更多说明与示例可参考 Org Plot tutorial

Plot options

set

指定绘图时需要设置的任意 Gnuplot 选项。

title

指定图表标题。

ind

指定表格中用作 ‘x’ 轴的列。

timeind

指定表格中用作 ‘x’ 轴时间值的列。

deps

以 Lisp 风格列表形式指定需要绘制的列,使用圆括号包裹、空格分隔, 例如 ‘dep:(3 4)’ 表示绘制第三列与第四列。 默认绘制除 ‘ind’ 指定列之外的所有列。

transpose

取值为 ‘y’ 、 ‘yes’ 或 ‘t’ 时,会在绘图前尝试转置表格数据。 也支持简写 ‘trans’ 。

type

指定图表类型,默认为 ‘2d’ 、 ‘3d’ 、 ‘radar’ 或 ‘grid’ 之一。 可用类型可通过 org-plot/preset-plot-types 自定义。

with

为所有待绘制列指定 ‘with’ 选项,例如 ‘lines’ 、 ‘points’ 、 ‘boxes’ 、 ‘impulses’ 。 默认为 ‘lines’ 。

file

若需要将图表输出至文件,可指定为 ‘"path/to/desired/output-file"’ 。

labels

为 ‘deps’ 指定的列设置标签列表。 若存在表头,默认使用列标题。

line

指定一整行内容,直接插入到 Gnuplot 脚本中。

map

绘制 ‘3d’ 或 ‘grid’ 类型图表时,将此项设为 ‘t’ 可绘制平面映射图,而非三维坡度图。

min

设置图表可使用的坐标轴最小值,默认指代 ‘y’ 轴。 可通过 ‘xmin’ 与 ‘ymin’ 分别显式指定 ‘x’ 轴与 ‘y’ 轴的最小值。

max

设置图表可使用的坐标轴最大值,默认指代 ‘y’ 轴。 可通过 ‘xmax’ 与 ‘ymax’ 分别显式指定 ‘x’ 轴与 ‘y’ 轴的最大值。

ticks

设置希望显示的坐标轴刻度数量,供对应图表类型使用。 若未指定,需要刻度的图表类型会通过 org--plot/sensible-tick-num 自动计算合适值。

timefmt

指定 Org 时间戳的格式,以便 Gnuplot 解析。 默认为 ‘%Y-%m-%d-%H:%M:%S’ 。

script

若需要完全自主控制,可指定一个脚本文件(文件名用双引号包裹)用于绘图。 绘图前,脚本中所有 ‘$datafile’ 都会被替换为生成的数据文件路径。 注意:即使设置了该选项,通常仍建议指定图表类型,因为它会影响数据文件内容。

ASCII bar plots

将光标置于某一列上,输入 C-c " a 或执行 M-x orgtbl-ascii-plot,即可新增一列并生成 ASCII 风格的柱状图。 该图表通过常规表格公式实现。当源列数据变化时, 可通过刷新表格更新柱状图,例如输入 C-u C-c *

| Sede          | Max cites |              |
|---------------+-----------+--------------|
| Chile         |    257.72 | WWWWWWWWWWWW |
| Leeds         |    165.77 | WWWWWWWh     |
| Sao Paolo     |     71.00 | WWW;         |
| Stockholm     |    134.19 | WWWWWW:      |
| Morelia       |    257.56 | WWWWWWWWWWWH |
| Rochefourchat |      0.00 |              |
#+TBLFM: $3='(orgtbl-ascii-draw $2 0.0 257.72 12)

该公式为 Elisp 调用。

Function: orgtbl-ascii-draw value min max &optional width

在表格中绘制 ASCII 柱状条。

VALUE 为待绘制的数据值。

MIN 对应空柱所代表的数值,MAX 对应填满整个 WIDTH 柱宽的数值。 超出该范围的源数据会显示为 ‘too small’ 或 ‘too large’ 。

WIDTH 为柱状图所占字符数,默认为 ‘12’ 。


5 TODO Items

Org mode 并不会将待办列表作为独立文档维护37。相反,待办事项是笔记文件的有机组成部分,因为待办事项通常是在记笔记的过程中产生的!使用 Org mode,只需将树形结构中的任意条目标记为待办事项即可。这样一来,信息不会重复,待办事项产生时的完整上下文也始终保留。

当然,这种管理待办事项的方式会将它们分散在整个笔记文件中。Org mode 为此提供了多种方法,让你可以概览所有需要完成的事务。


5.1 Basic TODO Functionality

任何标题以 ‘TODO’ 开头时,都会成为待办事项,例如:

*** TODO Write letter to Sam Fortune

用于操作 待办条目(TODO entries) 的最重要命令如下:

C-c C-t (org-todo)

在以下状态间循环切换当前条目的待办状态:

,-> (unmarked) -> TODO -> DONE --.
'--------------------------------'

如果待办关键字设有快速访问键(参见 Fast access to TODO states),则通过快速选择界面提示选择待办关键字;当 org-use-fast-todo-selection 为非 nil 时,这是默认行为。

同样的状态切换也可以在议程框架中通过 t 命令键 “远程(remotely)” 完成(参见 Commands in the Agenda Buffer)。

S-RIGHT S-LEFT

选择下一个/上一个待办状态,效果类似循环切换。 主要在存在多于两种待办状态时使用(参见 Extended Use of TODO Keywords)。关于与 Shift 选择功能的冲突说明, 另见 Packages that conflict with Org mode。 同时可参考变量 org-treat-S-cursor-todo-selection-as-state-change

C-c / t (org-show-todo-tree)

稀疏树(sparse tree) 中查看待办事项(参见 Sparse Trees)。折叠整个缓冲区, 但显示所有待办事项——非 DONE 状态——及其上方的标题层级。 携带前缀参数,或使用 C-c / T,可搜索特定待办事项。 系统会提示输入关键字,你也可以输入形如 ‘KWD1|KWD2|...’ 的关键字列表, 以列出匹配任一关键字的条目。携带数字前缀参数 N 时,显示变量 org-todo-keywords 中第 N 个关键字对应的树形结构。携带两个前缀参数时,查找所有待办状态,包括未完成和已完成。

M-x org-agenda t (org-todo-list)

显示全局待办列表。从所有议程文件中收集待办事项(非 DONE 状态) (参见 Agenda Views)并整合到单一框架中。 新框架处于 Org 议程模式,可在其中执行命令查看和操作待办条目 (参见 Commands in the Agenda Buffer)。 更多信息参见 The global TODO list

S-M-RET (org-insert-todo-heading)

在当前条目下方插入新的待办条目。

修改待办状态时也可触发标签变更。详情参见选项 org-todo-state-tags-triggers 的文档字符串。


5.2 Extended Use of TODO Keywords

默认情况下,标记的待办条目仅有两种状态:TODO 和 DONE。 Org mode 允许你通过 待办关键字(TODO keywords) (存储于 org-todo-keywords ) 以更复杂的方式分类待办事项。通过特殊配置,待办关键字系统可在不同文件中表现不同。

注意, 标签(tags) 是另一种通用的标题分类方式,尤其适用于待办事项(参见 Tags)。


5.2.1 TODO keywords as workflow states

你可以使用待办关键字表示处理事项过程中不同的、可能 连续(sequential) 的状态,例如38

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

竖线将待办关键字( 需要执行操作(need action) 的状态)与完成状态( 无需后续操作(no further action) )分隔开。 若未提供分隔竖线,则最后一个状态会被用作完成状态。

在此配置下,命令 C-c C-t 会将条目从 ‘TODO’ 循环切换至 ‘FEEDBACK=, 再到 =VERIFY’ ,最终到 ‘DONE’ 和 ‘DELEGATED’ 。 你也可以使用数字前缀参数快速选择特定状态。 例如 C-3 C-c C-t 会直接将状态改为 ‘VERIFY’ 。 或者使用 S-RIGHTS-LEFT 在状态间前后切换。 若定义了大量关键字,可使用缓冲区内补全(参见 Completion) 或专用单键选择方案(参见 Fast access to TODO states)将这些词插入缓冲区。 修改待办状态可附带时间戳记录;更多信息参见 Tracking TODO state changes


5.2.2 TODO keywords as types

第二种用法是使用待办关键字表示不同 类型(types) 的执行事项。 例如,你可能想区分事项属于 “工作(work)” 或 “家庭(home)”。 或者,当你与多人协作同一项目时,可直接将任务分配给对应人员, 将其姓名用作待办关键字。 此类功能实际上通过标签实现效果更佳(参见 Tags), 因此待办相关实现仅为保留向后兼容而存在。

使用待办类型的配置示例如下:

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

在此场景下,不同关键字不表示状态,而是不同类型。 因此常规工作流程是先将任务分配给某人,之后标记为 DONE。 Org mode 通过适配命令 C-c C-t 的行为支持该模式39。 连续多次使用时,它仍会循环遍历所有姓名,以便先为任务选择正确类型。 但当你隔一段时间回到该条目并再次执行 C-c C-t 时, 会从任意姓名直接切换至 =DONE=。 使用前缀参数或补全功能可快速选择特定姓名。 你也可以通过为 C-c / t 添加数字前缀, 在稀疏树中查看特定待办类型的事项。 例如,查看 Lucy 需完成的所有事务,可使用 C-3 C-c / t。 若要从所有议程文件中收集 Lucy 的事项至单一框架, 创建全局待办列表时同样使用数字前缀参数:C-3 M-x org-agenda t


5.2.3 Multiple keyword sets in one file

有时你可能希望并行使用多组待办关键字。 例如,你可能需要基础的 TODO/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’ 。 因此,你需要一种机制来初始选择正确的序列。 除直接输入关键字或使用补全外(参见 Completion), 还可使用以下命令:

C-u C-u C-c C-t, C-S-RIGHT, C-S-LEFT

这些按键可在待办子序列间跳转。 在上述示例中,C-u C-u C-c C-tC-S-RIGHT 会从 ‘TODO’ 或 ‘DONE’ 跳至 ‘REPORT’ , 并从第二行任意单词跳至 ‘CANCELED’ 。 注意 C-S- 按键绑定与 Shift 选择功能存在冲突(参见 Packages that conflict with Org mode)。

S-RIGHT, S-LEFT

S-LEFTS-RIGHT 会遍历所有子序列中的 全部 关键字, 例如在上例中 S-RIGHT 会从 ‘DONE’ 切换至 ‘REPORT’ 。 关于与 Shift 选择功能的冲突说明,参见 Packages that conflict with Org mode


5.2.4 Fast access to TODO states

若你希望快速将条目切换至任意待办状态,而非循环遍历, 可为各状态设置单键访问方式。 只需在每个关键字后用括号添加选择字符即可40。示例:

(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 可移除条目的所有待办关键字。


5.2.5 Setting up keywords for individual files

在不同文件中使用待办机制的不同特性会非常实用。 对于文件本地配置,需在文件中添加特殊行, 仅为该文件设置关键字及解析方式。 例如,设置上述任一示例,需在文件任意位置的行首添加以下某一行:

#+TODO: TODO FEEDBACK VERIFY | DONE CANCELED

你也可以写 ‘#+SEQ_TODO’ 以明确解析方式,其含义与 ‘#+TODO’ 相同,或:

#+TYP_TODO: Fred Sara Lucy Mike | DONE

并行使用多组关键字的配置示例:

#+TODO: TODO(t) | DONE(d)
#+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f)
#+TODO: | CANCELED(c)

为确保使用正确关键字,可在缓冲区输入 ‘#+’ 后 使用 M-TAB 进行补全(参见 Completion)。

记住,竖线后的关键字—或无竖线时的最后一个关键字— 必须始终表示事项已完成,即便你使用其他词汇。 修改此类行后,将光标停留在该行并使用 C-c C-c, 使 Org mode 识别变更41


5.2.6 Faces for TODO keywords

Org mode 使用专用文本的视觉样式高亮待办关键字: org-todo 用于表示仍需执行操作的关键字, org-done 用于表示已完成的关键字。 若使用多于两种状态,你可能希望为部分状态设置专用文本的视觉样式。 可通过变量 org-todo-keyword-faces 实现。示例:

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

虽然如 ‘CANCELED’ 所示使用文本的视觉样式属性列表 理应 生效, 但实际并非总能正常工作。如有必要,可定义专用文本的视觉样式并使用。 字符串会被解析为颜色。 变量 org-faces-easy-properties 决定该颜色被解析为前景色还是背景色。


5.2.7 TODO dependencies

Org 文件的结构—层级与列表—便于定义待办依赖关系。 通常,父待办任务应在所有子待办任务标记为完成后,方可标记为完成。 有时子任务存在逻辑顺序,即某一子任务需在其上方所有同级任务完成后才能执行。 若自定义变量 org-enforce-todo-dependencies , Org 会阻止存在未完成子待办事项的条目切换至 DONE 状态。 此外,若条目设有 ‘ORDERED’ 属性,其每个待办子项 都会被阻塞,直至所有更早的同级项标记为完成。示例如下:

* 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’ 属性确保条目永远不会被阻塞(参见 Properties and Columns):

* This entry is never blocked
:PROPERTIES:
:NOBLOCKING: t
:END:
C-c C-x o (org-toggle-ordered-property)

切换当前条目的 ‘ORDERED’ 属性。 该行为使用属性实现,因为此设置应仅作用于当前条目, 而非像标签一样从上层条目继承(参见 Tags)。 不过,若你希望通过标签 跟踪(track) 该属性值以提升可见性, 可自定义变量 org-track-ordered-property-with-tag

C-u C-u C-u C-c C-t

强制修改待办状态,忽略所有状态阻塞规则。

若设置变量 org-agenda-dim-blocked-tasks , 因存在未标记子项而无法标记为完成的待办条目, 会以淡化字体显示,甚至在议程视图中完全隐藏(参见 Agenda Views)。

你也可以通过复选框阻塞待办状态的修改(参见 Checkboxes)。 若设置变量 org-enforce-todo-checkbox-dependencies , 存在未勾选复选框的条目将无法切换至 DONE 状态。

若需要更复杂的依赖结构,例如不同树形结构或文件中条目间的依赖, 可查阅 ‘org-contrib’ 仓库中的 ‘org-depend.el’ 模块。


5.3 Progress Logging

若要在修改待办状态时记录时间戳与备注,可携带前缀参数调用命令 org-todo

C-u C-c C-t (org-todo)

提示输入备注,并记录待办状态的变更时间。 备注会作为列表项插入到标题下方,也可放入抽屉中,参见 Tracking TODO state changes

如果你希望更系统化地记录,Org mode 可以在将待办事项标记为完成时, 甚至每次修改待办状态时,自动记录时间戳并可选添加备注。 该系统高度可配置,可按关键字单独设置,也可限定在单个文件甚至子树中生效。 关于为任务记录工作时长的方法,参见 Clocking Work Time


5.3.1 Closing items

最基础的自动记录功能是跟踪某个待办事项 何时(when) 被标记为完成。 可通过以下配置实现42

(setq org-log-done 'time)

此后每次将条目从待办(未完成)状态切换至任一完成状态时, 都会在标题后插入一行 ‘CLOSED: [timestamp]’ 。 若后续通过状态循环将条目切回待办状态,该行会被移除。 若将条目切回非待办状态(例如按下 C-c C-t SPC), 该行同样会被移除,除非你将 org-closed-keep-when-no-todo 设置为非 nil 。 若希望在时间戳旁一并记录备注,可使用43

(setq org-log-done 'note)

随后会提示输入备注,该备注会以 ‘Closing Note’ 标题形式存储在条目下方。


5.3.2 Tracking TODO state changes

你可能希望自动记录状态变更时间,并可为此变更添加备注。 可以只记录时间戳,也可记录带时间戳的备注。 这些记录会以列表形式插入标题下方,最新记录排在最前44。 当备注数量较多时,你可能希望将其收纳到抽屉中以避免干扰(参见 Drawers)。 自定义变量 org-log-into-drawer 即可启用该行为—推荐使用的抽屉名为 ‘LOGBOOK45。 你也可以通过设置 ‘LOG_INTO_DRAWER’ 属性,为某一子树覆盖该变量的设置。

由于通常无需为每个状态变更都记录备注,Org mode 支持按关键字单独配置此项。 实现方式是在每个关键字后的括号中添加特殊标记 ‘!’ (表示记录时间戳)或 ‘@’ (表示记录带时间戳的备注)。 例如,使用如下配置:

(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))

你不仅定义了全局待办关键字和快速访问键, 还指定了条目设为 ‘DONE’ 时记录时间, 切换至 ‘WAIT’ 或 ‘CANCELED’ 时记录备注46。 ‘WAIT’ 的设置更为特殊:斜杠后的 ‘!’ 表示, 除进入该状态时记录备注外, 离开(leaving)WAIT’ 状态时也应记录时间戳, 且仅当 目标(target) 状态未配置进入记录时才生效。 因此从 ‘WAIT’ 切换至 ‘DONE’ 时不会触发, 因为 ‘DONE’ 已配置仅记录时间戳。 但从 ‘WAIT’ 切回 ‘TODO’ 时, ‘WAIT’ 设置中的 ‘/!’ 会触发时间戳记录, 即便 ‘TODO’ 未配置任何日志。

你可以使用完全相同的语法为缓冲区设置本地记录偏好:

#+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@)

若要为配置了 ‘@’ 的待办关键字仅记录时间戳而不写备注, 在提示输入时直接按下 C-c C-c 提交空备注即可。

若要为子树或单个条目定义本地记录设置, 可在该条目中设置 ‘LOGGING’ 属性。 任何非空的 ‘LOGGING’ 属性都会将所有记录设置重置为 nil 。 随后你可以使用 ‘lognotedone’ 或 ‘logrepeat’ 等 ‘启动STARTUP’ 关键字, 以及 ‘TODO(!)’ 等状态特定设置,为该子树启用记录功能。示例:

* TODO Log each state with only a time
  :PROPERTIES:
  :LOGGING: TODO(!) WAIT(!) DONE(!) CANCELED(!)
  :END:
* TODO Only log when switching to WAIT, and when repeating
  :PROPERTIES:
  :LOGGING: WAIT(@) logrepeat
  :END:
* TODO No logging at all
  :PROPERTIES:
  :LOGGING: nil
  :END:

5.3.3 Tracking your habits

Org 可以跟踪一类特殊待办事项 “习惯(habits)” 的执行连贯性。 要使用习惯功能,需通过自定义变量 org-modules 启用 habit 模块。

一个习惯事项具备以下属性:

  1. 该习惯是一个待办事项,其待办关键字表示未完成状态。
  2. 属性 ‘STYLE’ 设为 ‘habit’ (参见 Properties and Columns)。
  3. 该待办事项设有计划日期,通常使用 ‘.+’ 类型的重复间隔。对于有时间限制的习惯, ‘++’ 类型会更合适,例如必须在每周特定日期完成( ‘++1w’ );而对于可以产生积压的特殊习惯,则可使用 ‘+’ 类型,比如每周报告。有关重复间隔的更多细节,请参见 Repeated tasks
  4. 该待办事项还可使用语法 ‘.+2d/3d’ 指定最小与最大间隔, 表示希望该任务至少每三天执行一次,至多每两天执行一次。
  5. 启用完成状态的记录功能(参见 Tracking TODO state changes), 以便在连贯性图表中展示历史数据。 未启用不会报错,但连贯性图表基本失去意义。

为让你直观了解上述规则的实际效果, 以下是一个带有历史记录的真实习惯示例:

** TODO Shave
   SCHEDULED: <2009-10-17 Sat .+2d/4d>
   :PROPERTIES:
   :STYLE:    habit
   :LAST_REPEAT: [2009-10-19 Mon 00:36]
   :END:
   - State "DONE"       from "TODO"       [2009-10-15 Thu]
   - State "DONE"       from "TODO"       [2009-10-12 Mon]
   - State "DONE"       from "TODO"       [2009-10-10 Sat]
   - State "DONE"       from "TODO"       [2009-10-04 Sun]
   - State "DONE"       from "TODO"       [2009-10-02 Fri]
   - State "DONE"       from "TODO"       [2009-09-29 Tue]
   - State "DONE"       from "TODO"       [2009-09-25 Fri]
   - State "DONE"       from "TODO"       [2009-09-19 Sat]
   - State "DONE"       from "TODO"       [2009-09-16 Wed]
   - State "DONE"       from "TODO"       [2009-09-12 Sat]

该习惯表示:希望至多每两天刮一次胡子—由计划日 ‘SCHEDULED’ 期和重复间隔指定—且至少每四天一次。 如果今天是15号,该习惯会在最短间隔2天过后的10月17日出现在议程中(参见 Agenda Views), 并在4天过后的10月19日显示为逾期。

习惯功能的真正实用之处在于,它会附带连贯性图表一同显示, 展示你过去完成该任务的稳定程度。 图表会显示过去三周内完成任务的每一天,并用不同颜色标记每一天:

蓝色

当天无需执行该任务。

绿色

当天可以执行该任务。

黄色

次日任务即将逾期。

红色

当天任务已逾期。

除颜色标记外,若当天实际完成了任务,会用星号标注; 感叹号则标识图表中当天的位置。

有多个配置变量可用于修改习惯在议程中的显示方式。

org-habit-graph-column

绘制连贯性图表的缓冲区列数。 该设置会覆盖该列的所有文本,因此建议保持习惯标题简洁。

org-habit-preceding-days

连贯性图表中显示的历史天数(今天之前)。

org-habit-following-days

连贯性图表中显示的未来天数(今天之后)。

org-habit-show-habits-only-for-today

若非 nil ,仅在今日议程视图中显示习惯。默认值为 t 。 在议程中按下 C-u K 可切换该变量。

最后,在议程框架中按下 K 可临时禁用习惯,使其完全不显示; 再次按下 K 恢复显示。 习惯同样支持标签过滤,例如你有仅在特定场景下执行的习惯时。


5.4 Priorities

如果你大量使用 Org mode,待办事项可能会多到需要区分优先级。 设置优先级的方法是在待办事项标题的关键字后插入 优先级标记(priority cookie) ,示例:

If you use Org mode extensively, you may end up with enough TODO items that it starts to make sense to prioritize them. Prioritizing can be done by placing a priority cookie into the headline of a TODO item right after the TODO keyword, like this:

*** TODO [#A] Write letter to Sam Fortune

默认情况下,Org mode 支持三种优先级: ‘A’ 、 ‘B’ 、 ‘C’ 。 ‘A’ 为最高优先级。无标记的条目按优先级 ‘B’ 处理。 优先级仅对议程中的排序生效(参见 Weekly/daily agenda), 在议程之外对 Org mode 无固有含义。 优先级标记会使用变量 org-priority-faces 定义的文本的视觉样式显示,该变量可自定义。

你也可以使用数字表示优先级,例如:

*** TODO [#1] Write letter to Sam Fortune

使用数字优先级时,需要将 org-priority-highestorg-priority-lowestorg-priority-default 设为整数,且均为 0 到 64 之间的非负整数。

优先级可附加到任意标题,不必是待办事项。

C-c , (org-priority)

设置当前标题的优先级。命令会提示输入优先级字符 ‘A’ 、 ‘B’ 或 ‘C’ 。 若按下 SPC,则移除标题中的优先级标记(如有)。 也可在议程框架中通过 , 命令 “远程(remotely)” 修改优先级(参见 Commands in the Agenda Buffer)。

S-UP (org-priority-up)
S-DOWN (org-priority-down)

提升/降低当前标题的优先级47。 注意这些按键也用于修改时间戳(参见 Creating Timestamps)。 关于与 Shift 选择功能的冲突说明,参见 Packages that conflict with Org mode

你可以通过设置变量 org-priority-highestorg-priority-lowestorg-priority-default 修改允许的优先级范围。 合法的优先级值为单个大写拉丁字母 A-Z,以及 0 到 64 之间的非负整数。 对于单个缓冲区,可按如下方式设置这些值(最高、最低、默认) (请确保最高优先级在字母顺序上早于最低优先级):

#+PRIORITIES: A C B

或使用数字:

#+PRIORITIES: 1 10 5

5.5 Breaking Down Tasks into Subtasks

通常建议将大型任务拆分为更小、可管理的子任务。 你可以在待办事项下方创建大纲树,在树上设置详细子任务48。 为概览已标记完成的子任务比例,可在标题任意位置插入 ‘[/]’ 或 ==。 每当子项待办状态变更,或在标记上按下 C-c C-c 时,这些标记会自动更新。示例:

* Organize Party [33%]
** TODO Call people [1/2]
*** TODO Peter
*** DONE Sarah
** TODO Buy food
** DONE Talk to neighbor

若一个标题下方同时存在复选框和待办子项,统计标记的含义会变得模糊。 将属性 ‘COOKIE_DATA’ 设为 ‘checkbox’ 或 ‘todo’ 即可解决该问题。

若希望统计标记计算子树中所有待办条目(而非仅直接子项), 可配置变量 org-hierarchical-todo-statistics 。 若仅对单个子树生效,可在 ‘COOKIE_DATA’ 属性值中加入 ‘recursive’ 。

* Parent capturing statistics [2/20]
  :PROPERTIES:
  :COOKIE_DATA: todo recursive
  :END:

若希望待办条目在所有子项完成时自动变为完成状态,可使用如下配置:

(defun org-summary-todo (n-done n-not-done)
  "Switch entry to DONE when all subentries are done, to TODO otherwise."
  (let (org-log-done org-todo-log-states)   ; turn off logging
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

(add-hook 'org-after-todo-statistics-hook #'org-summary-todo)

另一种方法是使用复选框标识子任务(层级),参见 Checkboxes


5.6 Checkboxes

普通列表49(参见 Plain Lists)中的每一项都可以通过以 ‘[ ]’ 开头变为复选框。 该功能与待办事项类似(参见 TODO Items),但更轻量。 复选框不会出现在全局待办列表中,因此非常适合将任务拆分为多个简单步骤,或用于购物清单。

以下是复选框列表示例:

* TODO Organize party [2/4]
  - [-] call people [1/3]
    - [ ] Peter
    - [X] Sarah
    - [ ] Sam
  - [X] order food
  - [ ] think about what music to play
  - [X] talk to the neighbors

第一行和第二行的 ‘[2/4]’ 和 ‘[1/3]’ 是统计标记, 表示该条目内已勾选的复选框数量与总复选框数量。 即使不展开折叠的条目,也能直观了解剩余未勾选数量。 标记可放在标题或普通列表项(第一行)中。 每个标记仅统计其所在标题/项的结构直接子级复选框50。 你需要手动输入 ‘[/]’ 或 ‘[%]’ 插入标记。 使用 ‘[/]’ 会显示「n/m」格式结果,如上例; 使用 ‘[%]’ 则显示已勾选百分比(上例中分别为 ‘[50%]’ 和 ‘[33%]=)。 在标题中,标记可统计下方复选框或子项待办状态,显示最后修改的类型。 将属性 =COOKIE_DATA’ 设为 ‘checkbox’ 或 ‘todo’ 可明确统计类型。

若当前标题设有 ‘ORDERED’ 属性,复选框必须按顺序勾选, 若尝试在上方存在未勾选框时勾选下方框,会抛出错误。

复选框有三种状态:

  1. 未勾选 ‘[ ]
  2. 部分勾选 ‘[-]
  3. 已勾选 ‘[X]

复选框按层级工作,若一个复选框项包含子复选框, 切换任一子复选框会使父复选框反映子项的全部、部分或未勾选状态。

若所有子复选框均未勾选,父复选框也未勾选:

- [ ] call people
  - [ ] Peter
  - [ ] Sarah

若部分子复选框已勾选,父复选框为部分勾选:

- [-] call people
  - [X] Peter
  - [ ] Sarah

若所有子复选框均已勾选,父复选框也已勾选:

- [X] call people
  - [X] Peter
  - [X] Sarah

以下命令用于操作复选框:

C-c C-c (org-toggle-checkbox)

切换光标处复选框状态;若携带前缀参数,则切换复选框是否存在。 携带单个前缀参数时,添加空复选框或移除当前复选框51。 携带双前缀参数时,设为 ‘[-]’ ,即中间状态。

C-c C-x C-b (org-toggle-checkbox)

切换光标处复选框状态;若携带前缀参数,则切换复选框是否存在。 携带双前缀参数时,设为 ‘[-]’ 中间状态。

  • 若存在选中区域,切换区域内第一个复选框,并将其余框设为相同状态。 携带前缀参数时,为区域内所有项添加或移除复选框。
  • 若光标在标题中,切换该标题与下一标题之间区域的复选框,而 整个子树。
  • 若无选中区域,仅切换光标处复选框。
C-c C-x C-r (org-toggle-radio-button)

将光标所在项的复选框作为单选按钮切换: 当该复选框勾选时,同一层级的其他所有复选框会自动取消勾选。 携带通用前缀参数时,切换复选框是否存在。 携带双前缀参数时,设为 ‘[-]’ 。

通过在列表前设置 ‘#+ATTR_ORG: :radio t’ ,或调用 M-x org-list-checkbox-radio-mode 启用该次要模式, 可使 C-c C-c 将复选框视为单选按钮。

M-S-RET (org-insert-todo-heading)

插入带复选框的新项。仅当光标已在普通列表项中时生效(参见 Plain Lists)。

C-c C-x o (org-toggle-ordered-property)

切换条目的 ‘ORDERED’ 属性,控制复选框是否必须按顺序勾选。 该行为使用属性实现,因为此设置应仅作用于当前条目,而非像标签一样继承。 若希望通过标签 跟踪(track) 该属性值以提升可见性,可自定义 org-track-ordered-property-with-tag

C-c # (org-update-statistics-cookies)

更新当前大纲条目的统计标记。 携带 C-u 前缀调用时,更新整个文件。 使用 C-c C-c 切换复选框或用 M-S-RET 新建复选框时, 复选框统计标记会自动更新。 修改待办状态时,待办统计标记会更新。 若手动删除/添加框或条目,可使用该命令同步统计数据。


6 Tags

为信息交叉关联设置标识与上下文,一种极佳的方式是为标题指定 /标签(tags)/。Org 模式对标签提供了全面的支持。

每个标题均可包含一组标签,标签位于标题末尾。标签由普通字符构成,可包含字母、数字、 ‘_’ 、 ‘@’ 、 ‘#’ 与 ‘%’ 。标签前后必须各有一个冒号,例如 ‘:work:’ 。可同时指定多个标签,如 ‘:work:urgent:’ 。默认情况下,标签以粗体显示,颜色与标题一致。你可以通过变量 org-tag-faces 为特定标签指定专用的文本的视觉样式,用法与 TODO 关键字类似(参见 Faces for TODO keywords)。


6.1 Tag Inheritance

标签(tags) 会沿用大纲树的层级结构。如果某个标题带有特定标签,其所有子标题均会继承该标签。 例如在下列内容中:

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

最底层标题会自动带有 ‘work’ 、 ‘boss’ 、 ‘notes’ 和 ‘action’ 标签, 即便该标题并未显式标记这些标签。你也可以为文件中所有条目设置统一继承的标签, 相当于在整个文件外存在一个虚拟的零级标题定义了这些标签。使用如下格式的行即可52

#+FILETAGS: :Peter:Boss:Secret:

若要限制标签仅对特定标签继承,或完全关闭继承功能,可使用变量 org-use-tag-inheritanceorg-tags-exclude-from-inheritance

标签继承在日程搜索匹配标签时生效,适用于 tagstags-todo 类型的日程视图。 在其他日程类型中, org-use-tag-inheritance 不产生作用。不过你可能仍希望 日程中标签能正确显示,以确保基于继承标签的筛选正常工作。可通过设置 org-agenda-use-tag-inheritance 进行控制:默认值对所有日程类型生效, 将其设为 nil 可显著加快日程生成速度。


6.2 Setting Tags

标签可直接在缓冲区标题末尾输入。输入冒号后,M-TAB 可触发标签补全。 同时也提供专用命令用于插入标签:

C-c C-q (org-set-tags-command)

为当前标题设置新标签。Org 模式会提供补全或专用单键操作界面来设置标签,详见下文。 按下 RET 后,标签会插入并对齐到 org-tags-column 列。 若带 C-u 前缀调用,会将当前缓冲区所有标签对齐到该列,仅用于美化排版。 标题升降级、TODO 状态变更后,标签会自动重新对齐(参见 Basic TODO Functionality)。

C-c C-c (org-set-tags-command)

当光标位于标题上时,该命令与 C-c C-q 作用相同。

Org 支持基于 标签列表(list of tags) 插入标签。默认情况下,该列表动态生成,包含缓冲区当前所有已使用标签53。 你也可以通过变量 org-tag-alist 全局指定固定标签列表。最后,可通过 ‘TAGS’ 关键字 为指定文件设置默认标签,例如:

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

若已通过变量 org-tag-alist 全局定义常用标签,但希望在特定文件中使用动态标签列表, 可在该文件中添加空的 ‘TAGS’ 关键字:

#+TAGS:

若有一组希望在所有文件中使用的常用标签,且独立于各文件通过 ‘TAGS’ 关键字定义的标签, 可通过变量 org-tag-persistent-alist 指定该组标签。如需在单个文件中关闭此功能, 可在该文件中添加 ‘STARTUP’ 关键字:

#+STARTUP: noptag

默认情况下,Org 模式使用标准小缓冲区补全功能输入标签。此外还提供一种更快捷的标签选择方式, 称为 快速标签选择(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)

标签界面会在弹出框架中显示可用标签。若希望在特定标签后换行,可在标签列表中插入 ‘\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’ 、 ‘@home’ 、 ‘@tennisclub’ 中最多只能选中一个。支持设置多个此类分组。

不要忘记将光标置于这些行中并按下 C-c C-c 使修改生效。

若要在变量 org-tag-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 会自动弹出专用界面, 列出继承标签、当前标题标签及所有有效标签与对应按键54

按下标签对应按键可在当前行标签列表中添加或移除该标签。在互斥组中选中一个标签, 会自动取消组内其他标签的选中状态。

在该界面中,还可使用以下特殊按键:

TAB

在小缓冲区中输入标签,即便该标签不在预定义列表中。可补全缓冲区中所有标签 以及全局通过 org-tag-alistorg-tag-persistent-alist 预定义的标签。 也可同时添加多个标签,使用逗号分隔即可。

SPC

清除当前行所有标签。

RET

确认修改后的标签集合。

C-g

放弃修改并退出。

q

q 未分配给标签,作用与 C-g 相同,即放弃退出。

!

临时关闭互斥标签组限制。可用于(作为例外)为同一组分配多个标签。

C-c

切换下次修改后自动退出(见下文)。若使用专家模式,首次按下 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 实现。

若大多数情况下仅需单次按键修改标签列表,可设置变量 org-fast-tag-selection-single-key 。 此后无需按下 RET 退出快速标签选择,首次修改后会自动退出。 若偶尔需要多次按键,可按下 C-c 关闭当前选择过程的自动退出 (实际效果为以 C-c C-c C-c 代替 C-c C-c 启动选择)。 若将该变量设为 expert ,单键选择标签时不会显示专用框架, 仅在额外按下 C-c 时才会弹出。

快速标签选择界面中显示的标签数量受 org-fast-tag-selection-maximum-tags 限制, 避免可用按键耗尽。你可自定义该变量。


6.3 Tag Hierarchy

标签可定义为层级结构。一个标签可作为一组其他标签的 /分组标签(group tag)/, 分组标签可视为其下属标签的“上位概念”。定义多个分组标签并嵌套,即可形成标签层级。

典型用途是构建术语(标签)分类体系,用于对文档或文档集中的节点进行分类。

搜索分组标签时,会返回该组及其子组内所有成员标签的匹配结果。在日程视图中, 按分组标签筛选会显示或隐藏带有该组任一成员或子组成员标签的标题。 这让标签搜索与筛选更加灵活。

可使用方括号设置分组标签,在分组标签与其关联标签间插入冒号—注意所有空格均为必需, 以确保 Org 能正确解析该行:

#+TAGS: [ GTD : Control Persp ]

本例中 ‘GTD’ 为分组标签,关联 ‘Control’ 、 ‘Persp’ 两个标签。 将 ‘Control’ 与 ‘Persp’ 继续设为分组标签,可形成完整标签层级:

#+TAGS: [ Control : Context Task ]
#+TAGS: [ Persp : Vision Goal AOF Project ]

从概念上可视为如下标签层级:

  • GTD
    • Persp
      • Vision
      • Goal
      • AOF
      • Project
    • Control
      • Context
      • Task

直接设置 org-tag-alist 时,可使用 :startgrouptag:grouptags:endgrouptag 关键字:

(setq org-tag-alist '((:startgrouptag)
                      ("GTD")
                      (:grouptags)
                      ("Control")
                      ("Persp")
                      (:endgrouptag)
                      (:startgrouptag)
                      ("Control")
                      (:grouptags)
                      ("Context")
                      ("Task")
                      (:endgrouptag)))

组内标签可设为互斥,用法与互斥标签分组相同—使用大括号包裹:

#+TAGS: { Context : @Home @Work @Call }

设置 org-tag-alist 时,可使用 :startgroup:endgroup 代替 :startgrouptag:endgrouptag , 使组内标签互斥。

此外,分组标签的成员也可使用正则表达式,从而实现更动态、基于规则的标签结构 (参见 Regular Expressions)。组内正则表达式必须放在大括号内。 扩展示例如下:

#+TAGS: [ Vision : {V@.+} ]
#+TAGS: [ Goal : {G@.+} ]
#+TAGS: [ AOF : {AOF@.+} ]
#+TAGS: [ Project : {P@.+} ]

搜索标签 ‘Project’ 时,会同时列出所有匹配正则表达式 ‘P@.+’ 的标签, 对 ‘Vision’ 、 ‘Goal’ 、 ‘AOF’ 的标签搜索同理。例如,该规则可很好支持带有通用项目标识的项目标签, 如 ‘P@2014_OrgTags!’ 。

若需临时忽略分组标签,可通过 org-toggle-tags-groups 切换分组标签支持, 该命令绑定至 C-c C-x q。若要完全禁用标签分组,可将 org-group-tags 设为 nil


6.4 Tag Searches

标签体系建立后,可用于将相关信息汇总为专用列表。

C-c / m or C-c \ (org-match-sparse-tree)

生成符合标签搜索条件的所有标题构成的稀疏树。 带 C-u 前缀调用时,忽略非 TODO 行的标题。

M-x org-agenda m (org-tags-view)

从所有日程文件中生成全局标签匹配列表。参见 Matching tags and properties

M-x org-agenda M (org-tags-view)

从所有日程文件中生成全局标签匹配列表,但仅检查 TODO 条目。

这些命令均会提示输入匹配字符串,支持基础布尔逻辑, 例如 ‘+boss+urgent-project1’ 表示查找带有 ‘boss’ 与 ‘urgent’ 标签、 但不含 ‘project1’ 标签的条目; ‘Kathy|Sally’ 表示查找带有 ‘Kathy’ 或 ‘Sally’ 任一标签的条目。 搜索字符串语法丰富,还可匹配 TODO 关键字、条目层级与属性。 完整语法说明与大量示例参见 Matching tags and properties


7 Properties and Columns

属性是与条目关联的键值对。可以设置属性,使其仅关联单个条目、关联某个树形结构下的所有条目,或关联整个缓冲区。

Org 模式中属性主要有两大用途。第一,属性类似标签,但带有对应取值。设想你维护一个文件,用于记录软件缺陷并规划版本发布。你可以使用名为 ‘Release’ 的属性,在不同子树中设置 ‘1.0=、=2.0’ 等不同取值,而非使用 ‘release_1’ 、 ‘release_2’ 这类标签。第二,你可以借助属性在 Org 缓冲区中实现(非常基础的)数据库功能。例如管理音乐 CD 信息,属性可以是专辑名、艺术家、发行日期、曲目数量等。

属性可在列视图中方便地编辑与查看(参见 Column View)。


7.1 Property Syntax

属性为键值对。当属性关联单个条目或某个树形结构时,需要插入到名为 ‘PROPERTIES’ 的专用收纳块中(参见 Drawers),该收纳块必须直接位于标题下方,若存在规划行则位于规划行下方(参见 Deadlines and Scheduling)。每个属性单独占一行,键名用冒号包裹并写在前面,其后为对应值。键名不区分大小写。示例如下:

* CD collection
** Classic
*** Goldberg Variations
    :PROPERTIES:
    :Title:     Goldberg Variations
    :Composer:  J.S. Bach
    :Artist:    Glenn Gould
    :Publisher: Deutsche Grammophon
    :NDisks:    1
    :END:

根据变量 org-use-property-inheritance 的取值,以此方式设置的属性可仅关联单个条目,或关联该条目对应的整个子树,详见 Property Inheritance

你可以通过定义 ‘Xyz_ALL’ 这一属性,指定特定属性 ‘Xyz’ 的允许取值。该特殊属性支持 继承(inherited) ,因此在一级条目中设置后,会作用于整个树形结构。定义允许取值后,设置对应属性会更简便,也能减少输入错误。以上述 CD 收藏为例,我们可以预先定义出版商与光盘数量:

* CD collection
  :PROPERTIES:
  :NDisks_ALL:  1 2 3 4
  :Publisher_ALL: "Deutsche Grammophon" Philips EMI
  :END:

属性可在缓冲区层级定义,即写在首个标题之前,可被文件中所有条目继承。首个标题前定义的属性块必须位于缓冲区顶部,其上方只能有注释。

也可通过如下格式的行定义属性:

#+PROPERTY: NDisks_ALL 1 2 3 4

若要为已有属性追加取值,可在属性名后添加 ‘+’ 。下述配置会使属性 ‘var’ 同时拥有 ‘foo’ 和 ‘bar’ 两个值。

#+PROPERTY: var  foo
#+PROPERTY: var+ bar

使用追加符号 ‘+’ ,也可以为继承的属性添加取值。下述配置会使 ‘Goldberg Variations’ 子树下的 ‘Genres’ 属性拥有 ‘Classic’ 、 ‘Baroque’ 和 ‘Keyboard music’ 三个值。

* CD collection
** Classic
    :PROPERTIES:
    :Genres: Classic
    :END:
*** Goldberg Variations
    :PROPERTIES:
    :Title:     Goldberg Variations
    :Composer:  J.S. Bach
    :Artist:    Glenn Gould
    :Publisher: Deutsche Grammophon
    :NDisks:    1
    :Genres+:   Baroque
    :Genres+:   Keyboard music
    :END:

注意:只有使用 ‘+’ 追加时,一个属性才能在同一个收纳块中存在多个取值。若同一属性无 ‘+’ 却重复定义,结果未定义。

通过全局变量 org-global-properties 设置的属性值,可被所有 Org 文件中的全部条目继承。

以下命令可用于操作属性:

M-TAB (pcomplete)

在行首输入冒号后,补全属性键名。会列出当前文件中使用过的所有键名作为候选项。

C-c C-x p (org-set-property)

设置属性。会提示输入属性名与取值,必要时自动创建属性收纳块。

C-u M-x org-insert-drawer

在当前条目插入属性收纳块。收纳块会插入在条目靠前位置,位于截止日期等规划信息行之后。若在首个标题前使用,则插入在缓冲区顶部注释之后。

C-c C-c (org-property-action)

光标位于属性收纳块内时,执行属性相关命令。

C-c C-c s (org-set-property)

为当前条目设置属性,属性名与取值均可通过补全输入。

S-RIGHT (org-property-next-allowed-value), S-LEFT (org-property-previous-allowed-value)

将光标所在属性切换为下一个/上一个允许取值。

C-c C-c d (org-delete-property)

从当前条目中移除指定属性。

C-c C-c D (org-delete-property-globally)

从当前文件所有条目中全局移除指定属性。

C-c C-c c (org-compute-property-at-point)

依据最近的列格式定义中的运算符与作用范围,计算光标处属性的取值。


7.2 Special Properties

特殊属性提供了访问 Org 模式功能的另一种方式,例如条目的 TODO 状态或优先级(前序章节已介绍)。该接口用于将这些状态纳入列视图(参见 Column View)或用于查询。以下属性名为特殊保留名称,不应在属性收纳块中作为自定义键使用:

ALLTAGS所有标签,包含继承而来的标签。
BLOCKED任务被子任务或同级任务阻塞时为 t
CATEGORY条目所属分类。
CLOCKSUM子树内所有时钟记录的总时长,需先运行 org-clock-sum 计算当前缓冲区数值。
CLOCKSUM_T子树内当日时钟记录总时长,需先运行 org-clock-sum-today 计算当前缓冲区数值。
CLOSED本条目的关闭时间。
DEADLINE截止日期时间戳。
FILE条目所在文件名称。
ITEM条目标题内容。
PRIORITY条目优先级,单个字母字符串。
SCHEDULED规划时间戳。
TAGS标题中直接定义的标签。
TIMESTAMP条目中第一个无关键字的活跃时间戳。55
TIMESTAMP_IA条目中第一个无关键字的非活跃时间戳。
TODO条目的 TODO 关键字。

7.3 Property Searches

基于属性筛选生成稀疏树与专用列表,所用命令与标签搜索相同(参见 Tag Searches)。

C-c / mC-c \ (org-match-sparse-tree)

生成包含所有匹配条目的稀疏树。携带 C-u 前缀调用时,忽略非 TODO 行的标题。

M-x org-agenda m (org-tags-view)

从所有日程文件中生成标签与属性匹配的全局列表。

M-x org-agenda M (org-tags-view)

从所有日程文件中生成全局标签匹配列表,但仅筛选 TODO 条目。

搜索字符串的语法详见 Matching tags and properties

另有专用命令可基于单个属性生成稀疏树:

C-c / p

基于属性值生成稀疏树。先提示输入属性名,再提示输入取值,随后生成所有设置该属性为指定值的条目构成的稀疏树。若将取值放在大括号内,会按正则表达式匹配属性值(参见 Regular Expressions)。


7.4 Property Inheritance

Org 文档的大纲结构天然适合属性继承模型:若树形结构中的父条目拥有某属性,子条目可继承该属性。Org 模式默认未开启此功能,因为它会显著降低属性搜索速度,且通常并非必需。但如果你认为继承功能有用,可通过设置变量 org-use-property-inheritance 开启。可将其设为 t 使所有属性均从父条目继承,也可设为需要继承的属性列表,或匹配可继承属性的正则表达式。若某属性取值为 nil ,表示显式取消该属性定义,继承搜索会在此处停止并返回 nil

Org 模式对部分属性硬编码了继承行为,至少在其专用场景下生效:

COLUMNS

COLUMNS’ 属性定义列视图的格式(参见 Column View)。其继承规则为:定义 ‘COLUMNS’ 属性的层级会作为列视图表格的起始位置,与开启列视图的子树位置无关。

CATEGORY

对于日程视图,通过 ‘CATEGORY’ 属性设置的分类会作用于整个子树。

ARCHIVE

用于归档功能, ‘ARCHIVE’ 属性可定义整个子树的归档位置(参见 Moving a tree to an archive file)。

LOGGING

LOGGING’ 属性可定义条目或子树的日志记录设置(参见 Tracking TODO state changes)。


7.5 Column View

在大纲树中查看和编辑属性的一种极佳方式是 列视图(column view) 。在列视图下,每个标题都会变为表格的一行,表格中的列用于访问条目的各类属性。Org 模式通过在每个条目标题上叠加表格结构来实现列视图。即便标题已被转为表格行,你仍然可以控制大纲树的可见性。例如,切换到 “内容(contents)” 视图可得到紧凑的表格—在列视图激活时按 S-TAB S-TAB 或直接按 c—同时你仍可以展开、查看和编辑每个标题下方的内容。此外,你也可以在执行稀疏树命令后再切换到列视图,这样就能只针对筛选出的条目生成表格。列视图同样适用于日程缓冲区(参见 Agenda Views),这类缓冲区通常已通过查询从多个文件中收集了指定条目。


7.5.1 Defining columns

使用列视图首先需要定义列,这通过设置列格式行来完成。


7.5.1.1 Scope of column definitions

若要指定仅适用于某棵子树的格式,可在该子树的顶层节点添加 ‘COLUMNS’ 属性,示例如下:

** Top node for columns view
   :PROPERTIES:
   :COLUMNS: %25ITEM %TAGS %PRIORITY %TODO
   :END:

在首个标题之前的属性收纳块中定义 ‘COLUMNS’ 属性,将作用于整个文件。除了属性收纳块,也可通过如下关键字行为整个文件定义列格式:

#+COLUMNS: %25ITEM %TAGS %PRIORITY %TODO

如果某个条目包含 ‘COLUMNS’ 属性,它会为该条目及其下方整个子树定义列结构。由于列定义遵循文档的层级结构,你可以在一级标题定义通用列,适用于所有下级,再在更深层级定义更具体的列,用于编辑子树的细节内容。


7.5.1.2 Column attributes

列定义用于设置列的各项属性,通用格式如下:

%[WIDTH]PROPERTY[(TITLE)][{SUMMARY-TYPE}]
%[宽度]属性名[(列标题)][{汇总类型}]

除百分号与属性名外,其余部分均为可选。各部分含义如下:

WIDTH

整数,指定列的字符宽度。省略时宽度自动计算。

PROPERTY

本列要编辑的属性。也支持表示元数据的特殊属性(参见 Special Properties)。

TITLE

列表头文字。省略时使用属性名。

SUMMARY-TYPE

汇总类型。若指定,父标题的列值将由直接子节点计算得出。若父节点已有同名属性,该属性不会参与计算。

当父标题存在已有属性时,Org 不仅会在列视图中叠加计算值,还会直接覆盖父节点属性收纳块中的属性值56

特殊属性不支持汇总类型。

支持的汇总类型如下:

+本列数值求和。
+;%.1f同 ‘+=,但按 =%.1f’ 格式化结果。
$货币格式,等价于 ‘+;%.2f’ 。
min列中最小值。
max列中最大值。
mean数值算术平均值。
X复选框状态:所有子项均为 ‘[X]’ 时显示 ‘[X]’ 。
X/复选框状态:显示 ‘[n/m]’ 。
X%复选框状态:显示 ‘[n%]’ 。
:时间求和(HH:MM);纯数字视为分钟。
:min列中最小时间值。
:max列中最大时间值。
:mean时间值算术平均值。
@min最小时长57(天/时/分/秒)。
@max最大时长(天/时/分/秒)。
@mean时长算术平均值(天/时/分/秒)。
est+合并低–高估算范围。

你也可以通过设置 org-columns-summary-types 自定义汇总类型。

est+’ 汇总类型需要特别说明。它用于合并以低–高范围表示的工作量估算。例如,某项任务你不直接估算为 5 天,而是在较有把握时记为 5–6 天,完全不确定时记为 1–10 天。两种范围平均值都是 5.5 天,但前者更可控。

直接将所有范围的上下限相加会得到过于宽泛的结果,而 ‘est+’ 会对子任务的均值和方差进行统计合并,生成更合理的总估算。例如,10 个任务各估算 0.5–2 天,直接相加为 5–20 天,代表极端顺利或极端糟糕的情况;而 ‘est+’ 会更真实地估算为 10–15 天。

下面是完整的列定义示例,同时包含允许取值58

:COLUMNS:  %25ITEM %9Approved(Approved?){X} %Owner %11Status \
                   %10Time_Estimate{:}
:Owner_ALL:    Tammy Mark Karl Lisa Don
:Status_ALL:   "In progress" "Not started yet" "Finished" ""
:Approved_ALL: "[ ]" "[X]"

第一列 ‘%25ITEM’ 表示显示条目本身(也就是标题)的前 25 个字符。你在定义列时通常都应该以 ‘ITEM’ 说明符开头。其他说明符分别创建这些列: ‘Owner’ 列使用一组姓名作为可选值; ‘Status’ 列有四种可选状态;还有一个复选框字段 ‘Approved’ 。在 ‘%’ 符号后如果没有指定宽度,列宽会自动适配为刚好能完整显示所有内容的宽度。 ‘Approved’ 列使用了自定义的标题( ‘Approved?’ ,带问号)。 ‘Time_Estimate’ 列会对 HH:MM 这类时长格式进行求和汇总;而 ‘Approved’ 列则会在所有子项都被勾选时显示 ‘[X]’ 状态。

CLOCKSUM’ 和 ‘CLOCKSUM_T’ 是特殊列属性,分别列出子树内所有时钟记录总和( ‘CLOCKSUM’ )与当日时钟记录总和( ‘CLOCKSUM_T’ )。与忽略父标题属性值的 ‘:’ 汇总类型不同, ‘CLOCKSUM’ 与 ‘CLOCKSUM_T’ 会统计所有 ‘CLOCK:’ 记录,包括父标题内的记录。

  1. Summaries in deeply nested hierarchy

    在多层嵌套结构中计算汇总时,会从最深层级向上递归计算。示例如下:

    #+BEGIN: columnview :indent t :format "%ITEM %EFFORT{:mean}" :id global
    | ITEM               | EFFORT  |
    |--------------------+---------|
    | Top level          | 3h 0min |
    | \_  Intermediate 1 | 1h 0min |
    | \_        Leaf 1   | 1h      |
    | \_    Leaf 2       | 1h      |
    | \_    Leaf 3       | 1h      |
    | \_  Intermediate 2 | 5h      |
    #+END:
    
    * Top level
    ** Intermediate 1
    :PROPERTIES:
    :EFFORT:   *unused*, will be set to 1h 0min (mean of the leaf nodes)
    :END:
    ***** Leaf 1
    :PROPERTIES:
    :EFFORT: 1h
    :END:
    *** Leaf 2
    :PROPERTIES:
    :EFFORT: 1h
    :END:
    *** Leaf 3
    :PROPERTIES:
    :EFFORT: 1h
    :END:
    ** Intermediate 2
    :PROPERTIES:
    :EFFORT: 5h
    :END:
    

7.5.2 Using column view

Turning column view on or off

C-c C-x C-c (org-columns)

开启列视图。若光标位于文件首个标题之前,列视图将作用于整个文件并使用 ‘#+COLUMNS’ 定义。若光标位于大纲内部,命令会从当前位置向上查找层级中定义格式的 ‘COLUMNS’ 属性。找到后,以包含该属性的条目为根建立列视图表格。若未找到,则使用 ‘#+COLUMNS’ 行或变量 org-columns-default-format 中的格式,为当前条目及其子树建立列视图。

列视图下按 rg (org-columns-redo)

重建列视图,同步缓冲区最近的修改。

列视图下按 C-c C-cq (org-columns-quit)

Exit column view.

Editing values

LEFT, RIGHT, UP, DOWN

在列视图中按字段移动光标。

1..9,0

直接选择第 N 个允许值,0 选择第 10 个值。

nS-RIGHT (org-columns-next-allowed-value) 与 pS-LEFT (org-columns-previous-allowed-value)

切换到当前字段的下一个/上一个允许值。使用前提是该属性已设置允许取值列表。

e (org-columns-edit-value)

编辑光标处属性。对于特殊属性,会调用常规修改界面;例如编辑 ‘TAGS’ 属性时会弹出标签补全或快速选择框架。

C-c C-c (org-columns-toggle-or-columns-quit)

若光标在复选框上则切换状态,否则退出列视图。

v (org-columns-show-value)

查看属性完整值。适用于列宽小于值长度的情况。

a (org-columns-edit-allowed)

编辑当前属性的允许取值列表。若列表在层级中已定义,修改会保存在原处;否则新值存入当前列视图对应顶层条目。

Modifying column view on-the-fly

< (org-columns-narrow) 与 > (org-columns-widen)

将当前列收窄/加宽一个字符。

S-M-RIGHT (org-columns-new)

在当前列左侧插入新列。

S-M-LEFT (org-columns-delete)

删除当前列。

M-LEFT (org-columns-move-left)

将当前列左移。

M-RIGHT (org-columns-move-right)

将当前列右移。

M-UP (org-columns-move-row-up)

将当前行上移。

M-DOWN (org-columns-move-row-down)

将当前行下移。


7.5.3 Capturing column view

列视图只是缓冲区上的叠加层,无法直接导出或打印。若需要保存列视图内容,可使用 ‘columnview’ 动态块(参见 Dynamic Blocks)。该块结构如下:

* The column view
#+BEGIN: columnview :hlines 1 :id "label"

#+END:

该动态块支持以下参数:

:id

最重要的参数。列视图通常作用于特定子树,而捕获块可能位于文件其他位置。要指定捕获哪个子树的视图,可使用四种取值:

local

使用捕获块所在的子树。

global

全局视图,包含文件所有标题。

file:FILENAME

在指定 FILENAME 顶层启用列视图。

LABEL

在 ‘ID’ 属性为该标签 LABEL 的子树中启用列视图。可使用 M-x org-id-copy 为当前条目生成全局唯一 ID 并复制到剪贴板。

:match

设置为字符串时,作为标签/属性匹配过滤器,仅筛选 :id 指定范围内的部分标题。

:hlines

t 时每行后插入横线;为数字 N 时,在层级 <= N 的标题前插入横线。

:vlines

nil 时强制显示列组竖线。

:maxlevel

设置为数字时,不捕获该层级以下的条目。

:skip-empty-rows

nil 时,跳过仅 ‘ITEM’ 字段有内容的空行。

:exclude-tags

要排除的标签列表,带这些标签的条目不会出现在列视图表格中。

:indent

nil 时, ‘ITEM’ 字段按层级缩进。

:link

nil 时,表格中的 ‘ITEM’ 标题会链接到原位置。

:format

为动态块指定列属性(参见 Column attributes)。

:formatter

用于格式化列视图数据并插入缓冲区的函数,参见选项 org-columns-dblock-formatter

以下命令用于插入或更新动态块:

org-columns-insert-dblock

插入捕获列视图的动态块,提示选择视图范围或 ID。

该命令可通过 org-dynamic-block-insert-dblock (C-c C-x x) 并选择 “columnview” 调用(参见 Dynamic Blocks)。

C-c C-c C-c C-x C-u (org-dblock-update)

更新光标处动态块,光标需位于 ‘#+BEGIN’ 行。

C-u C-c C-x C-u (org-update-all-dblocks)

更新所有动态块(参见 Dynamic Blocks)。适用于缓冲区中有时程表、列视图捕获块等多个动态块的场景。

你可以为列视图表格添加公式,也可在表格前添加绘图指令,这些内容在块更新后会保留。若表格后有 ‘TBLFM’ 关键字,更新后会自动重算表格。

另一种捕获并处理属性值的方式由 Eric Schulte 的 ‘org-collector.el’ 提供,该包属于 ‘org-contrib59。它提供通用 API 收集指定范围内条目的属性,并支持任意 Lisp 表达式处理数值后再插入表格或动态块。


8 Dates and Times

为辅助项目规划,TODO 条目可以标注日期 和/或时间。在 Org mode 中,携带日期与 时间信息的特殊格式字符串称为 时间戳(timestamp) 。 这个叫法可能有点容易混淆,因为时间戳通常 用于表示某物的创建或最后修改时间。 但在 Org mode 中,该术语的含义要宽泛得多。

时间戳可用于安排约会、排定任务、设置截止日期、 记录工时等。后续章节将介绍 Org mode 提供的 时间戳格式与相关工具,用于处理时间和时间区间的常见场景。


8.1 Timestamps

时间戳是以特定格式表示的日期(可附带时间或时间区间), 形如 ‘<2003-09-16 Tue>’ 、 ‘<2003-09-16 Tue 09:39>’ 或 ‘<2003-09-16 Tue 12:00-12:30>60。 时间戳可以出现在 Org 树形条目的标题或正文中的任意位置。 它会让对应条目显示在日程表中的指定日期(见 Weekly/daily agenda)。 主要分为以下几类:

Plain timestamp; Event; Appointment

普通时间戳仅为条目分配一个日期/时间, 就像在纸质日程本上记下约会或事件一样。 在日程视图中,带有普通时间戳的条目标题 会精确显示在对应日期上。一个条目可以包含多个时间戳。

* Meet Peter at the movies
  <2006-11-01 Wed 19:15>
* Discussion on climate change
  <2006-11-02 Thu 10:00-12:00>
* My days off
  <2006-11-03 Fri>
  <2006-11-06 Mon>
Timestamp with repeater interval

时间戳可以包含 重复周期(repeater interval) ,表示它不仅适用于指定日期, 还会在每隔 N 小时(h)、天(d)、周(w)、月(m) 或年(y)后重复出现。下例每周三都会在日程表中显示:

* Pick up Sam at school
  <2007-05-16 Wed 12:30 +1w>
Diary-style expression entries

对于更复杂的日期规则,Org mode 支持使用 Emacs Calendar package 中实现的特殊表达式日记条目61。 例如,带可选时间的写法:

* 22:00-23:00 The nerd meeting on every 2nd Thursday of the month
  <%%(diary-float t 4 2) 22:00-23:00>
时间区间

时间区间是由 ‘-’ 连接两个时间单位的时间戳。

* Discussion on climate change
   <2006-11-02 Thu 10:00-12:00>
Time/Date range

由 ‘--’ 连接的两个时间戳表示一个时间段。 在日程表中,条目标题会显示在区间的第一天、最后一天, 以及区间内所有被展示的日期上。第一个示例只指定日期区间, 第二个示例则为每一天指定了时间区间。

** Meeting in Amsterdam
   <2004-08-23 Mon>--<2004-08-26 Thu>
** This weeks committee meetings
   <2004-08-23 Mon 10:00-11:00>--<2004-08-26 Thu 10:00-11:00>
Inactive timestamp

格式与普通时间戳类似,但使用方括号而非尖括号。 这类时间戳为 非活动 状态, 不会 让条目显示在日程表中。

* Gillian comes late for the fifth time
  [2006-11-01 Wed]

8.2 Creating Timestamps

要让 Org mode 识别时间戳,必须使用指定格式。 下面列出的所有命令都会生成符合规范的时间戳。

C-c . (org-timestamp)

提示输入日期并插入对应时间戳。 若光标位于缓冲区中已有的时间戳上, 该命令会修改此时间戳而非新建。 连续使用两次该命令会插入一个时间区间。

带前缀参数调用时,使用包含日期和时间的备选格式。 默认时间可舍入为 5 分钟的倍数, 可查看选项 org-time-stamp-rounding-minutes

带两个前缀参数时,直接插入当前时间的活动时间戳,不进行提示。

C-c ! (org-timestamp-inactive)

功能与 C-c . 类似,但插入非活动时间戳, 不会生成日程条目。

C-c C-c

规范化时间戳,补充或修正缺失/错误的星期名称。

C-c < (org-date-from-calendar)

插入与日历中光标所在日期对应的时间戳。

C-c > (org-goto-calendar)

打开 Emacs 日历并定位到当前日期。 若当前行存在时间戳,则跳转到对应日期。

C-c C-o (org-open-at-point)

打开光标所在时间戳或时间区间对应日期的日程表(见 Weekly/daily agenda)。

S-LEFT (org-timestamp-down-day), S-RIGHT (org-timestamp-up-day)

将光标所在日期调整一天。 该快捷键与选区切换等模式冲突(见 Packages that conflict with Org mode)。

S-UP (org-timestamp-up), S-DOWN (org-timestamp-down)

若光标在时间戳开头或括号处,可切换时间戳类型。 若在时间戳内部,可调整光标所在项(年、月、日、时、分)。 当时间戳包含形如 ‘15:30-16:30’ 的时间区间时, 修改第一个时间会同步偏移第二个,保持时长不变; 若要修改时长,需调整第二个时间。 注意:若光标在标题中而非时间戳上, 这些按键会调整条目优先级(见 Priorities)。 该快捷键同样与选区切换等模式冲突(见 Packages that conflict with Org mode)。

C-c C-y (org-evaluate-time-range)

计算时间区间的起止差值。带前缀参数时, 将结果插入时间区间后方(表格中则插入下一列)。


8.2.1 The date/time prompt

当 Org mode 提示输入日期/时间时,默认值会以标准日期/时间格式显示, 因此提示看起来像是要求特定格式。但实际上它支持多种格式的日期/时间输入。 通常信息应从字符串开头开始,Org mode 会提取已有信息, 并从 默认日期时间(default date and time) 补全未指定部分。 默认值通常为当前日期时间,但修改已有时间戳 或输入区间第二个时间戳时,会沿用缓冲区中的时间。 填写信息时,Org mode 假定你大多想输入未来日期: 若省略月/年且给定的日/月 早于 今天, 会自动识别为未来日期62。 若日期被自动顺延到未来,时间提示会显示 ‘(=>F)’ 。

例如,假设今天是 2006 年 6 月 13 日 。 以下是不同输入的解析结果,Org mode 自动补全的部分以 粗体 标出。

3-2-5⇒ 2003-02-05
2/5/3⇒ 2003-02-05
142006-06-14
122006-07-12
2/52007-02-05
Fri⇒ 最近的星期五(默认日期或之后)
sep 152006-09-15
feb 152007-02-15
sep 12 9⇒ 2009-09-12
12:452006-06-13 12:45
22 sept 0:342006-09-22 0:34
w42006 年的 ISO 第 4 周
2012 w4 fri⇒ 2012 年 ISO 第 4 周的星期五
2012-w04-5⇒ Same as above

此外,你可以在输入的 开头 指定相对日期:输入正负号、数字和字母—‘h’ 、 ‘d’ 、 ‘w’ 、 ‘m’ 或 ‘y’—分别表示小时、天、周、月或年的偏移量。使用 ‘h’ 时,日期相对于当前时间计算;使用其他字母且只有单个正负号时,日期相对于当日 00:00 计算。使用双正负号时,日期相对于默认日期计算。如果不用单个字母,而是使用星期几的缩写,则表示第 N 个对应星期几,例如:

+0⇒ 今天
.⇒ 今天
+2h⇒ 从现在起两小时后
+4d⇒ 从今天起四天后
+4⇒ 与 +4d 相同
+2w⇒ 从今天起两周后
++5⇒ 从默认日期起五天后
+2tue⇒ 从现在起第二个星期二

该函数支持英文月份与星期缩写。 若想使用完整名称或其他语言, 可配置变量 parse-time-monthsparse-time-weekdays

并非所有 Emacs 实现都能表示所有日期。 默认情况下,Org mode 会将日期限制在 1970–2037 的兼容区间, 以适配所有 Emacs 版本。若需使用该区间外的日期, 请查阅变量 org-read-date-force-compatible-dates 的文档。

你可以通过指定起止时间或开始时间加时长(HH:MM 格式)定义时间区间。 前者使用一个或两个短横线分隔,后者使用 ‘+’ 分隔,例如:

11am-1:15pm⇒ 11:00-13:15
11h-13h15⇒ 同上
11am--1:15pm⇒ 同上
11am+2:15⇒ 同上

在小缓冲提示的同时,会弹出日历63。 退出日期提示时(点击日历日期或按 RET), 日历选中日期会与提示行输入信息合并。 你可以在小缓冲中完全控制日历:

RET选中日历中光标所在的日期。
mouse-1点击选中对应日期。
S-RIGHT向后一天。
S-LEFT向前一天。
S-DOWN向后一周。
S-UP向前一周。
M-S-RIGHT向后一个月。
M-S-LEFT向前一个月。
>日历向后滚动一个月。
<日历向前滚动一个月。
M-v日历向后滚动三个月。
C-v日历向前滚动三个月。
C-.选中今天的日期64

日期/时间提示的逻辑看似复杂,但熟悉后会非常顺手, 甚至会对其他日期输入方式感到不适。 为帮助理解,小缓冲会实时显示当前输入的解析结果65


8.2.2 Custom time format

Org mode 使用 ISO 8601 标准的日期时间格式。 若不习惯该格式并希望使用其他显示方式, 可自定义变量 org-display-custom-timesorg-timestamp-custom-formats

C-c C-x C-t (org-toggle-timestamp-overlays)

切换日期时间自定义格式的显示状态。

Org mode 需要默认格式用于解析, 因此自定义日期/时间格式不会 替换(replace) 默认格式, 而是通过文本属性覆盖在默认格式之上。这会带来以下影响:

  • 无法再将光标定位到时间戳内部,只能位于其前方或后方。
  • S-UPS-DOWN 键不再能用于调整时间戳的各个分量。如果光标在时间戳开头,S-UPS-DOWN 会按一天为单位修改时间戳,效果与 S-LEFTS-RIGHT 相同。如果光标在时间戳末尾,则按一分钟为单位调整时间。
  • 如果时间戳包含时钟时间区间或重复规则,这部分内容不会被覆盖,会原样保留在缓冲区中。
  • 当你逐字符删除时间戳时,只有属于 ISO 时间戳的 所有 (不可见)字符都被移除后,它才会从缓冲区中消失。
  • 如果自定义时间戳格式长于默认格式,并且你在表格中使用日期,表格对齐会错乱。如果自定义格式更短,则一切正常工作。

8.3 Deadlines and Scheduling

时间戳前可添加特殊关键字以方便规划。 关键字与时间戳必须紧跟在对应任务后方。

DEADLINE

含义:该任务(通常为 TODO 条目,但并非必须) 应在指定日期前完成。

截止日期当天,任务会出现在日程表中。 此外,从截止日期前 org-deadline-warning-days 天开始, 直至任务标记为完成,今日日程都会显示即将到期或已逾期的提醒。 示例:

*** TODO write article about the Earth for the Guide
    DEADLINE: <2004-02-29 Sun>
    The editor in charge is [[bbdb:Ford Prefect]]

你可以为特定截止日期指定不同的提前提醒天数, 例: ‘DEADLINE: <2004-02-29 Sun -5d>’ 表示提前 5 天提醒。 若任务已排期且 org-agenda-skip-deadline-prewarning-if-scheduled 设为 t ,该提醒会被禁用。

SCHEDULED

含义:计划在指定日期开始处理该任务。

条目标题会列在指定日期下66。 此外,在 今日 汇总中会提示该排期日期已过, 直至任务标记为完成——即任务会自动顺延直至完成。

*** TODO Call Trillian for a date on New Years Eve.
    SCHEDULED: <2004-12-25 Sat>

若想 推迟(delay) 任务在日程中的显示, 可使用 ‘SCHEDULED: <2004-12-25 Sat -2d>’ : 任务仍排期在 25 日,但两天后才会出现。 若任务带重复规则,延迟会作用于所有重复项; 若只想延迟首次排期,使用 ‘--2d’ 。 全局或按日程控制该行为可查看 org-scheduled-delay-daysorg-agenda-skip-scheduled-delay-if-deadline

Important: 在 Org 模式中对条目进行排期(scheduling), 不应 理解为我们平常所说的 安排会议(scheduling a meeting) 。为会议设定日期只是一个简单的预约,你应该用普通时间戳标记该条目,让它显示在对应的日期上。这是 Org 用户经常产生的一个误解。在 Org 模式中, 排期(scheduling) 指的是设定你打算开始处理某个行动项的日期。

排期与截止日期条目中可使用带重复规则的时间戳。 Org mode 会基于时间戳为 最近一次重复 的假设 发出提前与逾期提醒。但类似如下的日记表达式条目:

<%%(diary-float t 42)>

在排期与截止时间戳中的使用有限制。 Org mode 无法解析函数内部逻辑以发出提醒, 但会在表达式匹配的每一天显示该条目。


8.3.1 Inserting deadlines or schedules

以下命令可快速插入截止日期或排期条目67

C-c C-d (org-deadline)

插入 ‘DEADLINE’ 关键字及时间戳, 插入位置紧跟在标题行下方, 并移除任何 ‘CLOSED’ 时间戳。 带前缀参数调用时,同时移除条目已有截止日期。 根据变量 org-log-redeadline 的设置, 修改已有截止日期时会记录日志68

C-c C-s (org-schedule)

插入 ‘SCHEDULED’ 关键字及时间戳, 插入位置紧跟在标题行下方, 并移除任何 ‘CLOSED’ 时间戳。 带前缀参数调用时,同时移除条目已有排期日期。 根据变量 org-log-reschedule 的设置, 修改已有排期时间时会记录日志69

C-c / d (org-check-deadlines)

生成稀疏树,展示所有已逾期 或在 org-deadline-warning-days 内即将到期的截止日期。 带 C-u 前缀时显示文件中所有截止日期; 带数字前缀时检查对应天数, 如 C-1 C-c / d 显示所有明日到期的截止日期。

C-c / b (org-check-before-date)

生成稀疏树,展示指定日期前的截止日期与排期条目。

C-c / a (org-check-after-date)

生成稀疏树,展示指定日期后的截止日期与排期条目。

注意 org-scheduleorg-deadline 支持相对时间设置日期, 例如 ‘+1d’ 设为次日, ‘--1w’ 设为当前时间戳前一周。


8.3.2 Repeated tasks

部分任务需要反复执行。Org mode 可通过 ‘DEADLINE’ 、 ‘SCHEDULED’ 或普通时间戳中的重复规则 管理这类任务70。如下例:

** TODO Pay the rent
   DEADLINE: <2005-10-01 Sat +1m>

其中 ‘+1m’ 为重复规则,表示任务截止日期为 ‘<2005-10-01>’ , 并从该时间起每月重复一次。 可使用 ‘y’ 、 ‘m’ 、 ‘w’ 、 ‘d’ 、 ‘h’ 实现年、月、周、日、小时重复。 若截止日期需同时设置重复与特殊提醒周期, 重复规则应在前,提醒周期在后:

DEADLINE: <2005-10-01 Sat +1m -3d>

截止日期与排期条目逾期后会在日程中显示, 因此完成后需及时标记为已完成。 当你将带 ‘DEADLINE’ 或 ‘SCHEDULED’ 的任务 设为 TODO 状态 ‘DONE’ 时,它将不再出现在日程中。 但问题在于, 下一次 重复条目也会失效。 Org mode 处理方式如下:使用 C-c C-t 标记完成时,会按重复周期偏移时间戳基准日期, 并立即将条目状态恢复为 TODO71。 上例中标记为 ‘DONE’ 后日期会变为:

** TODO Pay the rent
   DEADLINE: <2005-11-01 Tue +1m>

若任务包含多个带重复周期的时间戳,所有时间戳都会偏移。

若要将带重复规则的任务永久标记为完成, 使用 C-- 1 C-c C-t, 即带数字前缀 ‘-1’ 的 org-todo 命令。

会在截止日期下方添加时间戳72,记录上一次任务的执行时间。

偏移基准日期后,该条目在查看历史日期时不再显示, 但所有未来重复项均可见。

使用 ‘+1m’ 时,日期偏移严格为一个月。 若三个月未交房租,标记完成后仍会处于逾期状态。 根据任务类型,这未必是最佳方式。 例如三周未给父亲打电话,没必要一天内补打三次。 还有像更换电池这类任务,应在 上次完成后 固定时间再重复。 对此类任务,Org mode 提供特殊重复符 ‘++’ 和 ‘.+’ 。 示例:

** TODO 给父亲打电话
   DEADLINE: <2008-02-10 Sun ++1w>
   将此项标记为已完成会将日期至少顺延一周,
   并会继续顺延直到该日期变为未来日期。
   但即使你在周六打电话并标记完成,
   下次日期仍会保持在周日。

** TODO 倒厨房垃圾
   DEADLINE: <2008-02-08 Fri 20:00 ++1d>
   将此项标记为已完成会将日期至少顺延一天,
   并会继续顺延直到该时间戳变为未来日期。
   由于时间戳中包含具体时间,
   如果你在 20:00 前完成任务,
   下一次截止日期会落在今天。

** TODO 检查烟雾报警器电池
   DEADLINE: <2005-11-01 Tue .+1m>
   将此项标记为已完成会把日期设为从今天起一个月后。

** TODO 洗手
   DEADLINE: <2019-04-05 08:00 Fri .+1h>
   将此项标记为已完成会把日期设为从现在起整一小时后。

同一任务可同时包含排期与截止日期信息。 若仅为排期设置重复规则,通常希望截止日期后忽略重复, 此时可将变量 org-agenda-skip-scheduled-repeats-after-deadline 设为 t 。 而无重复规则的排期信息在任务完成后不再相关, 重复时会被自动移除。若希望排期与截止日期按相同周期重复, 为两个时间戳设置相同重复规则即可。

除使用重复规则外,也可复制多个任务子树并分别偏移日期。 命令 C-c C-x c 用于该功能, 详见 Structure Editing


8.4 Clocking Work Time

Org mode 允许你为项目中特定任务记录花费的时间。 开始处理某项内容时可以启动计时,停止处理该任务或将任务标记为完成时, 计时会停止并记录对应的时间区间。 它还会计算项目中每个子树73上花费的总时间,并保存最近计时任务的历史记录, 方便你在多个占用时间的任务之间快速切换。

要在 Emacs 会话之间保存计时历史,可使用:

(setq org-clock-persist 'history)
(org-clock-persistence-insinuate)

重启 Emacs 后开始新任务计时时,未完成的计时74会被恢复(参见 Resolving idle time (1)),并提示你如何处理。


8.4.1 Clocking commands

C-c C-x C-i (org-clock-in)

为当前条目启动计时(开始计时)。该操作会插入 ‘CLOCK’ 关键字及时间戳。 如果这不是该条目首次计时,多条 ‘CLOCK’ 行会被收纳到 ‘LOGBOOK’ 抽屉中 (另见变量 org-clock-into-drawer )。 你也可以通过为子树设置 ‘CLOCK_INTO_DRAWER’ 或 ‘LOG_INTO_DRAWER’ 属性, 覆盖该变量的设置。 携带 C-u 前缀调用时,从最近计时任务列表中选择任务。 携带两层 C-u C-u 前缀时,为光标处任务计时并将其设为默认任务; 选择计时任务时,默认任务始终可通过按键 d 快速选中。 携带三层 C-u C-u C-u 前缀时,以上一次计时结束时间为起点启动连续计时。

计时运行时,Org 会在模式行显示当前计时时间及任务标题。 显示的计时时间为该任务及其子任务的所有累计计时。 如果任务设有预估耗时(参见 Effort Estimates),模式行会同步显示当前计时与预估耗时的对比75。 若任务为重复任务(参见 Repeated tasks),则只显示任务最近一次重置后的耗时76。 你可以通过 ‘CLOCK_MODELINE_TOTAL’ 属性更精细控制显示的时间, 可选值包括 ‘current’ (仅显示本次计时)、 ‘today’ (显示当日该任务所有计时—另见变量 org-extend-today-until )、 all (显示全部时间)或 auto (默认值)77。 使用 mouse-1 点击模式行中的计时项,会弹出包含计时相关选项的菜单。

C-c C-x C-o (org-clock-out)

停止计时(结束计时)。会在上次计时启动的相同位置插入另一个时间戳, 并直接计算耗时,以 ‘=>HH:MM’ 格式插入在时间区间后。 参见变量 org-log-note-clock-out ,可在结束计时的时间戳旁额外记录备注78

C-c C-x C-x (org-clock-in-last)

为上一个计时任务重新计时。携带一层 C-u 前缀时,从计时历史中选择任务。 携带两层 C-u 前缀时,以上次计时结束时间为起点强制连续计时。

C-c C-x C-e (org-clock-modify-effort-estimate)

更新当前正在计时任务的预估耗时。

C-c C-c or C-c C-y (org-evaluate-time-range)

修改某个时间戳后重新计算时间区间。仅当你直接编辑时间戳时才需要此操作; 若通过 S-<cursor> 按键修改,更新会自动完成。

C-S-UP (org-clock-timestamps-up), C-S-DOWN (org-clock-timestamps-down)

在 ‘CLOCK’ 日志行上,同时增大/减小两个时间戳,保持计时时长不变。

S-M-UP (org-timestamp-up), S-M-DOWN (org-timestamp-down)

在 ‘CLOCK’ 日志行上,将光标处时间戳与上一条或下一条计时时间戳同步增减相同时长。 例如,按下 S-M-UP 将结束计时时间戳增加五分钟,下一条计时的开始时间戳也会同步增加五分钟。

调整前后时间戳时,仅考虑当前 Emacs 会话中创建的 ‘CLOCK’ 日志。

C-c C-t (org-todo)

将条目的 TODO 状态改为 DONE 时,若该条目正在计时,会自动停止。

C-c C-x C-q (org-clock-cancel)

取消当前计时。适用于误启动计时或最终处理了其他任务的场景。

C-c C-x C-j (org-clock-goto)

跳转到当前正在计时任务的标题。携带 C-u 前缀时,从最近计时任务列表中选择目标任务。

C-c C-x C-d (org-clock-display)

在当前缓冲区显示每个子树的时间汇总。会在每个标题末尾添加覆盖层, 显示该标题下记录的总时间(包含所有子标题时间)。 你可以使用可见性循环查看结构,但修改缓冲区(参见变量 org-remove-highlights-with-change ) 或按下 C-c C-c 后覆盖层会消失。

在日程表中(参见 Weekly/daily agenda)可使用 l 键, 查看当日处理或完成的任务。

重要: 注意 org-clock-outorg-clock-in-last 均可设置全局按键绑定,且不会改变窗口布局。


8.4.2 The clock table

Org mode 可基于计时信息生成相当复杂的报表,这类报表称为 计时表(clock table) , 会以一个或多个 Org 表格的形式呈现。

org-clock-report

插入或更新计时表。携带前缀参数调用时,跳转到当前文档第一个计时表并更新。 计时表包含已归档的子树。

该命令可通过调用 org-dynamic-block-insert-dblockC-c C-x x) 并选择 “clocktable” 触发(参见 Dynamic Blocks)。

C-c C-c or C-c C-x C-u (org-dblock-update)

更新光标处的动态块。光标需位于动态块的 ‘BEGIN’ 行。

C-u C-c C-x C-u

更新所有动态块(参见 Dynamic Blocks)。适用于缓冲区中包含多个计时表块的场景。

S-LEFT, S-RIGHT (org-clocktable-try-shift)

偏移当前 ‘:block’ 时间区间并更新表格。光标需位于 ‘#+BEGIN: clocktable’ 行。 若 ‘:block’ 为 ‘today’ ,会偏移为 ‘today-1’ ,依此类推。

以下是 org-clock-report 插入到缓冲区时,计时表框架的示例:

#+BEGIN: clocktable :maxlevel 2 :emphasize nil :scope file
#+END:

#+BEGIN’ 行包含用于定义报表范围、结构与格式的选项, 所有选项的默认值可在变量 org-clocktable-defaults 中配置。

首先是用于筛选计时条目的选项:

:maxlevel

表格中时间明细展示的最大层级深度,更深层级的计时会汇总到上层。

:scope

统计范围,可设置为以下任意值:

nil当前缓冲区或缩小后的区域
file整个当前缓冲区
subtree计时表所在的子树
treeN所在的 N 级树,例如 ‘tree3
tree所在的 1 级树
agenda所有日程文件
("file" ...)扫描指定文件
FUNCTION调用无参函数 FUNCTION 返回的文件
file-with-archives当前文件及其归档文件
agenda-with-archives所有日程文件(包含归档文件)
:block

要统计的时间块,可使用绝对时间或相对当前时间,支持格式:

2007-12-312007 年除夕夜
2007-122007 年 12 月
2007-W502007 年第 50 周
2007-Q22007 年第二季度
20072007 全年
today’, ‘yesterday’, ‘today-N相对日期
thisweek’, ‘lastweek’, ‘thisweek-N相对周
thismonth’, ‘lastmonth’, ‘thismonth-N相对月
thisyear’, ‘lastyear’, ‘thisyear-N相对年
untilnow79所有历史计时时间

未设置该选项时,Org 会使用 org-clock-display-default-range 的值,默认为当前年份。

使用 S-LEFTS-RIGHT 可偏移时间区间。

:tstart

统计起始时间字符串,支持 ‘\"<-2w>\"’ 这类相对时间, 相对时间语法参见 Matching tags and properties

:tend

统计结束时间字符串,支持 ‘\"<now>\"’ 这类相对时间, 相对时间语法参见 Matching tags and properties

:wstart

一周起始日期,默认 1 为周一。

:mstart

一月起始日期,默认 1 为 1 号。

:step

设置为 ‘day’ 、 ‘week’ 、 ‘semimonth’ 、 ‘month’ 、 ‘quarter’ 或 ‘year’ ,将表格按时间段拆分。 使用该选项时,必须指定 ‘:block=,或同时指定 =:tstart’ 与 ‘:tend’ 。

:stepskip0

nil 时,不显示耗时为零的时间段。

:fileskip0

nil 时,不显示无有效数据的文件对应的表格区段。

:match

用于筛选条目标签匹配表达式,匹配语法参见 Matching tags and properties

接下来是控制表格格式的选项,这些选项由函数 org-clocktable-write-default 解析, 你也可以通过 ‘:formatter’ 参数指定自定义函数。

:emphasize

nil 时,突出显示一级和二级条目。

:lang

用于“任务”等描述单元格的语言80

:link

将表格中的条目标题链接到原文位置。

:narrow

限制 Org 表格中标题列宽度的整数。若写作 ‘50!’ ,导出时标题也会被缩短。

:indent

根据层级缩进标题字段。

:filetitle

若文件设有 ‘#+title’ ,在文件列显示标题。

:hidefiles

由多个文件生成表格时,隐藏文件列。

:tcolumns

时间数据所用列数。若小于 ‘:maxlevel’ ,更低层级会合并为一列。

:level

是否包含层级号列。

:sort

包含排序列与排序类型的序对。例如 ‘:sort (1 . ?a)’ 表示对第一列按字母序排序。

:compact

等价于 ‘:level nil :indent t :narrow 40! :tcolumns 1’ , 除非显式指定 ‘:narrow’ ,否则相关设置均会被覆盖。

:timestamp

条目的时间戳(若有),按顺序查找 ‘SCHEDULED’ 、 ‘DEADLINE’ 、 ‘TIMESTAMP’ 和 ‘TIMESTAMP_IA’ 特殊属性(参见 Special Properties)。

:tags

该标记非 nil 时,显示标题的标签。

:properties

要在表格中显示的属性列表,每个属性占用一列。

:inherit-props

该标记非 nil 时, ‘:properties’ 的值会沿层级继承。

:formula

要添加并计算的 ‘TBLFM’ 关键字内容。特殊用法 ‘:formula %’ 会添加一列百分比耗时。 若此处未指定公式,计时表下方已有的公式会在更新时保留并计算。

:formatter

用于格式化计时数据并插入到缓冲区的函数。

如需获取当前一级树当日的计时汇总,可写作:

#+BEGIN: clocktable :maxlevel 2 :block today :scope tree1 :link t
#+END:

如需使用指定时间范围,可写作81

#+BEGIN: clocktable :tstart "<2006-08-10 Thu 10:00>"
                    :tend "<2006-08-10 Thu 12:00>"
#+END:

一周前到当前时刻的时间范围可写作:

#+BEGIN: clocktable :tstart "<-1w>" :tend "<now>"
#+END:

当前子树带百分比(%)耗时的汇总可写作:

#+BEGIN: clocktable :scope subtree :link t :formula %
#+END:

上周所有计时的紧凑横向展示可写作:

#+BEGIN: clocktable :scope agenda :block lastweek :compact t
#+END:

8.4.3 Resolving idle time and continuous clocking

Resolving idle time

如果你为某个工作项启动了计时,之后离开电脑—比如去接一通电话—你通常需要 “处理(resolve)” 这段离开的时间:要么从当前计时中扣除,要么把这段时间计入另一个任务。

通过将变量 org-clock-idle-time 自定义为某个整数(例如 10 或 15),Emacs 可以在你闲置这么多分钟 82 后回到电脑时提醒你,并询问你要如何处理这段闲置时间。当你返回时会出现一个提示,显示已经闲置的时长并持续更新当前数值,同时提供一组选项来修正时间偏差:

k

保留部分或全部分钟并继续当前计时,按 k。 Org 会询问保留的分钟数,按 RET 保留全部(即不做修改), 或输入数字保留指定分钟。

K

按住 Shift 按 K,会保留指定分钟数并立即结束当前任务计时。 若保留全部分钟,效果等同于直接结束当前任务计时。

s

不保留任何分钟,按 s 从计时中扣除全部离开时间, 并从返回时刻重新开始计时。

S

不保留任何分钟,并直接在离开开始时刻结束计时,按住 Shift 按 S。 注意使用 Shift 时无论选择哪项,最终都会处于未计时状态。

C

直接取消整个计时,按 C。 注意若未取消而是扣除离开时间后,计时时长不足一分钟, 计时仍会被取消,避免日志中出现空条目。

如果从当前计时中扣除了离开时间,现在想将其计入新任务? 只需在扣除后立即为任意任务启动计时。Org 会检测到你有已扣除的“记账时间”, 并询问是否将这段时间计入下一个计时任务。

这种计时处理逻辑还会出现在另一种场景: 假设你正在计时编辑内容,突然意外断电导致所有缓冲区丢失, 但得益于自动保存,你仍保留了最近的 Org 修改(包括最后一次计时启动)。

重启 Emacs 并为任意任务计时后,Org 会检测到上一会话中存在未正常结束的悬空计时。 以上次计时开始时间作为未统计时段起点,Org 会询问如何处理这段时间。 逻辑与行为和处理闲置离开时间完全一致,只是触发原因是异常恢复而非固定闲置时长。

你也可以随时通过 M-x org-resolve-clocks RET(或 C-c C-x C-z) 检查 Org 日程涉及的所有文件中的悬空计时。

Continuous clocking

你可能希望以上一个任务的结束时间作为新任务的计时起点。 要系统性启用该功能,将 org-clock-continuously 设为非 nil 。 每次启动计时时,Org 会读取本次会话中上一条计时的结束时间, 并从该时刻开始新计时。

若仅偶尔需要该功能,可在使用 org-clock-in 时携带三层通用前缀参数, 或在使用 org-clock-in-last 时携带两层 C-u C-u 前缀。

Clocking out automatically after some idle time

如果你经常忘记在闲置前结束计时,且不想手动调整计时时间, 可以将 org-clock-auto-clockout-timer 设为秒数, 并在 ‘.emacs’ 文件中添加 ‘(org-clock-auto-clockout-insinuate)’ 。

当计时正在运行且 Emacs 闲置超过该秒数时,会自动结束计时。

使用 ‘M-x org-clock-toggle-auto-clockout RET’ 可临时开启或关闭该功能。


8.5 Effort Estimates

若你需要非常细致地规划工作,或需要在报价中注明预估工作量, 可以为条目设置预估耗时。如果你同时记录实际工作时间, 后续可对比计划耗时与实际耗时,这是优化预估准确性的有效方式。

预估耗时存储在特殊属性 ‘EFFORT’ 中,支持多种格式, 如 ‘3:12’ 、 ‘1:23:45’ 或 ‘1d3h5min’ ; 格式详情参见文件 ‘org-duration.el’ 。

你可以通过以下命令为条目设置预估耗时:

C-c C-x e (org-set-effort)

为当前条目设置预估耗时。携带前缀参数时,设为下一个允许值—见下文。 该命令在日程表中也可通过 e 键触发。

C-c C-x C-e (org-clock-modify-effort-estimate)

修改当前正在计时条目的预估耗时。

使用预估耗时的最佳方式是通过列视图(参见 Column View)。 你应先设置离散的预估耗时可选值,以及能同时显示这些值与计时汇总的 ‘COLUMNS’ 格式(如果你需要记录时间)。 针对特定缓冲区可使用:

#+PROPERTY: Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00
#+COLUMNS: %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM

或者更好的方式是,通过自定义变量 org-global-propertiesorg-columns-default-format 进行全局设置。 尤其当你希望在日程表中也使用该配置时,全局设置更为推荐。

为单个条目分配预估耗时的方式是切换到列模式, 使用 S-RIGHTS-LEFT 修改数值。 输入的值会立即在层级结构中汇总,相邻列会显示对应计时时间。

在日/周日程表中切换到列视图时,预估耗时列会汇总每日的计划工作量83, 你可以据此在日程中安排时间。 如需查看当日已占用时间的整体情况,可设置选项 org-agenda-columns-add-appointments-to-effort-sum , 当日指定时间段的日程会被计入当日负载预估。

预估耗时可用于日程表二次过滤,在日程表中按 / 键触发(参见 Commands in the Agenda Buffer)。 若你统一设置了预估耗时,只需按两三次键,即可筛选出符合可用时间段的任务。


8.6 Taking Notes with a Relative Timer

Org 提供两种计时器:一种是正向递增的相对计时器, 适用于会议、视频观看等场景下记录笔记;另一种是倒计时计时器。

相对计时器与倒计时计时器由不同命令启动。

C-c C-x 0 (org-timer-start)

启动或重置相对计时器。默认计时器从 0 开始。 携带 C-u 前缀调用时,提示输入起始偏移量。 提示框会默认使用光标处的计时器字符串(若有), 方便在过程中断后重新开始记录笔记。 携带双层前缀参数 C-u C-u 调用时, 按指定数值批量修改选中区域内所有计时器字符串, 可用于修正因计时器未准时启动导致的时间偏差。

C-c C-x ; (org-timer-set-timer)

启动倒计时计时器,提示输入时长。 org-timer-default-timer 设置默认倒计时值。 携带数字前缀参数可覆盖该默认值。 该命令在日程缓冲区中可通过 ; 触发。

启动后,相对计时器与倒计时计时器由相同命令控制。

C-c C-x . (org-timer)

向缓冲区插入当前相对时间。首次使用时启动计时器, 携带前缀参数可重置计时器。

C-c C-x - (org-timer-item)

插入带当前相对时间的描述列表项。携带前缀参数时,先将计时器重置为 0。

M-RET (org-insert-heading)

计时器列表启动后,也可使用 M-RET 插入新的计时器项。

C-c C-x , (org-timer-pause-or-continue)

暂停计时器,若已暂停则恢复。

C-c C-x _ (org-timer-stop)

停止计时器。停止后只能启动新计时器,无法恢复旧计时器。 该命令也会从模式行移除计时器显示。


9 Refiling and Archiving

当信息录入系统后,往往需要进行位置调整。 Org 为此提供了归位、复制与归档命令。归位和复制 用于移动和复制大纲结构,归档则能让系统保持简洁高效。


9.1 Refile and Copy

在查看已捕获的内容时,你可能需要将部分条目归位或复制 到其他列表中,例如归入某个项目。手动剪切、查找位置 再粘贴的操作十分繁琐,可通过以下专用命令简化流程:

C-c C-w (org-refile)

归位光标所在的条目或选中区域。该命令会列出可归位的目标位置, 并支持通过补全功能进行选择。选中内容会作为子项放置在 目标标题下方,具体是首位还是末位子项,由 org-reverse-note-order 变量决定。

默认情况下,当前缓冲区的所有一级标题均可作为目标位置, 你也可以跨多个文件配置更复杂的规则,详情参见变量 org-refile-targets~。若想通过类似文件路径的大纲路径 补全选择位置,可查看 ~org-refile-use-outline-pathorg-outline-path-complete-in-steps 。 若需要在归位时即时创建新的父级节点, 可配置变量 org-refile-allow-creating-parent-nodes 。 当设置 org-log-refile84后, 条目每次被归位时都会记录时间戳或备注信息。

C-u C-c C-w

通过归位界面跳转到指定标题位置。

C-u C-u C-c C-w (org-refile-goto-last-stored)

跳转到上一次使用 org-refile 移动结构树的目标位置。

C-2 C-c C-w

将条目归位到当前正在计时项目的子项位置。

C-3 C-c C-w

归位条目并保留原位置副本。可通过 org-refile-keep 将此行为设为默认,注意该操作可能导致 ‘ID’ 属性重复。

C-0 C-c C-w or C-u C-u C-u C-c C-w (org-refile-cache-clear)

清空归位目标缓存。可通过设置 org-refile-use-cache 启用缓存功能,若要让命令识别新增的目标位置, 需执行此命令清空缓存。

C-c M-w (org-refile-copy)

复制操作与归位逻辑一致,区别是不会删除原条目。

C-c C-M-w (org-refile-reverse)

功能与归位一致,区别在于它会临时反转 org-reverse-note-order 在当前缓冲区中的生效方式。因此,如果 org-refile 会将条目追加到目标标题下方作为最后一项, org-refile-reverse 就会将其插入作为第一项,反之亦然。


9.2 Archiving

当由(子)结构树表示的项目完成后,你可能希望将该结构树移开,不再让它出现在日程中。归档功能对于保持工作文件简洁、并让日程视图生成等全局检索操作保持快速非常重要。

C-c C-x C-a (org-archive-subtree-default)

按照变量 org-archive-default-command 指定的方式 归档当前条目。


9.2.1 Moving a tree to an archive file

最常用的归档操作是将项目结构树移动到另一个文件, 该文件即为归档文件。

C-c C-x C-s or short C-c $ (org-archive-subtree)

将光标所在的结构树归档到 org-archive-location 指定的位置。

C-u C-c C-x C-s

检查当前标题的所有直接子项是否可归档。系统会遍历每个子树, 查看是否存在未完成的 TODO 条目,若无则提示将其移入归档位置。 若执行命令时光标 落在标题上,则会检查所有一级结构树。

C-u C-u C-c C-x C-s

操作同上,但会检查结构树中的时间戳而非 TODO 条目。 如果该结构树确实包含时间戳且时间已过期,命令会提示将其归档。

默认归档位置为当前文件同级目录下,文件名在原名称后追加 ‘_archive’ 的文件。 你也可以指定归档内容所属的标题,甚至将其归入文件内的日期树结构。 关于文件与标题的配置方式及示例,详见变量 org-archive-location 的说明文档。

同时也支持在缓冲区内部配置该变量,示例如下:

#+ARCHIVE: %s_done::

若需要为单个条目或结构树指定专属归档位置, 可为其设置 ‘ARCHIVE’ 属性并填入目标路径(参见 Properties and Columns)。

结构树被归档时,会自动添加若干特殊属性,用于记录来源文件、 大纲路径、归档时间等上下文信息。可通过配置 org-archive-save-context-info 调整记录的信息内容。

org-archive-subtree-save-file-p 不为 nil 时, 会自动保存目标归档缓冲区的修改。


9.2.2 Internal archiving

如果只想在日程视图中屏蔽某些子树、而不将它们移到其他文件,可以使用 ‘ARCHIVE’ 标签。

标记了 ‘ARCHIVE’ 标签的标题(参见 Tags)会保留在大纲树中的原有位置,但行为如下:

  • 使用可见性循环命令无法将其展开(参见 Visibility Cycling)。 可通过 C-c C-TAB 强制展开归档结构树, 或设置选项 org-cycle-open-archived-trees~。 此外,~org-fold-show-all 等常规大纲命令也可展开归档内容。
  • 生成稀疏树时(参见 Sparse Trees),归档结构树内的匹配项 默认不会显示,除非修改 org-sparse-tree-open-archived-trees 配置。
  • 生成日程视图时(参见 Agenda Views),归档结构树的内容 默认会被忽略,除非配置 org-agenda-skip-archived-trees 使其始终生效。 在日程视图中可按下 v a 临时显示归档内容。
  • 归档结构树默认不会被导出(参见 Exporting),仅导出标题, 可通过变量 org-export-with-archived-trees 调整导出规则。
  • 归档结构树默认不参与列视图展示,除非将 org-columns-skip-archived-trees 设为 nil

以下命令用于管理 ‘ARCHIVE’ 标签:

C-c C-x a (org-toggle-archive-tag)

为当前标题切换归档标签。标签启用后, 标题会切换为阴影样式的文本的视觉样式,下方结构树自动隐藏。

C-u C-c C-x a

检查当前标题的直接子项是否需要归档。遍历子树查看是否存在 未完成的 TODO 条目,若无则提示为该子项添加 ‘ARCHIVE’ 标签。 若光标不在标题上,则检查所有一级结构树。

C-c C-TAB (org-cycle-force-archived)

强制展开带有 ‘ARCHIVE’ 标签的结构树。

C-c C-x A (org-archive-to-archive-sibling)

将当前条目移动至 归档同级节点(Archive Sibling) 。该节点是标题为 ‘Archive’ 且带有归档标签、与当前条目同级的节点。当前条目会成为该同级节点的子项,以此保留大量原有上下文信息,包括继承的标签以及在大纲中的大致位置。


10 Capture and Attachments

任何整理系统的重要组成部分,都是能够快速捕获新想法与任务,并将参考资料与之关联。Org 通过名为 捕获(capture) 的流程实现这一功能。它还可以在专用目录中存储与任务相关的文件(/附件(attachments)/)。最后,它还能解析 RSS 提要以获取信息。如需了解如何让外部程序(如网页浏览器)触发 Org 捕获内容,请参见 Protocols for External Access


10.1 Capture

捕获功能让你可以快速保存笔记,几乎不打断工作流程。Org 的新建内容捕获方式深受 John Wiegley 优秀的 Remember 扩展启发。


10.1.1 Setting up capture

以下自定义设置用于指定笔记的默认目标文件。

(setq org-default-notes-file (concat org-directory "/notes.org"))

你也可以为捕获新内容定义全局快捷键(参见 Activation)。


10.1.2 Using capture

M-x org-capture (org-capture)

显示捕获模板菜单。若已定义模板(参见 Capture templates),菜单会列出这些模板供选择。它会将模板插入目标文件,并切换到 narrowed 间接缓冲区以显示该新节点。之后你即可插入所需信息。

C-c C-c (org-capture-finalize)

在捕获缓冲区完成信息输入后,C-c C-c 会恢复捕获前的窗口布局,让你不受干扰地继续工作。带前缀参数调用时,会完成保存并跳转到刚捕获的条目。

C-c C-w (org-capture-refile)

通过将笔记重新归档到其他位置来完成捕获流程(参见 Refile and Copy)。请注意这是一条普通的重新归档命令,执行时光标位置很重要。若已插入包含父节点与子节点的树形结构,需先将光标移回父节点。该命令的任何前缀参数都会传递给 org-refile 命令。

C-c C-k (org-capture-kill)

中止捕获流程并恢复到之前状态。

你也可以在日程视图中通过 k c 组合键特殊调用 org-capture 。通过这种方式调用时,所选捕获模板插入的时间戳默认使用日程视图中光标所在日期,而非当前日期。

如需查找最近保存的捕获内容位置,可使用带前缀命令的 org-capture

C-u M-x org-capture

跳转到某捕获模板的目标位置,按常规方式选择模板即可。

C-u C-u M-x org-capture

在其缓冲区中跳转到最近保存的捕获条目。

你也可以直接跳转到书签 org-capture-last-stored ,该书签会自动创建,除非你自定义了 org-bookmark-names-plist

如需在 Org 缓冲区的光标位置直接插入捕获内容,可使用 C-0 前缀参数调用 org-capture


10.1.3 Capture templates

你可以为不同类型的捕获内容、不同目标位置使用模板。创建此类模板最简单的方式是通过自定义界面。

C

自定义变量 org-capture-templates

在正式说明模板定义之前,先看一个示例。假设你想用一个模板创建通用待办事项,并将这些事项放在文件 ‘~/org/gtd.org’ 的 ‘Tasks’ 标题下。同时,文件 ‘journal.org’ 中的日期树用于捕获日记条目。可行的配置如下:

(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "~/org/gtd.org" "Tasks")
         "* TODO %?\n  %i\n  %a")
        ("j" "Journal" entry (file+olp+datetree "~/org/journal.org")
         "* %?\nEntered on %U\n  %i\n  %a")))

之后在捕获菜单中按下 t,Org 会为你生成如下模板:

* TODO
  [[file:LINK TO WHERE YOU INITIATED CAPTURE]]

在模板展开过程中, ‘%a’ 会被替换为指向调用捕获命令位置的链接。例如从邮件中提取任务时,这一功能非常实用。填写任务内容后按下 C-c C-c,Org 会回到你开始捕获的位置。

如需定义专用快捷键直接捕获到特定模板,而无需通过交互式模板选择,可按如下方式设置按键绑定:

(define-key global-map (kbd "C-c x")
  (lambda () (interactive) (org-capture nil "x")))

10.1.3.1 Template elements

现在来看模板定义的各个元素。 org-capture-templates 中的每个条目都是包含以下项的列表:

keys

用于选择模板的按键字符串,仅支持字符,例如 ‘"a"’ 表示单键选择模板, ‘"bt"’ 表示双键选择。使用多个按键时,相同前缀的按键在列表中必须连续排列,并在前面用一个双元素条目说明该前缀按键,例如:

("b" "Templates for marking stuff to buy")

若未为 C 键定义模板,该键会打开此复杂变量的自定义缓冲区。

description

简短的模板描述字符串,在选择时显示。

type

条目类型,为符号。有效值包括:

entry

带有标题的 Org 模式节点。将作为目标条目的子节点或顶层节点保存。目标文件应为 Org 文件。

item

普通列表项,放置在目标位置的第一个普通列表中。目标文件同样应为 Org 文件。

checkitem

复选框项。与普通列表项的区别仅在于默认模板不同。

table-line

在目标位置的第一个表格中新建一行。具体插入位置取决于 :prepend:table-line-pos 属性(见下文)。

plain

按原样插入的纯文本。

target

指定捕获内容的保存位置。在 Org 文件中,目标通常指定一个节点,条目会成为该节点的子节点。其他类型内容会添加到该节点正文中的表格或列表中。大多数目标说明包含 ‘<file-spec>’ 。若为空字符串,则默认使用 org-default-notes-file 。文件也可以用变量或无参调用函数指定。若目标未指定绝对路径,则视为相对于 org-directory

有效值包括:

(file <file-spec>)

文本将放在该文件的开头或结尾。

(id "id of existing org entry")

作为该条目的子节点或在该条目正文中保存。

(file+headline <file-spec> "node headline")
(file+headline <file-spec> function-returning-string)
(file+headline <file-spec> symbol-containing-string)

若目标标题在文件中唯一,可使用此快速配置。

(file+olp <file-spec> "Level 1 heading" "Level 2" ...)
(file+olp <file-spec> function-returning-list-of-strings)
(file+olp <file-spec> symbol-containing-list-of-strings)

对于非唯一标题,使用完整路径更安全。

(file+regexp <file-spec> "regexp to find location")

使用正则表达式定位光标位置。

(file+olp+datetree <file-spec> [ "Level 1 heading" ...])
(file+olp+datetree <file-spec> function-returning-list-of-strings)
(file+olp+datetree <file-spec> symbol-containing-list-of-strings)

该目标85会在日期树86中为今日日期创建标题。若指定可选大纲路径,日期树会建立在该节点之下,而非顶层。更多选项可查看下方的 :time-prompt:tree-type 属性。

(file+function <file-spec> function-finding-location)

用于在文件中查找正确位置的函数。

(clock)

保存到当前正在计时的条目。

(here)

光标 ‘point’ 所在位置。

(function function-finding-location)

最通用的方式:自行编写函数,既打开文件又将光标移到正确位置。

template

用于创建捕获条目的模板。若留空,会使用合适的默认模板。否则为包含转义码的字符串,转义码会根据捕获调用的时间与上下文替换。你也可以从文件87或通过函数动态获取该模板字符串,语法如下:

(file "/path/to/template-file")
(function FUNCTION-RETURNING-THE-TEMPLATE)
properties

条目的剩余部分为附加选项的属性列表。支持的属性包括:

:prepend

通常新捕获的信息会追加到目标位置(最后一个子节点、最后一行表格、最后一个列表项等)。设置该属性可改变此行为。

:immediate-finish

设置后不提供编辑机会,直接保存内容。适用于模板仅需自动添加信息的场景。

:jump-to-captured

设置后完成捕获时跳转到刚捕获的条目。

:empty-lines

设置在新条目前后插入的空行数。默认为 0,另一个常用值为 1。

:empty-lines-after

设置在新条目后插入的空行数,会覆盖 :empty-lines 中后部空行的设置。

:empty-lines-before

设置在新条目前插入的空行数,会覆盖 :empty-lines 中前部空行的设置。

:clock-in

对该条目启动计时。

:clock-keep

保存捕获条目后保持计时继续运行。

:clock-resume

若捕获操作中断了某个计时,完成捕获后恢复该计时。注意 :clock-keep 优先级高于 :clock-resume 。若两者均设为非 nil ,当前计时会继续,之前的计时不会恢复。

:time-prompt

在填充模板与生成日期/周树时提示选择日期/时间。未设置该属性时,捕获使用当前日期时间。即使未设置该属性,也可通过 C-1 前缀参数调用 org-capture 强制启用该行为。

:tree-type

默认按天分组条目。使用 week 可创建周树而非月-日树,即将每日标题放在当前 ISO 周标题下。使用 month 可仅按月分组条目。也可使用 (year quarter month week day) 的任意子集按指定层级分组。若同时指定 monthweek ,周会归属到包含周四的月份,以符合 ISO 年-周规则。若指定 quarterweek 但未指定 month ,季度为 13 周周期;否则为 3 个月周期。

:tree-type 也可以是函数,此时该函数应接收日期作为参数,并为 org-datetree-find-create-hierarchy 生成成对列表。

:unnarrowed

不对目标缓冲区进行 narrowed,直接显示完整缓冲区。默认会 narrowed 只显示新内容。

:table-line-pos

指定新行在表格中的插入位置。应为类似 ‘II-3’ 的字符串,表示新行成为第二条水平分隔线前的第三行。

:kill-buffer

若调用捕获时目标文件尚未打开,完成捕获后关闭该缓冲区。

:no-save

完成捕获后不保存目标文件。

:refile-targets

临时将 org-refile-targets 设置为该属性的值。

:hook

选择模板时,在 org-capture-mode-hook 之前运行的无参函数或无参函数列表。

:prepare-finalize

选择模板时,在 org-capture-prepare-finalize-hook 之前运行的无参函数或无参函数列表。

:before-finalize

选择模板时,在 org-capture-before-finalize-hook 之前运行的无参函数或无参函数列表。

:after-finalize

选择模板时,在 org-capture-after-finalize-hook 之前运行的无参函数或无参函数列表。


10.1.3.2 Template expansion

在模板内部,特殊的 “%-转义序列”88支持动态插入内容。模板按以下顺序展开:

%[FILE]

插入 FILE 指定文件的内容。

%(EXP)

执行 Elisp 表达式 (EXP) 并用结果替换。 (EXP) 必须返回字符串。只有模板中原有的占位符或通过 ‘%[file]’ 引入的占位符会以此方式展开。由于该操作在非交互式 “%-转义” 展开之后执行,因此可使用后者填充表达式。 示例: ‘%(org-id-new)’ 、 ‘%(eval default-directory)

%<FORMAT>

FORMAT 执行 format-time-string 的结果。

%t

时间戳,仅日期。

%T

时间戳,包含日期与时间。

%u’ 、 ‘%U

与上述 ‘%t’ 、 ‘%T’ 类似,但为非激活时间戳。

%i

初始内容,即捕获时选中的区域内容。若同一行中 ‘%i’ 前有文本(如缩进),且 ‘%i’ 不在 ‘%(exp)’ 内,该前缀会添加到插入文本的每一行前。

%a

注释,通常是 org-store-link 创建的链接。

%A

与 ‘%a’ 类似,但会提示输入描述部分。

%l

与 ‘%a’ 类似,但仅插入原始链接。

%L

与 ‘%l’ 类似,但不含括号(仅链接内容)。

%c

当前剪切板首位内容。

%x

X 剪切板内容。

%k

当前计时任务的标题。

%K

指向当前计时任务的链接。

%n

用户名(取自 user-full-name )。

%f

调用 org-capture 时当前缓冲区打开的文件。

%F

当前缓冲区打开文件或目录的完整路径。

%:keyword

特定链接类型的专用信息,见下文。

%^g

提示输入标签,支持目标文件内标签补全。

%^G

提示输入标签,支持所有日程文件内标签补全。

%^t

与 ‘%t’ 类似,但提示选择日期。同理支持 ‘%^T’ 、 ‘%^u’ 、 ‘%^U’ 。可定义提示文字如 ‘%^{Birthday}t’ 。

%^C

交互式选择要使用的剪切或剪贴内容。

%^L

与 ‘%^C’ 类似,但作为链接插入。

%^{PROP}p

提示用户输入属性 PROP 的值。可通过 ‘%^{PROP|default}’ 指定默认值。

%^{PROMPT}X’ ,X 为 g、G、t、T、u、U、C、L 之一

按 ‘%^X’ 方式提示用户,但使用自定义提示字符串。可通过 ‘%^{PROMPT|default|completion1|completion2|completion3...}X’ 指定默认值与补全项。

%^{PROMPT}

提示用户输入字符串并替换该序列。可通过 ‘%^{prompt|default|completion2|completion3...}’ 指定默认值与补全表。方向键可访问提示专用历史记录。

%\N

插入第 N 个 ‘%^{PROMPT}’ (不含 ‘%^{PROMPT}X’ )中输入的文本,N 为从 1 开始的数字。

%\*N

与 ‘%\N’ 相同,但包含所有提示内容。

%?

完成模板展开后,将光标定位到此处。

对于特定链接类型,定义了以下关键字89

链接类型可用关键字
bbdb%:name’ 、 ‘%:company
irc%:server’ 、 ‘%:port’ 、 ‘%:nick
mh, rmail%:type’ 、 ‘%:subject’ 、 ‘%:message-id
%:from’ 、 ‘%:fromname’ 、 ‘%:fromaddress
%:to’ 、 ‘%:toname’ 、 ‘%:toaddress
%:date’ (邮件日期头字段)
%:date-timestamp’ (日期作为激活时间戳)
%:date-timestamp-inactive’ (日期作为非激活时间戳)
%:fromto’ (“to 姓名” 或 “from 姓名”)90
gnus%:group’ ,邮件还支持所有邮件字段
w3, w3m%:url
info%:file’ 、 ‘%:node
calendar%:date
org-protocol%:link’ 、 ‘%:description’ 、 ‘%:annotation

10.1.3.3 Templates in contexts

如需控制某捕获模板是否在特定上下文可用,可自定义 org-capture-templates-contexts 。例如,你有一个用于保存包含补丁的 Gnus 邮件的捕获模板 “p”,可按如下配置:

(setq org-capture-templates-contexts
      '(("p" ((in-mode . "message-mode")))))

你也可以指定命令键 p 指向另一个模板,此时添加该命令键的方式如下:

(setq org-capture-templates-contexts
      '(("p" "q" ((in-mode . "message-mode")))))

更多信息请参见该变量的文档字符串。


10.2 Attachments

将参考资料与标题或子树关联通常很有用。少量纯文本可以直接保存在项目的子树中。超链接(参见 Hyperlinks)可以与本地甚至远程计算机上的其他文件建立关联,例如属于项目的邮件或源代码文件。

另一种方法是使用 附件(attachments) ,即存放在对应标题/子树专属目录中的文件。Org 会使用标题的 ‘ID’ 属性或 ‘DIR’ 属性所指定的目录。


10.2.1 Attachment defaults and dispatcher

默认情况下,Org 附件在为标题添加附件时使用 ‘ID’ 属性。这使得附件的管理完全自动化,无需手动决定文件夹名称或位置。基于 ‘ID’ 的目录默认存放在 ‘data/’ 目录下,该目录与你的 Org 文件位于同一目录91

使用 org-attach 添加附件时,会自动为该节点添加默认标签 ‘ATTACH’ 。

如需更精细地配置相关设置,请参见 Attachment options

以下命令用于处理附件:

C-c C-a (org-attach)

附件系统相关命令的调度器。按下该组合键后会显示命令列表,你需要再按一个键来选择具体命令:

a (org-attach-attach)

选择一个文件并将其移入任务的附件目录。文件会根据 org-attach-method 的设置进行复制、移动或链接。注意并非所有系统都支持硬链接。

c/m/l

分别使用复制/移动/链接方式附加文件。注意并非所有系统都支持硬链接。

b (org-attach-buffer)

选择一个缓冲区,并将其保存为文件存放到任务的附件目录中。

n (org-attach-new)

创建一个新附件,以 Emacs 缓冲区的形式打开。

z (org-attach-sync)

手动同步当前任务与其附件目录,适用于你自行添加了附件的情况。

o (org-attach-open)

打开当前任务的附件。若存在多个附件,会先提示选择文件名。打开方式遵循 org-file-apps 设置的规则。更多细节可参考超链接相关说明(参见 Handling Links)。

O (org-attach-open-in-emacs)

同样打开附件,但强制在 Emacs 内部打开文件。

f (org-attach-reveal)

打开当前任务的附件目录。

F (org-attach-reveal-in-emacs)

同样打开目录,但强制使用 Emacs 内的 Dired 模式。

d (org-attach-delete-one)

选择并删除单个附件。

D (org-attach-delete-all)

删除任务的所有附件。更安全的方式是在 Dired 中打开目录后手动删除。

s (org-attach-set-directory)

指定一个目录作为该条目的附件目录。实现方式是将目录路径存入 ‘DIR’ 属性。

S (org-attach-unset-directory)

移除附件目录设置。该命令会删除 ‘DIR’ 属性,并询问用户如何处理目录内容:若该节点已设置 ‘ID’ 属性,可将内容移入对应目录;或直接删除内容;或保留目录但不再与该标题关联。


10.2.2 Attachment options

附件相关有一些值得关注的配置项:

org-attach-id-dir

使用 ‘ID’ 方式管理附件时,存放附件的目录。

org-attach-dir-relative

使用 C-c C-a s (org-attach-set-directory) 为节点设置 ‘DIR’ 属性时,默认使用绝对路径。开启该选项后改为使用相对路径。

org-attach-use-inheritance

默认情况下,标题的附件目录会根据 org-use-property-inheritance 从父节点继承。若需要专门为 Org 附件设置继承规则,可使用 org-attach-use-inheritance 。在大多数场景下,通过节点层级继承附件非常实用,尤其是在使用附件链接时(参见 Attachment links)。下面示例展示了附件继承的一种用法:

* Chapter A ...
  :PROPERTIES:
  :DIR: Chapter A/
  :END:
** Introduction
Some text

#+NAME: Image 1
[[attachment:image 1.jpg]]

如果没有继承机制,将无法解析到 ‘image 1.jpg’ 的链接,因为该链接位于 ‘Chapter A’ 的子标题下。

继承机制对 ‘ID’ 和 ‘DIR’ 属性均有效。若同一标题同时定义了这两个属性,则 ‘DIR’ 优先。 即使开启了继承,这一规则依然成立:如果从父节点继承了 ‘DIR’ 属性,其优先级仍高于当前节点自身的 ‘ID’ 属性。

org-attach-method

通过调度器 C-c C-a 附加文件时,默认行为是复制文件。可通过自定义 org-attach-method 修改,可选方式包括:复制、移动/重命名、硬链接或符号链接。

org-attach-preferred-new-method

用于为没有 ‘ID’ 和 ‘DIR’ 属性的节点设置默认的附件创建方式。默认为 id ,也可设为 dirasknil

org-attach-archive-delete

配置当包含附件的子树被归档时,是否删除对应的附件。

org-attach-auto-tag

为标题添加附件时,自动赋予此处设置的标签。

org-attach-id-to-path-function-list

使用 ‘ID’ 管理附件时,ID 会被解析为目录路径的一部分。默认函数可参见 org-attach-id-uuid-folder-format 。若需要其他目录结构,可自定义函数并将其加入 org-attach-id-to-path-function-list 首位。为兼容系统中已有的目录,解析现有 ID 对应的路径时会依次尝试列表中的所有函数。

org-attach-store-link-p

保存指向被附加文件的链接。链接会存入 org-stored-links ,之后可通过 C-c C-l 插入(参见 Handling Links)。根据 org-attach-store-link-p 的设置,保存的链接可以是指向原文件的普通文件链接、指向附件位置的附件链接,或指向附件位置的文件链接。

org-attach-commands

附件调度器中使用的所有命令列表。

org-attach-expert

org-attach-expert 设为非 nil 时,不再显示附件调度器的启动缓冲区。

如需修改默认设置,可查看自定义组 ‘Org Attach’ 。


10.2.4 Automatic version-control with Git

如果标题关联的目录是一个 Git 仓库,可以配置 Org 在检测到变更时自动提交到该仓库。

要让 Org 自动管理附件的版本控制,可在 Emacs 配置中添加:

(require 'org-attach-git)

10.2.5 Attach from Dired

可以从 Dired 缓冲区直接将文件附加到某个子树。使用该功能时,一个窗口打开 Dired 并显示待附加的文件,另一个窗口将光标定位到目标子树。在 Dired 窗口中将光标放在文件上,执行 M-x org-attach-dired-to-subtree 即可按 org-attach-method 设置的方式将文件附加到子树。若在 Dired 中标记了多个文件,则所有标记文件都会被附加。

将以下代码添加到 Emacs 初始化文件,即可在 Dired 缓冲区中使用 C-c C-x a 附加文件:

(add-hook 'dired-mode-hook
          (lambda ()
            (define-key dired-mode-map
              (kbd "C-c C-x a")
              #'org-attach-dired-to-subtree)))

下面代码展示如何为该命令绑定指定的附件方式:

(add-hook 'dired-mode-hook
          (lambda ()
            (define-key dired-mode-map (kbd "C-c C-x c")
              (lambda ()
                (interactive)
                (let ((org-attach-method 'cp))
                  (call-interactively #'org-attach-dired-to-subtree))))))

10.3 RSS Feeds

Org 可以根据 RSS 提要和 Atom 提要中的信息添加或修改条目。你可以用此功能将播客订阅中的每一期新节目转为任务,也可以通过网页端的笔记服务将任务导入 Org。要使用订阅功能,需配置变量 org-feed-alist ,其文档字符串包含详细说明。配置示例如下:

(setq org-feed-alist
      '(("Slashdot"
         "https://rss.slashdot.org/Slashdot/slashdot"
         "~/txt/org/feeds.org" "Slashdot Entries")))

之后执行下面的命令,就会把 ‘rss.slashdot.org’ 提供的新内容添加到文件 ‘~/org/feeds.org’ 的 ‘Slashdot Entries’ 标题下:

C-c C-x g (org-feed-update-all)

org-feed-alist 配置的所有订阅源收集内容并进行处理。

C-c C-x G (org-feed-goto-inbox)

提示选择订阅名称,并跳转到该订阅对应的收件箱位置。

Org 会在同一标题下创建名为 ‘FEEDSTATUS’ 的抽屉,用于保存订阅条目的状态信息,避免重复添加同一内容。

更多信息(包括如何读取 Atom 提要)可参考 ‘org-feed.el’ 及 org-feed-alist 的文档字符串。


11 Agenda Views

由于 Org 的工作方式,待办事项、带时间戳的条目以及带标签的标题可能分散在单个文件甚至多个文件中。要概览待处理事项或特定日期的重要事件,必须将这些信息收集、排序并以有序方式显示。

Org 可以根据多种条件筛选条目,并在独立缓冲区中显示。系统提供六种不同的视图类型:

提取出的信息会显示在专用的 日程缓冲区(agenda buffer) 中。该缓冲区为只读,但提供命令可跳转到原 Org 文件的对应位置,甚至可以远程编辑这些文件。

默认情况下,报告忽略已注释(参见 Comment Lines)和已归档(参见 Internal archiving)的条目。你可以将 org-agenda-skip-comment-treesorg-agenda-skip-archived-trees 设为 nil 以覆盖该行为。

有两个变量控制日程缓冲区的显示方式以及退出日程时是否恢复窗口布局: org-agenda-window-setuporg-agenda-restore-windows-after-quit


11.1 Agenda Files

需要显示的信息通常从所有 日程文件agenda files 中收集,即变量 org-agenda-files 中列出的文件92。如果列表中包含目录,则该目录下所有扩展名为 ‘.org’ 的文件均属于日程文件。

因此,即使你只使用单个 Org 文件,也应将其加入该列表93 。你可以自定义 org-agenda-files ,但更简便的维护方式是使用以下命令:

C-c [ (org-agenda-file-to-front)

将当前文件添加到日程文件列表,并移至列表开头。若已存在则直接移至开头。带前缀参数时,添加或移至列表末尾。

C-c ] (org-remove-file)

将当前文件从日程文件列表中移除。

C-'C-, (org-cycle-agenda-files)

循环切换日程文件列表,依次打开每个文件。

M-x org-switchb

使用类似 Iswitchb 的界面在 Org 缓冲区之间切换。

Org 菜单包含当前文件列表,可用于直接打开任意文件。

如果你希望临时将日程聚焦于列表外的某个文件、列表中的单个文件,甚至文件中的某个子树,可以通过多种方式实现。执行单次日程命令时,可在调度器中按一次或多次 <(参见 The Agenda Dispatcher)。若要长时间限制日程范围,使用以下命令:

C-c C-x < (org-agenda-set-restriction-lock)

将日程限制在当前子树。若光标位置已有限制则移除该限制。带通用前缀参数调用,或光标位于文件首个标题前时,将日程范围设为整个文件。该限制持续生效,直到通过 C-c C-x > 移除,或在日程调度器中输入 <>。若有窗口显示日程视图,新限制会立即生效。

C-c C-x > (org-agenda-remove-restriction-lock)

移除由 C-c C-x < 设置的限制。

使用速览栏(Speedbar)时,可在 Speedbar 框架中使用以下命令:

< (org-speedbar-set-agenda-restriction)

将日程限制在 Speedbar 框架中光标所在的项目—可以是一个 Org 文件,或是该文件中的某个子树。如果日程已经限制在该位置,则移除该限制。若有窗口正在显示日程视图,新的限制会立即生效。

> (org-agenda-remove-restriction-lock)

移除限制。


11.2 The Agenda Dispatcher

视图通过调度器创建,可通过 M-x org-agenda 访问,更好的方式是绑定全局快捷键(参见 Activation)。调度器会显示菜单,需再按一个字母执行对应命令。调度器提供以下默认命令:

a

生成日历样式的日程(参见 Weekly/daily agenda)。

tT

生成所有待办事项列表(参见 The global TODO list)。

mM

生成匹配指定表达式的标题列表(参见 Matching tags and properties)。

s

根据关键词和/或正则表达式的布尔表达式筛选条目,生成列表。

/

在所有日程文件以及 org-agenda-text-search-extra-files 列出的文件中搜索正则表达式。使用 Emacs 命令 multi-occur 。前缀参数可指定每个匹配的上下文行数,默认为 1。

#

生成停滞项目列表(参见 Stuck projects)。

!

配置停滞项目列表规则(参见 Stuck projects)。

<

将日程命令限制在当前缓冲区94。若已启用 narrowing,则限制在 narrowed 区域。按下 < 后仍需按对应命令选择键。

< <

若存在激活区域,将后续日程命令限制在该区域;否则限制在当前子树。按下 < < 后仍需按对应命令选择键。

*

切换粘性日程视图。默认情况下,Org 仅维护一个日程缓冲区,每次切换视图都会重建以保证内容最新。若频繁切换视图且构建时间较长,可开启粘性日程缓冲区(通过自定义变量 org-agenda-sticky 设为默认)。开启粘性后,调度器仅切换视图,需手动按 rg 更新。可随时通过 org-toggle-sticky-agenda 切换粘性模式。

你也可以定义自定义命令,在调度器中与默认命令一样使用。这包括创建包含多个模块的扩展日程缓冲区,例如周日程、全局待办列表和多个特殊标签匹配结果。参见 Custom Agenda Views


11.3 The Built-in Agenda Views

本节介绍内置的各类视图。


11.3.1 Weekly/daily agenda

周/日 日程(agenda) 的作用类似于纸质日程本,显示当前周或当天的所有任务。

M-x org-agenda a (org-agenda-list)

从 Org 文件列表编译生成当前周的日程,按天显示条目。带数字前缀参数95(如 C-u 2 1 M-x org-agenda a)可设置显示天数。

日程默认显示天数由变量 org-agenda-span 设置。该变量可设为任意天数,或 dayweekmonthyear 等跨度名称。周日程默认从上周一(参见 org-agenda-start-on-weekday )开始。也可通过日期偏移设置起始日期: ‘(setq org-agenda-start-day "+10d")’ 表示从十天后开始。在单周/双周日程中, org-agenda-start-on-weekday 优先级高于 org-agenda-start-day

在日程缓冲区(agenda buffer) 中可进行远程编辑,例如直接修改截止日期和预约时间。日程缓冲区可用命令参见 Commands in the Agenda Buffer

Calendar/Diary integration

Emacs 内置由 Edward M. Reingold 编写的日历与日记功能。日历显示三月视图并包含各国节假日。日记可记录纪念日、月相、日出日落、周期性预约等。与 Org 形成良好互补。将 Org 内容与日记结合非常实用。

要将 Emacs 日记条目加入 Org 日程,只需自定义变量:

(setq org-agenda-include-diary t)

之后即可自动集成。所有日记条目(含节假日、纪念日等)都会出现在 Org 生成的日程缓冲区中。在日程缓冲区中可使用 SPCTABRET 跳转到日记文件编辑已有条目。i 命令可在当前日期插入新条目,SMC 分别显示日出日落、月相和转换历法,c 可在日历与日程间切换。

若仅用日记记录表达式条目和节假日,更高效的方式是不使用上述设置,而是将条目复制或移动到 Org 文件中。Org 可解析日记风格的表达式条目,且无需先构建日记显示,速度更快。注意表达式条目必须顶格书写,前无空格,示例如下:96

* Holidays
  :PROPERTIES:
  :CATEGORY: Holiday
  :END:
%%(org-calendar-holiday)   ; 节假日名称专用函数

* Birthdays
  :PROPERTIES:
  :CATEGORY: Ann
  :END:
%%(org-anniversary 1956  5 14) Arthur Dent is %d years old
%%(org-anniversary 1869 10  2) Mahatma Gandhi would be %d years old

Anniversaries from BBDB

若使用 BBDB 通讯录存储联系人,你可能更希望在 BBDB 中记录纪念日而非单独的 Org 或日记文件。Org 支持此功能并可在日程中显示 BBDB 纪念日。只需在任意日程文件中添加:

* Anniversaries
  :PROPERTIES:
  :CATEGORY: Anniv
  :END:
%%(org-bbdb-anniversaries)

之后即可在 BBDB 记录中定义纪念日。基本要求是为 BBDB 记录添加名为 ‘anniversary’ 的字段,格式为 ‘YYYY-MM-DD’ 或 ‘MM-DD’ ,后接空格和纪念日类型( ‘birthday’ 、 ‘wedding’ 或格式字符串)。省略类型则默认为生日。示例如下,文件 ‘ol-bbdb.el’ 头部有详细说明:

1973-06-22
06-22
1955-08-02 wedding
2008-04-14 %s released version 6.01 of Org mode, %d years ago

修改 BBDB 后或 Emacs 会话首次显示日程时,Org 会更新纪念日哈希表,造成短暂延迟。之后速度极快,远快于 Org 或日记文件中大量 ‘%%(diary-anniversary)’ 条目。

若希望提前几天显示即将到来的纪念日,可改用:

* Anniversaries
  :PROPERTIES:
  :CATEGORY: Anniv
  :END:
%%(org-bbdb-anniversaries-future 3)

这样会提前三天提醒:纪念日当天及前两天。参数可选,省略时默认为 7 天。

Appointment reminders

Org 可与 Emacs 预约提醒功能联动。使用命令 org-agenda-to-appt 可将日程文件中的预约加入提醒。该命令支持筛选,仅添加特定分类或匹配正则表达式的预约。同时读取 ‘APPT_WARNTIME’ 属性,覆盖该预约的 appt-message-warning-time 。详情参见文档字符串。


11.3.2 The global TODO list

全局待办列表收集并格式化所有未完成待办事项。

M-x org-agenda t (org-todo-list)

显示全局待办列表。从所有日程文件(参见 Agenda Views)收集待办事项到单个缓冲区。默认列出非完成状态的条目。缓冲区处于日程模式,可直接查看和操作待办条目(参见 Commands in the Agenda Buffer)。

M-x org-agenda T (org-todo-list)

功能同上,但允许选择特定待办关键词。也可通过给 t 加前缀参数实现。系统提示输入关键词,可用 ‘|’ 作为或运算符分隔多个关键词。带数字前缀时选择 org-todo-keywords 中的第 N 个关键词。

日程缓冲区中的 r 键可重建列表,带前缀参数可切换所选待办关键词,例如 3 r。若经常需要搜索特定关键词,可定义自定义命令(参见 The Agenda Dispatcher)。

匹配特定待办关键词也可作为标签搜索的一部分(参见 Tag Searches)。

对待办事项的远程编辑支持单键修改状态。待办列表可用命令参见 Commands in the Agenda Buffer

默认全局待办列表显示所有带待办关键词的标题,列表可能过长。有两种精简方式:

  • 部分用户认为 已规划(scheduled) 执行时间或设置 截止日期(deadline) (参见 Timestamps)的待办事项不再属于 待处理(open) 。可配置 org-agenda-todo-ignore-scheduled 排除部分或全部规划条目, org-agenda-todo-ignore-deadlines 排除部分或全部带截止日期的条目, org-agenda-todo-ignore-timestamp 排除部分或全部带有效时间戳(非截止(DEADLINE)/规划(SCHEDULED))的条目,以及 org-agenda-todo-ignore-with-date 排除至少带一个有效时间戳的条目。
  • 待办事项可能包含子层级拆分为子任务。此时可仅显示最高层级待办标题,忽略子层级。配置变量 org-agenda-todo-list-sublevels 实现该行为。

11.3.3 Matching tags and properties

若日程文件中的标题带有 标签(tags) (参见 Tags)或属性(参见 Properties and Columns),可根据这些元数据筛选标题并收集到日程缓冲区。此处描述的匹配语法同样适用于使用 C-c / m 创建稀疏树。

M-x org-agenda m (org-tags-view)

生成匹配指定标签集合的所有标题列表。命令提示输入筛选条件,为标签布尔表达式,如 ‘+work+urgent-withboss’ 或 ‘work|home’ (参见 Tags)。若经常需要特定搜索,可定义自定义命令(参见 The Agenda Dispatcher)。

M-x org-agenda M (org-tags-view)

m 类似,但仅筛选同时为待办事项的标题。排除规划/截止日期条目可参见变量 org-agenda-tags-todo-honor-ignore-options 。同时匹配特定待办关键词与标签也可实现,参见 Tag Searches

标签列表可用命令参见 Commands in the Agenda Buffer

搜索字符串可使用布尔运算符 ‘&’ (与)和 ‘|’ (或)。 ‘&’ 优先级高于 ‘|’ 。暂不支持括号。搜索中的每个元素可为标签、匹配标签的正则表达式,或 ‘PROPERTY OPERATOR VALUE’ 形式的属性比较表达式。元素前可加 ‘-’ 表示排除, ‘+’ 为正向选择的语法糖。存在 ‘+’ 或 ‘-’ 时,与运算符 ‘&’ 可省略。以下为仅使用标签的示例:

+work-boss

选择带 ‘work’ 标签但不带 ‘boss’ 标签的标题。

work|laptop

选择带 ‘work’ 或 ‘laptop’ 标签的行。

work|laptop+night

同上,但要求 ‘laptop’ 行同时带 ‘night’ 标签。

除标签外,也可使用大括号包裹的正则表达式(参见 Regular Expressions)。例如 ‘work+{^boss.*}’ 匹配带 ‘:work:’ 标签且任意标签以 ‘boss’ 开头的标题。

分组标签(参见 Tag Hierarchy)会展开为正则表达式。例如若 ‘work’ 是 ‘:work:lab:conf:’ 的分组标签,则搜索 ‘work’ 等价于搜索 ‘{\(?:work\|lab\|conf\)}’ ,搜索 ‘-work’ 等价于排除所有带该组任意标签的标题(即 ‘-{\(?:work\|lab\|conf\)}’ )。

搜索标签时可同时检测属性(参见 Properties and Columns)。属性可为真实属性或代表其他元数据的特殊属性(参见 Special Properties)。例如属性 ‘TODO’ 代表条目待办关键词,属性 ‘LEVEL’ 代表条目层级。因此搜索 ‘+LEVEL=3+boss-TODO​="DONE"’ 可列出所有三级标题、带 ‘boss’ 标签且 标记为 ‘DONE’ 的条目。在设置 org-odd-levels-only 的缓冲区中, ‘LEVEL’ 不计星号数量, ‘LEVEL=2’ 对应三级标题等。

更多示例:

work+TODO​="WAITING"

选择带 ‘work’ 标签且状态为 ‘WAITING’ 的待办行。

work+TODO​="WAITING"|home+TODO​="WAITING"

工作与家庭中状态为等待的任务。

匹配属性时可使用多种比较运算符。复杂示例:

+work-boss+PRIORITY="A"+Coffee="unlimited"+Effort<*2
         +With={Sarah\|Denny}+SCHEDULED>="<2008-10-11>"

比较类型取决于比较值的写法:

  • 若比较值为纯数字,执行数值比较,支持运算符 ‘<’ 、 ‘=’ 、 ‘>’ 、 ‘<=’ 、 ‘>=’ 、 ‘<>’ 。 ‘=’ 与 ‘==’ 等价, ‘!=’ 、 ‘/=’ 与 ‘<>’ 等价。
  • 若比较值用双引号包裹,执行字符串比较,支持相同运算符。
  • 若比较值同时用双引号和尖括号包裹(例如 ‘DEADLINE<​="<2008-12-24 18:30>"’ ),则两边的值均按 Org 标准日期 / 时间格式处理,并进行相应比较。合法取值还包括: ‘"<now>"’ 表示当前时刻(含具体时间); ‘"<today>"’ 、 ‘"<tomorrow>"’ 表示当天 / 次日零点(不含时间)。 也可以使用 ‘"<+5d>"’ 或 ‘"<-2m>"’ 这类相对日期格式,单位 ‘d’ 、 ‘w’ 、 ‘m’ 、 ‘y’ 分别代表天、周、月、年。
  • 若比较值用大括号包裹,执行正则匹配, ‘=’ 表示匹配, ‘<>’ 表示不匹配。
  • 所有运算符都可以在后面选择性地加上星号 ‘*’ ,例如 ‘<*’ 、 ‘!=*’ 等。这类 带星号运算符 的行为与普通的、不带星号的运算符相同,唯一区别是:它们只匹配确实存在被检测属性的标题。这对于在逻辑上用于排除结果的搜索条件(例如不等运算符)最为有用。

因此示例搜索字符串可找到:带 ‘work’ 但不带 ‘boss’ 标签、优先级为 ‘A’ 、 ‘Coffee’ 属性为 ‘unlimited’ 、 ‘EFFORT’ 属性数值小于 2 且存在该属性、 ‘With’ 属性匹配 ‘Sarah\|Denny’ 、规划时间在 2008-10-11 及之后的条目。

注意 ‘EFFORT’ 使用 ‘<*’ 运算符,确保仅包含实际定义该属性且数值小于 2 的条目。普通 ‘<’ 会将无该属性的条目视为 0 并纳入结果。

匹配属性时可使用属性名中允许的所有字符。但非字母数字和下划线的字符需用反斜杠转义97。例如搜索属性 ‘boss-prio’ 、 ‘boss:prio’ 、 ‘boss\prio’ 值为 ‘C’ 的条目,分别使用:

boss\-prio="C"
boss\:prio="C"
boss\\prio="C"

可配置 Org 在搜索时启用属性继承,但会显著降低搜索速度。详情参见 Property Inheritance

为保持向后兼容并提升输入效率,在搜索中还可以用另一种方式判断 TODO 状态。做法是:在搜索字符串的 标签/属性 部分(可包含多个由 ‘|’ 连接的条件)末尾加上 ‘/’ ,然后专门为 TODO 关键词编写一段布尔表达式。 语法与标签搜索类似,但使用时需要注意:例如,对多个 TODO 关键词进行正向选择时,用布尔 AND 组合通常没有实际意义;而 负向选择(negative selection) 与 AND 组合则是合理的。 如果只想检查真正带有 TODO 关键词的条目(可以加快搜索速度),可以使用 {{{kbd (M-x org-agenda M)}}},或者等价地在斜杠后的 TODO 部分以 ‘!’ 开头。 使用 {{{kbd (M-x org-agenda M)}}} 或 ‘/!’ 均不会匹配状态为已完成(DONE)的 TODO 关键词。 示例:

work/WAITING

等价于 ‘work+TODO​="WAITING"’ 。

work/!-WAITING-NEXT

选择带有 ‘work’ 标签、且状态既不是 ‘WAITING’ 也不是 ‘NEXT’ 的 TODO 条目。

work/!+WAITING|+NEXT

选择带有 ‘work’ 标签、且状态为 ‘WAITING’ 或 ‘NEXT’ 的 TODO 条目。


11.3.4 Search view

该日程视图是 Org 条目的通用文本搜索工具,尤其适合查找笔记。

M-x org-agenda s (org-search-view)

专用搜索,可通过子串或布尔逻辑关键词筛选条目。

例如搜索字符串 ‘computer equipment’ 匹配包含该连续文本的条目,即使单词间空格较多或换行。

搜索视图还可以使用布尔逻辑,在条目中搜索特定的关键词。搜索字符串 ‘+computer +wifi -ethernet -{8\.11[bg]}’ 会匹配满足以下条件的笔记条目:包含关键词 ‘computer’ 和 ‘wifi’ ,但不包含关键词 ‘ethernet’ ,同时不匹配正则表达式 ‘8\.11[bg]’ (即排除 ‘8.11b’ 和 ‘8.11g’ )。第一个 ‘+’ 是启用布尔搜索所必需的,其余的 ‘+’ 则为可选。更多细节请参见命令 org-search-view 的文档字符串。

在日程搜索视图中,你可以通过以下按键,增量且便捷地调整布尔搜索:

[添加正向搜索词
]添加负向搜索词
{添加正向正则表达式
}添加负向正则表达式

注意除日程文件外,该命令同时搜索 org-agenda-text-search-extra-files 中列出的文件。


11.3.5 Stuck projects

若使用 David Allen 的 GTD 等方法管理工作,定期 review 确保所有项目推进是重要任务。 停滞(stuck) 项目指未定义下一步行动的项目,因此不会出现在 Org 待办列表中。Review 时需识别此类项目并为其定义下一步行动。

M-x org-agenda # (org-agenda-list-stuck-projects)

列出停滞项目。

M-x org-agenda !

自定义变量 org-stuck-projects ,定义停滞项目规则与查找方式。

通常需要先配置该视图才能正常使用。内置默认假设所有项目为二级标题,且项目若至少有一个条目状态为 ‘TODO’ 、 ‘NEXT’ 或 ‘NEXTACTION’ 则不属于停滞。

假设你在使用 Org 模式时有自己的一套习惯:用标签 ‘:PROJECT:’ 标记项目,用 ‘TODO’ 关键字 ‘MAYBE’ 表示暂时不予考虑的项目。再假设,TODO 关键字 ‘DONE’ 表示已完成的项目, ‘NEXT’ 和 ‘TODO’ 表示下一步行动。标签 ‘:@shop:’ 表示购物事项,即使没有 ‘NEXT’ 标签,也视为下一步行动。最后,如果项目中任何位置包含特殊单词 ‘IGNORE’ ,也不应该出现在列表中。 在这种情况下,你可以先用 标签/TODO 匹配表达式 ‘+PROJECT/-MAYBE-DONE’ 筛选出符合条件的项目(参见 Tag Searches),然后在其子树中检查是否存在 ‘TODO’ 、 ‘NEXT’ 、 ‘@shop’ 和 ‘IGNORE’ ,以此判断哪些项目不属于停滞项目。对应的正确配置如下:

(setq org-stuck-projects
      '("+PROJECT/-MAYBE-DONE" ("NEXT" "TODO") ("@shop")
        "\\<IGNORE\\>"))

注意:如果某个项目被判定为非停滞项目,仍会在该条目的子树中继续搜索停滞项目。


11.4 Presentation and Sorting

在日程视图中显示条目之前,Org mode 会对条目进行视觉上的整理并排序。每个条目占据单独一行。该行以一个 前缀(prefix) 开头,其中包含条目的 分类(category) (参见 Categories)及其他重要信息。你可以通过 org-agenda-tags-column 自定义标签显示的列数,也可以使用选项 org-agenda-prefix-format 自定义前缀格式。前缀之后是与条目关联的、经过精简的大纲标题。


11.4.1 Categories

分类是分配给每个日程项的宽泛标签。默认情况下,分类直接取自文件名,但你也可以在缓冲区中通过特殊行指定,例如:

#+CATEGORY: Thesis

如果想为单个条目或某个(子)树设置专用分类,可以为该条目设置 ‘CATEGORY’ 属性,并将所需分类作为属性值。

分类名称不超过 10 个字符时,在日程缓冲区中的显示效果最佳。你可以通过自定义变量 org-agenda-category-icon-alist 为分类设置图标。


11.4.2 Time-of-day specifications

Org mode 会检查每个日程项是否包含具体时刻说明。该时间可以是使其被纳入日程的时间戳的一部分,例如:

<2005-05-10 Tue 19:00>

时间段可以通过两个时间戳指定:

<2005-05-10 Tue 20:30>--<2005-05-10 Tue 22:15>

在条目自身的标题中,类似 ‘12:45’ 或 ‘8:30-1pm’ 这样的时间(段)也可以直接以纯文本形式出现98

如果日程集成了 Emacs 日记(参见 Weekly/daily agenda),日记条目中的时间说明也会被识别。

对于日程显示,Org mode 会提取时间并以标准 24 小时格式作为前缀的一部分展示。前述示例时间在日程中最终会显示为如下形式:

 8:30-13:00 Arthur Dent lies in front of the bulldozer
12:45...... Ford Prefect arrives and takes Arthur to the pub
19:00...... The Vogon reads his poem
20:30-22:15 Marvin escorts the Hitchhikers to the bridge

当日程处于单日模式或显示当天内容时,带时间的条目会嵌入时间网格中,例如:

 8:00...... ------------------
 8:30-13:00 Arthur Dent lies in front of the bulldozer
10:00...... ------------------
12:00...... ------------------
12:45...... Ford Prefect arrives and takes Arthur to the pub
14:00...... ------------------
16:00...... ------------------
18:00...... ------------------
19:00...... The Vogon reads his poem
20:00...... ------------------
20:30-22:15 Marvin escorts the Hitchhikers to the bridge

时间网格可通过变量 org-agenda-use-time-grid 开启或关闭,并可通过 org-agenda-time-grid 进行配置。


11.4.3 Sorting of agenda items

条目在插入视图前会被排序,具体方式取决于视图类型。

  • 对于每日/每周日程,每天的条目会单独排序。默认顺序为先收集所有包含明确时刻的条目,这些条目会作为当日日程排在列表开头。之后,条目按分类分组,顺序遵循 org-agenda-files 给出的序列。在每个分类内部,条目按紧急程度排序,紧急程度由优先级(参见 Priorities)推导而来,逾期的计划或截止日期条目会额外加分。最低优先级计为 0,下一级为 1000,之后每级递增 1000,直至最高优先级,例如 ‘C’ 、 ‘B’ 、 ‘A’ 分别计为 0、1000、2000。
  • 对于 TODO 列表,条目保持分类顺序,但在每个分类内部按紧急程度排序。排序所用紧急程度源自优先级标记,并根据条目距离到期或计划日期的远近进行调整。
  • 对于标签匹配结果,条目完全不排序,仅按照在日程文件中被检索到的顺序显示。

排序可通过变量 org-agenda-sorting-strategy 自定义,还可加入基于条目预估耗时的排序依据(参见 Effort Estimates)。


11.4.4 Filtering/limiting agenda items

日程的内置或自定义命令是静态定义的,而日程过滤器与限制器允许灵活缩小日程条目范围。

过滤器(Filters) 仅改变条目的可见性,速度极快,且多用于交互式操作99。你可以在不同过滤器间快速切换,无需重新生成日程。与之相对, 限制器(Limits) 在日程缓冲区填充前生效,因此主要用于在自定义日程命令中作为局部变量定义。

Filtering in the agenda

通用过滤命令为 org-agenda-filter ,绑定到 /。在介绍该命令前,我们先说明各类单独过滤的命令。所有过滤命令对前缀参数的处理方式一致:单次 C-u 前缀表示取反过滤,即隐藏被过滤器选中的行;双重前缀则将新过滤条件追加到已有条件中,实现过滤条件叠加。

\ (org-agenda-filter-by-tag)

按标签过滤日程视图。系统会提示输入标签选择字母,SPC 表示任意标签。在该提示下按 TAB 可进行补全选择标签,包括没有选择字符的标签。执行后会隐藏所有不包含或不继承该标签的条目。在提示框中按 +- 可在正向与反向过滤间切换。按两次 \ 可清除过滤(一次调用命令,一次在提示框确认)。

< (org-agenda-filter-by-category)

按光标所在行的分类过滤,仅显示该分类的条目。带前缀参数调用时,隐藏光标所在分类的所有条目。再次按 < 调用该命令可清除过滤。

= (org-agenda-filter-by-regexp)

按正则表达式过滤日程视图,仅显示匹配用户输入正则表达式的日程条目。再次按 = 调用该命令可清除过滤。

_ (org-agenda-filter-by-effort)

按预估耗时过滤日程视图,筛选耗时合适的任务。首先需要全局设置耗时列表,例如:

(setq org-global-properties
      '(("Effort_ALL". "0 0:10 0:30 1:00 2:00 3:00 4:00")))

之后可先输入操作符 <>=,再输入允许耗时数组中对应预估耗时的一位数字索引(0 表示第 10 个值)进行过滤。过滤器会限制显示耗时小于等于、等于或大于等于所选值的条目。对于未定义耗时的条目,其处理方式由变量 org-agenda-sort-noeffort-is-high 决定。按两次 _ 可清除过滤(一次调用命令,一次在首个提示框确认)。

^ (org-agenda-filter-by-top-headline)

过滤当前日程视图,仅显示与当前条目同属顶级标题下的项目。再次按 ^ 调用该命令可清除过滤。

/ (org-agenda-filter)

这是上述五种过滤方法中四种的统一接口。在提示框中,可在单个字符串内指定不同过滤元素,并支持完整补全功能。例如:

+work-John+<0:10-/plot/

表示选择分类为 ‘work’ 且预估耗时低于 10 分钟的条目,排除标签为 ‘John’ 或匹配正则表达式 ‘plot’ 的条目(参见 Regular Expressions)。若无歧义,可省略 ‘+’ 。元素顺序任意。过滤语法假设分类与标签无重叠,否则标签优先。若在提示框中输入空字符串,则清除所有过滤。若指定过滤条件,则替换当前所有过滤;但若使用双重前缀参数调用命令,或在字符串开头追加额外 ‘+’ (如 ‘++work’ ),则新过滤条件会追加到现有条件中。单次前缀参数会对整个过滤取反。

| (org-agenda-filter-remove-all)

清除当前日程视图中的所有过滤。

Computed tag filtering

若变量 org-agenda-auto-exclude-function 设置为用户自定义函数,该函数可在需要时选择作为标签过滤的标签。函数会以当前视图中所有标签的小写形式作为参数调用。若函数应过滤掉带该标签的条目,则返回 ‘"-tag"’ ;若仅保留带该标签的条目,则返回 ‘"+tag"’ ;若该标签无关,则返回 ‘nil’ 。例如,假设你使用 ‘Net’ 标签标记需要网络访问的任务, ‘Errand’ 标签标记外出办事任务, ‘Call’ 标签标记打电话任务,便可根据网络可用性与营业时间自动排除这些标签,示例代码如下:

(defun my-auto-exclude-fn (tag)
  (when (cond ((string= tag "net")
               (/= 0 (call-process "/sbin/ping" nil nil nil
                                   "-c1" "-q" "-t1" "mail.gnu.org")))
              ((member tag '("errand" "call"))
               (let ((hr (nth 2 (decode-time))))
                 (or (< hr 8) (> hr 21)))))
    (concat "-" tag)))

(setq org-agenda-auto-exclude-function #'my-auto-exclude-fn)

你可以通过给 org-agenda-filter 传递三重前缀参数(即按 C-u C-u C-u /),或在 org-agenda-filter-by-tag 中按 RET 来应用这种自适应过滤。

Setting limits for the agenda

以下是可全局设置或在自定义日程视图中局部设置的选项列表(参见 Custom Agenda Views)。

org-agenda-max-entries

限制条目数量。

org-agenda-max-effort

限制累计耗时总长(以分钟为单位)。

org-agenda-max-todos

限制带 TODO 关键字的条目数量。

org-agenda-max-tags

限制带标签的条目数量。

当设置为正整数时,每个选项会排除其他分类的条目:例如 ‘(setq org-agenda-max-effort 100)’ 会将日程限制为累计 100 分钟耗时,并排除所有未设置耗时属性的条目。若想包含无耗时属性的条目,可将 org-agenda-max-effort 设置为负值。一种实用配置是在自定义命令中局部使用 org-agenda-max-entries 。例如,以下自定义命令显示接下来 5 个带有 ‘NEXT’ TODO 关键字的条目。

(setq org-agenda-custom-commands
      '(("n" todo "NEXT"
         ((org-agenda-max-entries 5)))))

当你将这五个条目中的一个标记为 DONE 后,重新生成日程会再次显示接下来的五个条目,包含此前被排除的第一个条目。

你也可以动态设置临时限制,该限制在重新生成日程后失效:

~ (org-agenda-limit-interactively)

提示选择限制类型并输入对应值。


11.5 Commands in the Agenda Buffer

日程缓冲区中的条目会链接回其来源的 Org 文件或日记文件。你不能直接编辑日程缓冲区本身,但提供了相关命令用于显示并跳转到原始条目位置,以及从日程缓冲区 “远程(remotely)” 编辑 Org 文件。这样所有信息仅存储一份,避免日程与笔记文件内容不一致的风险。

部分命令可通过点击日程行执行,其他命令则需要将光标置于目标行。

Motion

n (org-agenda-next-line)

移动到下一行(与 DOWNC-n 功能相同)。

p (org-agenda-previous-line)

移动到上一行(与 UPC-p 功能相同)。

View/Go to Org file

SPCmouse-3 (org-agenda-show-and-scroll-up)

在另一个窗口中显示条目原始位置。带前缀参数时,确保抽屉保持折叠状态。

L (org-agenda-recenter)

显示原始位置并将该窗口居中。

TABmouse-2 (org-agenda-goto)

跳转到另一个窗口中的条目原始位置。

RET (org-agenda-switch-to)

跳转到条目原始位置并关闭其他窗口。

F (org-agenda-follow-mode)

切换跟随模式(Follow mode)。在跟随模式下,当你在日程缓冲区中移动光标时,另一个窗口会始终显示 Org 文件中对应位置。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-follow-mode 设置。

C-c C-x b (org-agenda-tree-to-indirect-buffer)

在间接缓冲区中显示当前条目的完整子树。带数字前缀参数 N 时,向上跳转至 N 级标题并取该子树;若 N 为负数,则向上跳转对应级数。带 C-u 前缀时,不删除此前使用的间接缓冲区。

C-c C-o (org-agenda-open-link)

打开条目中的链接。系统会列出所引用 Org 节点文本中的所有链接供选择;若仅有一个链接,则直接打开无需提示。

Change display

A

交互式选择另一个日程视图并追加到当前视图。

o

关闭其他窗口。

v d 或简写 d (org-agenda-day-view)

切换到日视图。切换为日视图后,该设置会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到年内指定日期,例如 32 d 跳转到 2 月 1 日。设置日视图时,前缀参数中也可包含年份,例如 200712 d 跳转到 2007 年 1 月 12 日。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。

v w or short w (org-agenda-week-view)

切换到周视图。切换为周视图后,该设置会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到 ISO 周历指定周数,例如 9 w 跳转到第 9 个 ISO 周。设置周视图时,前缀参数中也可包含年份,例如 200712 w 跳转到 2007 年第 12 周。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。

v m (org-agenda-month-view)

切换到月视图。由于月视图生成较慢,不会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到当月指定日期。设置月视图时,前缀参数中也可包含年份,例如 200712 m 跳转到 2007 年 12 月。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。

v y (org-agenda-year-view)

切换到年视图。由于年视图生成较慢,不会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到年内指定日期。

v SPC (org-agenda-reset-view)

将当前视图重置为 org-agenda-span 指定的默认视图。

f (org-agenda-later)

向后跳转时间,显示当前时段之后的内容。例如当前显示一周,则切换到下一周。带前缀参数时,重复跳转对应次数。

b (org-agenda-earlier)

向前跳转时间,显示更早日期的内容。

. (org-agenda-goto-today)

跳转到今天。

j (org-agenda-goto-date)

提示输入日期并跳转到该日期。

J (org-agenda-clock-goto)

跳转到 日程缓冲区中(in the agenda buffer) 当前正在计时的任务。

D (org-agenda-toggle-diary)

切换是否包含日记条目。参见 Weekly/daily agenda

v lv L 或简写 l (org-agenda-log-mode)

切换日志簿模式。在日志簿模式下,开启日志记录时标记为完成的条目(参见变量 org-log-done )以及当日有计时记录的条目会显示在日程中。你可以通过变量 org-agenda-log-mode-items 配置日志模式中包含的条目类型。带 C-u 前缀参数调用时,显示所有可用日志簿条目,包括状态变更;带双重前缀参数 C-u C-u 调用时,仅显示日志信息,不显示其他内容。v L 等价于 C-u v l

v [ 或简写 [ (org-agenda-manipulate-query-add)

在当前视图中包含非活动时间戳,仅适用于每周/每日日程。

v a (org-agenda-archives-mode)

切换归档模式。在归档模式下,生成日程时也会扫描已归档的树(参见 Internal archiving)。再次按 v a 可退出归档模式。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-archives-mode 设置,其取值与 org-agenda-archives-mode 相同。

v A

切换归档模式,同时包含所有归档文件。

v R 或简写 R (org-agenda-clockreport-mode)

切换计时报表模式(Clockreport mode)。在计时报表模式下,每日/每周日程总会显示一个表格,包含当前日程视图覆盖时间范围与文件范围内的计时时长。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-clockreport-mode 设置。带前缀参数切换该模式时(即 C-u R),计时表格不会包含被日程过滤隐藏的条目100。另可参见变量 org-clock-report-include-clocking-taskorg-agenda-clock-report-header

v c

在当前日程范围内显示重叠计时条目、计时中断及其他计时问题,之后可跳转到计时行手动修正。可通过变量 org-agenda-clock-consistency-checks 自定义计时问题的判定规则。按 l 退出日志簿模式,返回正常日程显示。

v E 或简写 E (org-agenda-entry-text-mode)

切换条目文本模式。在条目文本模式下,日程行下方会显示其所引用 Org 标题的若干行内容,最大行数由变量 org-agenda-entry-text-maxlines 指定。带数字前缀参数调用该命令时,会临时将该数值修改为前缀参数值。

G (org-agenda-toggle-time-grid)

切换时间网格显示。另可参见变量 org-agenda-use-time-gridorg-agenda-time-grid

r (org-agenda-redo), g

重新生成日程缓冲区,例如在使用 S-LEFTS-RIGHT 修改条目时间戳后刷新显示。若缓冲区为全局 TODO 列表,前缀参数会用于生成特定 TODO 关键字的筛选列表。

C-x C-s 或简写 s (org-save-all-org-buffers)

保存当前 Emacs 会话中所有 Org 缓冲区,同时保存 ID 位置。

C-c C-x C-c (org-agenda-columns)

在日程缓冲区中启用列视图(参见 Column View)。列视图格式取自光标所在条目,若无则取日程视图中第一个条目,即原始缓冲区中该条目的格式(来自属性、 ‘COLUMNS’ 关键字或默认变量 org-columns-default-format )会在日程中使用。

C-c C-x > (org-agenda-remove-restriction-lock)

解除日程的限制锁定(若当前限制为某个文件或子树,参见 Agenda Files)。

M-UP (org-agenda-drag-line-backward)

将光标所在行向上拖动一行。带数字前缀参数时,向上拖动对应行数。

拖动日程行的效果在日程刷新后不会保留,也不会修改源 Org 文件。

M-DOWN (org-agenda-drag-line-forward)

将光标所在行向下拖动一行。带数字前缀参数时,向下拖动对应行数。

Remote editing

0--9

数字参数。

C-_ (org-agenda-undo)

撤销远程编辑命令带来的修改,同时在日程缓冲区与远程缓冲区中恢复变更。

t (org-agenda-todo)

修改条目 TODO 状态,同时更新日程与原始 Org 文件。前缀参数会传递给 org-todo 命令,例如 C-u 前缀会触发记录状态变更备注。

C-S-RIGHT (org-agenda-todo-nextset)

切换到下一组 TODO 关键字。

C-S-LEFT, org-agenda-todo-previousset

切换到上一组 TODO 关键字。

C-k (org-agenda-kill)

删除当前日程项及其在原始 Org 文件中对应的完整子树。若远程删除的文本超过一行,需要用户确认删除操作。参见变量 org-agenda-confirm-kill

C-c C-w (org-agenda-refile)

归栏光标所在条目。

C-c C-x C-a 或简写 a (org-agenda-archive-default-with-confirmation)

Archive the subtree corresponding to the entry at point using the default archiving command set in org-archive-default-command. When using the a key, confirmation is required.

C-c C-x a (org-agenda-toggle-archive-tag)

为当前标题切换归档标签(参见 Internal archiving)。

C-c C-x A (org-agenda-archive-to-archive-sibling)

将当前条目对应的子树移动到其 归档兄弟节点(archive sibling)

C-c C-x C-s 或简写 $ (org-agenda-archive)

归档当前标题对应的子树,即将条目移动到配置的归档位置,通常为另一个文件。

T (org-agenda-show-tags)

显示当前条目关联的所有标签。适用于已关闭 org-agenda-show-inherited-tags 但仍需临时查看标题全部标签的场景。

: (org-agenda-set-tags)

为当前标题设置标签。若日程中有活动区域,则为区域内所有标题统一修改标签。

, (org-agenda-priority)

为当前条目设置优先级。Org mode 会提示输入优先级字符,若输入 SPC,则移除条目中的优先级标记。

+S-UP (org-agenda-priority-up)

提高当前条目优先级。优先级会在原始缓冲区中修改,但日程不会重新排序,可按 r 键刷新。

-S-DOWN (org-agenda-priority-down)

降低当前条目优先级。

C-c C-x e 或简写 e (org-agenda-set-effort)

为当前条目设置耗时属性。

C-c C-z 或简写 z (org-agenda-add-note)

为条目添加备注。备注会被记录,并保存到状态变更备注的相同位置。根据 org-log-into-drawer 的设置,备注可能保存在抽屉内。

C-c C-a (org-attach)

所有附件相关命令的调度器。

C-c C-s (org-agenda-schedule)

为该条目设置计划时间。带前缀参数时,移除计划时间戳。

C-c C-d (org-agenda-deadline)

为该条目设置截止日期。带前缀参数时,移除截止日期。

S-RIGHT (org-agenda-do-date-later)

将当前行关联的时间戳向后调整一天。若日期已过,首次调用会将其改为今天。带数字前缀参数时,调整对应天数,例如 3 6 5 S-RIGHT 调整一年。带 C-u 前缀时,时间调整一小时;立即重复该命令,无需前缀也会继续按小时调整。带双重 C-u C-u 前缀时,按分钟调整。时间戳会在原始 Org 文件中修改,但不会直接反映在日程缓冲区,需按 rg 更新。

S-LEFT (org-agenda-do-date-earlier)

将当前行关联的时间戳向前调整一天。

> (org-agenda-date-prompt)

修改当前行关联的时间戳。选择 > 键是因为其在键盘上等价于 S-.

I (org-agenda-clock-in)

为当前条目开始计时。若已有计时正在运行,会先停止该计时。

O (org-agenda-clock-out)

停止此前启动的计时。

X (org-agenda-clock-cancel)

取消当前正在运行的计时。

J (org-agenda-clock-goto)

在另一个窗口跳转到正在运行的计时项。

k (org-agenda-capture)

功能类似 org-capture ,但使用光标所在日期作为捕获模板的默认日期。可设置 org-capture-use-agenda-date 使其成为 org-capture 的默认行为。

Bulk remote editing selected entries

m (org-agenda-bulk-mark)

标记光标所在条目以进行批量操作。若日程中有活动区域,则标记区域内条目;带数字前缀参数时,标记对应数量的连续条目。

* (org-agenda-bulk-mark-all)

标记所有可见日程条目以进行批量操作。

u (org-agenda-bulk-unmark)

取消条目批量操作标记。

U (org-agenda-bulk-unmark-all)

取消所有已标记条目的批量操作标记。

M-m (org-agenda-bulk-toggle)

切换光标所在条目的批量操作标记状态。

M-* (org-agenda-bulk-toggle-all)

切换所有条目的批量操作标记状态。

% (org-agenda-bulk-mark-regexp)

标记匹配正则表达式的条目以进行批量操作。

B (org-agenda-bulk-action)

批量操作:对日程中所有已标记条目执行操作。系统会提示输入另一个按键选择操作类型。B 的前缀参数会传递给 sd 命令,用于批量移除这些特殊时间戳。默认情况下,批量操作后标记会清除;若想保留标记,可将 org-agenda-bulk-persistent-marks 设置为 t ,或在提示框中按 p

p

切换标记持久化状态。

$

归档所有选中条目。

A

通过移动到对应归档兄弟节点的方式归档条目。

t

修改 TODO 状态。提示输入单个 TODO 关键字,并统一修改所有选中条目的状态,跳过阻塞检查且不记录日志备注—但保留时间戳。

+

为所有选中条目添加标签。

-

为所有选中条目移除标签。

s

为所有条目重新设置计划日期。若要将现有计划日期固定向后推移若干天,可在提示框中输入以双加号开头的格式,例如 ‘++8d’ 或 ‘++2w’ 。

d

设置截止日期为指定日期。

r

提示输入单个归栏目标并移动所有条目。这些条目会从日程中消失,刷新(g)后重新显示。

S

随机重新安排到未来 N 天内,N 由用户输入。带前缀参数(C-u B S)时,仅分散到工作日。

f

对标记条目应用自定义函数101。例如,以下函数将条目的 ‘CATEGORY’ 属性设为 ‘web’ 。

(defun set-category ()
  (interactive "P")
  (let ((marker (or (org-get-at-bol 'org-hd-marker)
                    (org-agenda-error))))
    (org-with-point-at marker
      (org-back-to-heading t)
      (org-set-property "CATEGORY" "web"))))

Calendar commands

c (org-agenda-goto-calendar)

打开 Emacs 日历并跳转到日程中光标所在日期。

c (org-calendar-goto-agenda)

在日历界面中,计算并显示光标所在日期的 Org 日程。

i (org-agenda-diary-entry)

使用光标所在日期(对于块条目则使用标记处日期)向日记中插入新条目,方式类似日历中的 i 命令,内容会添加到 Emacs 日记文件102。日记文件会在另一个窗口弹出,供你添加条目内容。

若将 org-agenda-diary-file 配置为某个 Org 文件,Org 会在该文件中创建条目。大多数条目会保存在基于日期的大纲树中,便于后续归档过往月份/年份的日程。该树构建在带有 ‘DATE_TREE’ 属性的条目下,若无则以年份作为顶级条目。Emacs 会提示输入条目文本——若直接输入内容,会在 org-agenda-diary-file 中自动创建条目无需额外操作;若在提示框中直接按 RET,目标文件会在另一个窗口显示,供你手动完成编辑。另可参见 k r 命令。

M (org-agenda-phases-of-moon)

显示当前日期前后三个月的月相。

S (org-agenda-sunrise-sunset)

显示日出日落时间。需通过日历变量设置地理位置,参见 Emacs 日历文档。

C (org-agenda-convert-date)

将光标所在日期转换为多种其他文化与历史历法日期。

H (org-agenda-holidays)

显示光标所在日期前后三个月的节假日。

Quit and exit

q (org-agenda-quit)

退出日程,关闭日程缓冲区。

x (org-agenda-exit)

退出日程,关闭日程缓冲区及所有为编译日程而加载的缓冲区,但不会关闭用户手动打开的 Org 文件缓冲区。


11.6 Custom Agenda Views

自定义日程命令有两个用途:保存并快速访问常用的 TODO 与标签搜索,以及创建专用的复合日程缓冲区。自定义日程命令可通过调度器调用(见 The Agenda Dispatcher),用法与默认命令一致。


11.6.1 Storing searches

自定义搜索的第一种用途是为常用搜索设置快捷键,既可生成日程缓冲区,也可生成稀疏树(后者仅作用于当前缓冲区)。

自定义命令通过变量 org-agenda-custom-commands 配置。你可以通过自定义界面修改该变量,例如在日程调度器中按 C(见 The Agenda Dispatcher)。也可以在 Emacs 初始化文件中直接用 Emacs Lisp 设置。下面的示例包含所有合法的日程视图:

(setq org-agenda-custom-commands
      '(("x" agenda)
        ("y" agenda*)
        ("w" todo "WAITING")
        ("W" todo-tree "WAITING")
        ("u" tags "+boss-urgent")
        ("v" tags-todo "+boss-urgent")
        ("U" tags-tree "+boss-urgent")
        ("f" occur-tree "\\<FIXME\\>")
        ("h" . "HOME+Name tags searches") ;description for "h" prefix
        ("hl" tags "+home+Lisa")
        ("hp" tags "+home+Peter")
        ("hk" tags "+home+Kim")))

每条配置开头的字符串为调度器触发该命令所需按下的按键。通常为单个字符,若命令较多,也可定义双字母组合,首字母相同作为前缀键103。第二个参数为搜索类型,其后为匹配用的字符串或正则表达式。上述示例定义了:

x

全局搜索本周/本日计划的日程条目104

y

搜索范围同上,但仅包含带具体时间(如 ‘[h]h:mm’ )的条目,可视为约会类事项。

w

全局搜索 TODO 关键字为 ‘WAITING’ 的条目。

W

搜索范围同上,但仅作用于当前缓冲区并以稀疏树展示结果。

u

全局标签搜索,匹配带有 ‘boss’ 标签但不含 ‘urgent’ 标签的标题。

v

搜索条件同上,但仅限定为 TODO 类型条目。

U

搜索条件同上,但仅作用于当前缓冲区并以稀疏树展示结果。

f

在当前缓冲区生成稀疏树,列出所有包含 ‘FIXME’ 单词的条目。

h

作为 ‘HOME’ 标签搜索的前缀命令,需再按一个键(lpk)选择人名(Lisa、Peter 或 Kim)作为附加匹配标签。

注意 *-tree 类日程视图必须从 Org 缓冲区调用,因其仅作用于当前缓冲区。


11.6.2 Block agenda

另一种用法是构建由 多条(several) 命令结果组成的日程视图,每条命令在日程缓冲区中生成一个区块。可用命令包括 agenda (每日/每周日程,对应 a)、 alltodo (全局 TODO 列表,对应 t)、 stuck (停滞项目列表,对应 #),以及前文提到的 todotagstags-todo 等匹配命令。

以下是两个示例:

(setq org-agenda-custom-commands
      '(("h" "Agenda and Home-related tasks"
         ((agenda "")
          (tags-todo "home")
          (tags "garden")))
        ("o" "Agenda and Office-related tasks"
         ((agenda "")
          (tags-todo "work")
          (tags "office")))))

该配置将 h 设为家庭相关事务的多区块视图。生成的日程缓冲区包含本周日程、所有带 ‘home’ 标签的 TODO 条目,以及所有带 ‘garden’ 标签的行。命令 o 则提供办公相关的同类视图。


11.6.3 Setting options for custom commands

Org mode 内置多个控制日程生成与展示的变量。全局变量对所有日程命令(包括自定义命令)生效。若只需为单个自定义视图修改设置,可在 org-agenda-custom-commands 中对应位置插入变量名与值列表。示例:

(setq org-agenda-custom-commands
      '(("w" todo "WAITING"
         ((org-agenda-sorting-strategy '(priority-down))
          (org-agenda-prefix-format "  Mixed: ")))
        ("U" tags-tree "+boss-urgent"
         ((org-fold-show-context-detail 'minimal)))
        ("N" search ""
         ((org-agenda-files '("~org/notes.org"))
          (org-agenda-text-search-extra-files nil)))))

此时 w 命令仅按优先级排序,前缀格式简化为 ‘Mixed:’ ,不再显示条目分类。U 的稀疏标签树会极度紧凑,匹配标题的上层层级与后续标题均不显示。N 命令则限定只在单个文件内进行文本搜索。

对于生成区块日程的命令组, org-agenda-custom-commands 提供两处设置位置:可添加仅对组内单条命令生效的选项,以及对组内所有命令生效的选项。前者直接加入对应命令条目;后者需放在所有命令条目之后。回到区块日程示例(见 Block agenda),将 h 的默认排序设为 priority-down ,而 ‘garden’ 标签查询结果反向排序为 priority-up ,配置如下:

(setq org-agenda-custom-commands
      '(("h" "Agenda and Home-related tasks"
         ((agenda)
          (tags-todo "home")
          (tags "garden"
                ((org-agenda-sorting-strategy '(priority-up)))))
         ((org-agenda-sorting-strategy '(priority-down))))
        ("o" "Agenda and Office-related tasks"
         ((agenda)
          (tags-todo "work")
          (tags "office")))))

可见变量值与括号结构略复杂。不确定时建议使用自定义界面设置该变量,其完全支持该结构。注意:在该界面设置选项时, 值(values) 为纯 Lisp 表达式,字符串需自行添加双引号。

如需控制某日程命令仅在特定上下文可用,可自定义 org-agenda-custom-commands-contexts 。例如日程命令 o 仅在阅读邮件时使用,配置如下:

(setq org-agenda-custom-commands-contexts
      '(("o" (in-mode . "message-mode"))))

也可让按键 o 在特定上下文映射到另一命令 r

(setq org-agenda-custom-commands-contexts
      '(("o" "r" (in-mode . "message-mode"))))

更多说明见该变量的文档字符串。


11.7 Exporting Agenda Views

不在电脑前时,打印日程视图会很方便。Org mode 可将自定义日程视图导出为纯文本、HTML105、Postscript、PDF106 与 iCalendar 文件。偶尔导出可使用以下命令:

C-x C-w (org-agenda-write)

将日程视图写入文件。

若需频繁导出特定视图,可为任意自定义日程命令关联输出文件名列表107。下例先为日程与全局 TODO 列表定义自定义命令并指定导出文件,再为两个区块日程命令同样设置文件名。路径可为相对路径或绝对路径。

(setq org-agenda-custom-commands
      '(("X" agenda "" nil ("agenda.html" "agenda.ps"))
        ("Y" alltodo "" nil ("todo.html" "todo.txt" "todo.ps"))
        ("h" "Agenda and Home-related tasks"
         ((agenda "")
          (tags-todo "home")
          (tags "garden"))
         nil
         ("~/views/home.html"))
        ("o" "Agenda and Office-related tasks"
         ((agenda)
          (tags-todo "work")
          (tags "office"))
         nil
         ("~/views/office.ps" "~/calendars/office.ics"))))

文件扩展名决定导出格式: ‘.html’ 会使用 htmlize 包转为 HTML; ‘.ps’ 调用 ps-print-buffer-with-faces 生成 Postscript; ‘.ics’ 会对构建日程的所有文件执行 iCalendar 导出,并仅导出日程中列出的条目;其他扩展名则生成纯 ASCII 文件。

交互式使用这些命令时 不会(not) 自动生成导出文件以避免开销。需通过专用命令一次性生成 所有 指定文件:

e (org-store-agenda-views)

导出所有关联了导出文件的日程视图。

可在自定义日程命令的选项段为导出命令设置参数,示例:

(setq org-agenda-custom-commands
      '(("X" agenda ""
         ((ps-number-of-columns 2)
          (ps-landscape-mode t)
          (org-agenda-prefix-format " [ ] ")
          (org-agenda-with-colors nil)
          (org-agenda-remove-tags t))
         ("theagenda.ps"))))

该命令为 Postscript 导出器设置两列横向打印,页面可裁切后用于纸质日程。其余设置简化日程前缀,省略分类与计划信息,改用勾选框;移除标签使行更紧凑;黑白打印时关闭颜色。 org-agenda-exporter-settings 中的设置同样生效,例如:

(setq org-agenda-exporter-settings
      '((ps-number-of-columns 2)
        (ps-landscape-mode t)
        (org-agenda-add-entry-text-maxlines 5)
        (htmlize-output-type 'css)))

org-agenda-custom-commands 中的设置优先级更高。

也可在命令行使用:

emacs -eval (org-batch-store-agenda-views) -kill

如需修改参数108

emacs -eval '(org-batch-store-agenda-views                      \
              org-agenda-span (quote month)                     \
              org-agenda-start-day "2007-11-01"                 \
              org-agenda-include-diary nil                      \
              org-agenda-files (quote ("~/org/project.org")))'  \
      -kill

该命令限定仅从 ‘~/org/project.org’ 生成日程视图,不含日记内容,时间跨度为 30 天。

也可提取日程信息供其他程序进一步处理,详见 Extracting Agenda Information


11.8 Using Column View in the Agenda

列视图(见 Column View)通常用于查看与编辑 Org 文件层级结构内的属性。在按条件汇总条目的日程中使用列视图也十分实用。

C-c C-x C-c (org-agenda-columns)

在日程中启用列视图。

正确使用需明确:日程中的条目已脱离原大纲环境,由此带来以下问题:

  1. Org 需要确定使用的列格式。日程条目来自多个文件,不同文件可能有不同列格式。Org 会依次检查:当前是否设置 org-overriding-columns-format ,若是则使用该格式(建议仅在自定义日程命令的 局部设置段 配置,见 Custom Agenda Views);若无则检查 org-columns-default-format-for-agenda 、日程首个条目关联的格式(通过缓冲区属性或 ‘#+COLUMNS’ 设置),最后使用 org-columns-default-format
  2. 若某列定义了汇总类型(见 Column attributes),启用日程列视图时会遍历所有相关日程文件,确保属性计算结果为最新,特殊属性 ‘CLOCKSUM’ 同理。Org 会对日程中展示的值求和:每日/每周日程按单日汇总,其他视图按整个区块汇总。

    需注意:同一条目可能在日程中出现 两次 (如同时为计划与截止日期),或出现同层级的父子条目,此类情况会导致重复计算,汇总结果不准确。

  3. 当日程列视图显示 ‘CLOCKSUM’ 属性时,值为该条目的全部计时时间。即使在每日/每周日程中,列视图里的 CLOCKSUM 也可能包含当前视图外的时间。这便于对比任务计划总工作量,是日程列视图的主要用途之一。如需查看当前展示时段的计时,可使用计时表模式(在日程中按 R)。
  4. 当日程列视图显示 ‘CLOCKSUM_T’ 属性时,值为该条目今日的计时时间。即使在周日程中,该值也仅统计当日。可用于对比今日耗时、累计总耗时( ‘CLOCKSUM’ )与计划总工作量。

12 Markup for Rich Contents

Org 主要用于组织和检索纯文本笔记。同时,它也提供一套轻量但强大的标记语言,用于富文本格式化等更多场景。例如,你可能希望文本居中或强调显示,或是在写作中插入公式、图片。Org 为所有这些需求提供了相应语法。配合导出框架(见 Exporting)使用,你可以用 Org 编写精美的文档—就像你正在阅读的这份手册。


12.1 Paragraphs

段落之间至少用一个空行分隔。如果需要在段落内强制换行,在行尾使用 ‘\\’ 。

若要保留某一区域内的换行、缩进和空行,其余部分则使用常规格式,可以使用以下结构,该结构也可用于排版诗歌。

#+BEGIN_VERSE
 Great clouds overhead
 Tiny black birds rise and fall
 Snow covers Emacs

    ---AlexSchroeder
#+END_VERSE

引用其他文档中的段落时,通常会将其格式化为左右两侧均缩进的段落。你可以在 Org 文档中这样添加引用:

#+BEGIN_QUOTE
Everything should be made as simple as possible,
but not any simpler ---Albert Einstein
#+END_QUOTE

如果想让部分文本居中,可以这样写:

#+BEGIN_CENTER
Everything should be made as simple as possible, \\
but not any simpler
#+END_CENTER

12.2 Emphasis and Monospace

你可以将文字设置为 ‘*粗体(bold)*’ 、 ‘/斜体(italic)/’ 、 ‘_下划线(underlined)_’ 、 ‘=逐字文本(verbatim)=’ 和 ‘~代码(code)~’ ,必要时还可以使用 ‘+删除线+’ 。代码与逐字字符串中的文本不会被 Org 专用语法处理,会原样导出。Org 提供单一命令作为插入标记字符的入口。

C-c C-x C-f (org-emphasize)

提示输入标记字符并插入或修改强调样式。若存在活动区域,则将该区域改为新的强调样式;若无区域,则直接插入标记字符并将光标置于其间。

若要关闭标记文本的字体高亮,可将 org-fontify-emphasized-text 设置为 nil 。若要精简高亮标记语法的列表,可自定义 org-emphasis-alist109

若要在缓冲区中隐藏强调标记字符,可将 org-hide-emphasis-markers 设置为 t

有时,被标记的文本本身也包含标记字符,结果可能会出现歧义。例如:

/One may expect this whole sentence to be italicized, but the
following ~user/?variable~ contains =/= character, which effectively
stops emphasis there./

你可以使用零宽空格帮助 Org 消除歧义。更多细节见 Escape Character


12.3 Subscripts and Superscripts

^’ 和 ‘_’ 分别用于表示上标和下标。为提升 ASCII 文本可读性,多字符的上下标可以用花括号包裹(非必需)。例如:

The radius of the sun is R_sun = 6.96 x 10^8 m.  On the other hand,
the radius of Alpha Centauri is R_{Alpha Centauri} = 1.28 x R_{sun}.

若你在文本中频繁将下划线用于其他用途,Org 默认将其解释为下标的规则可能会造成干扰。可通过配置变量 org-use-sub-superscripts 和/或 org-export-with-sub-superscripts 修改该规则。例如,将这些变量设为 {} 时, ‘a_b’ 不会显示/导出110为下标,而 ‘a_{b}’ 会。

你可以在文件中通过导出选项 ‘^:’ (见 Export Settings)同时设置 org-use-sub-superscriptsorg-export-with-sub-superscripts 。例如, ‘#+OPTIONS: ^:{}’ 会将两个选项设为 {} ,仅允许花括号形式的上下标。

你还可以切换上下标的视觉显示:

C-c C-x \ (org-toggle-pretty-entities)

该命令以 所见即所得(WYSIWYM) 的方式格式化上下标。

org-pretty-entitiesorg-pretty-entities-include-sub-superscripts 均设为 t ,可在打开文件时就按 org-use-sub-superscripts 的设置 视觉上(visually) 解析上下标。


12.4 Special Symbols

你可以使用类 LaTeX 语法插入特殊符号—命名实体,例如用 ‘\alpha’ 表示希腊字母, ‘\to’ 表示箭头。这些符号支持补全,只需输入 ‘\’ 及若干字母,再按 M-TAB 即可查看可选补全项。若需要在单词内使用此类符号,可用一对花括号结尾。例如:

Pro tip: Given a circle \Gamma of diameter d, the length of its
circumference is \pi{}d.

Org 提供大量实体符号,名称源自 HTML 与 LaTeX;你可以通过命令 org-entities-help 在专用缓冲区中浏览完整列表。也可以通过变量 org-entities-user 自定义特殊符号。

导出时,这些符号会转换为导出后端的原生格式。如 ‘\alpha’ 在 HTML 中导出为 ‘&alpha;’ ,在 LaTeX 中导出为 ‘\(\alpha\)’ 。同理, ‘\nbsp’ 在 HTML 中为 ‘&nbsp;’ ,在 LaTeX 中为 ‘~’ 。

若希望实体以 UTF-8 字符显示,可使用以下命令111

C-c C-x \ (org-toggle-pretty-entities)

切换实体为 UTF-8 字符显示。此操作不会改变缓冲区内容(仍为纯 ASCII),仅在显示时覆盖为 UTF-8 字符。

除上述常规实体外,Org 还会对以下常用字符组合进行特殊导出112: ‘\-’ 视为可选连字符, ‘--’ 和 ‘---’ 转换为短横线与长横线, ‘...’ 变为紧凑省略号。


12.5 Embedded LaTeX

纯 ASCII 通常足以满足绝大多数笔记需求,例外情况是科研笔记,这类内容常需要数学符号与公式。LaTeX113 是广泛用于排版科技文档的工具。Org mode 支持嵌入 LaTeX 代码,一方面因为许多科研人员习惯读写 LaTeX 源码,另一方面它可被轻松处理,为多种导出后端生成精美输出。


12.5.1 LaTeX fragments

Org mode 可包含 LaTeX 数学片段,并支持为多种导出后端处理这些内容。导出为 LaTeX 时,代码原样保留;导出为 HTML 时,Org 可使用 MathJax(见 Math formatting in HTML export)或将数学公式转为图片(见 Previewing LaTeX fragments)。

LaTeX 片段无需任何特殊标记,以下代码片段会被识别为 LaTeX 源码:

  • 任意类型的环境114。唯一要求是 ‘\begin’ 语句独占一行,且前方仅含空白字符。
  • 常规 LaTeX 数学定界符内的文本。行内片段推荐使用 ‘\(...\)’ 。 ‘$...$’ 形式存在部分限制,可能引发歧义。为避免与货币表示冲突,单个 ‘$’ 仅在满足以下条件时被识别为数学定界符:包裹文本内换行不超过两处,与 ‘$’ 直接相连无空白,且闭合 ‘$’ 后为空白或标点(非短横线)。

    有时即使 ‘$’ 被识别为 LaTeX 定界符,仍需表示字面美元符号。Org 提供 ‘\dollar’ 和 ‘\USD’ 实体(见 Special Symbols)用于此类场景,渲染为 ‘$’ 。另见 Escape Character

例如:

\begin{equation}                        % 任意环境,
x=\sqrt{b}                              % 包括表格、图表等
\end{equation}

若 $a^2=b$ 且 \( b=2 \),则解必为
$$ a=+\sqrt{2} $$ 或 \[ a=-\sqrt{2} \] 之一。

LaTeX 处理可通过变量 org-export-with-latex 配置。默认值 t 表示 HTML 导出使用 MathJax,ASCII 与 LaTeX 后端不做处理。 你也可以在文件中通过以下行单独设置该变量:

#+OPTIONS: tex:t自动适配(MathJax)
#+OPTIONS: tex:nil完全不处理 LaTeX 片段
#+OPTIONS: tex:verbatim原样导出,适用于 jsMath 等

12.5.2 Previewing LaTeX fragments

若你已正确安装 LaTeX 及 ‘dvipng=、=dvisvgm’ 或 ‘convert115,LaTeX 片段可被处理为排版公式图片,用于 HTML 导出(见 LaTeX fragments)或 Org mode 内行预览。

你可以自定义变量 org-format-latex-optionsorg-format-latex-header 调整预览效果。特别是前者的 :scale (HTML 导出为 :html-scale )属性可用于调整预览图片大小。

C-c C-x C-l (org-latex-preview)

为光标处的 LaTeX 片段生成预览图片并覆盖在源码上。若光标处无片段,则处理当前条目(两个标题之间)的所有片段。

单前缀参数调用时,清除当前条目所有图片;双前缀参数为缓冲区所有片段生成预览;三前缀参数清除缓冲区所有预览图片。

你可以通过以下设置在打开文件时自动预览所有 LaTeX 片段:

#+STARTUP: latexpreview

禁用则使用:

#+STARTUP: nolatexpreview

12.5.3 Using CDLaTeX to enter math

CDLaTeX mode 是一个次要模式,通常与 AUCTeX 等 LaTeX 主模式配合使用,用于加速插入环境与数学模板。在 Org mode 内,你可以使用 CDLaTeX mode 的部分功能。需要安装 ‘cdlatex.el’ 和 ‘texmathp.el’ (后者随 AUCTeX 一同提供)。 ‘cdlatex’ 包可通过 Emacs 打包系统NonGNU ELPA 安装。不要在 Org mode 下直接使用 CDLaTeX mode,而是使用 Org 自带的专用版本 Org CDLaTeX 次要模式。在当前缓冲区通过 M-x org-cdlatex-mode 开启,或为所有 Org 文件全局启用:

(add-hook 'org-mode-hook #'turn-on-org-cdlatex)

启用该模式后,具备以下功能(更多细节见 CDLaTeX mode 文档):

C-c {

插入环境模板。

TAB

若光标位于 LaTeX 片段内116TAB 可展开模板。例如,TAB 会将 ‘fr’ 展开为 ‘\frac{}{}’ 并将光标正确置于第一个大括号内,再次按 TAB 进入第二个大括号。

即使在片段外,TAB 也可在行首展开环境缩写。例如在行首输入 ‘equ’ 并按 TAB,会展开为 ‘equation’ 环境。输入 M-x cdlatex-command-help 可查看所有缩写列表。

^, _

在 LaTeX 片段内按 _^ 会插入字符并附带一对大括号。若通过 TAB 移出大括号,且大括号内仅含单个字符或宏,则大括号会被自动移除(取决于变量 cdlatex-simplify-sub-super-scripts )。

`

按反引号后再按一个字符,可插入数学宏,即使不在 LaTeX 片段内也生效。若按下反引号后等待超过 1.5 秒,会弹出帮助窗口。

'

按单引号后再按一个字符,可为光标前的 LaTeX 符号添加重音或字体修饰。单引号后等待超过 1.5 秒会弹出帮助窗口。字符修饰仅在 LaTeX 片段内生效,片段外为普通单引号。


12.6 Literal Examples

你可以插入无需标记处理的字面示例,这类示例以等宽字体排版,非常适合展示源码及类似内容。

#+BEGIN_EXAMPLE
  Some example from a text file.
#+END_EXAMPLE

但存在一个限制:以 ‘*’ 、 ‘,*’ 、 ‘#+’ 或 ‘,#+’ 开头的行,必须在行首插入一个逗号,因为这些字符可能被识别为大纲节点或其他特殊语法。Org 在读取块内容时会自动移除这些额外的逗号。

#+BEGIN_EXAMPLE
,* I am no real headline
#+END_EXAMPLE

对于小型示例,简化写法是在行首以冒号加空格开头,冒号前也可包含额外空白:

Here is an example
   : Some example from a text file.

若示例为编程语言源码或其他可在 Emacs 中通过 Font Lock 高亮的文本,可让示例显示为 Emacs 高亮后的样式117。这通过代码块实现,同时需要指定用于高亮的主模式名称118,快速插入代码块的方法见 Structure Templates

#+BEGIN_SRC emacs-lisp
  (defun org-xor (a b)
    "Exclusive or."
    (if a (not b) b))
#+END_SRC

在 ‘example’ 和 ‘src’ 代码片段中,可在 ‘#+BEGIN’ 行添加 ‘-n’ 参数119,为示例行添加行号。=-n= 可接受可选数字参数,指定块的起始行号。使用 ‘+n’ 参数时,当前块会接续上一个编号片段的行号继续计数。 ‘+n’ 也可接受数字参数,该值会与上一个块的最后一行相加,作为当前块的起始行号。

#+BEGIN_SRC emacs-lisp -n 20
  ;; This exports with line number 20.
  (message "This is line 21")
#+END_SRC

#+BEGIN_SRC emacs-lisp +n 10
  ;; This is listed as line 31.
  (message "This is line 32")
#+END_SRC

在字面示例中,Org 会将 ‘(ref:name)’ 这类字符串识别为标签,并作为特殊超链接的目标,如 ‘[[(name)]]’—即引用名放在单括号内。在 HTML 中,鼠标悬停在这类链接上时,会远程高亮对应的代码行120

你还可以添加 ‘-r’ 参数,从源码中 移除(removes) 标签121。使用 ‘-n’ 参数时,指向这些引用的链接会使用代码清单中的行号标记;否则链接使用不带括号的标签。示例如下:

#+BEGIN_SRC emacs-lisp -n -r
  (save-excursion                 (ref:sc)
     (goto-char (point-min))      (ref:jump)
#+END_SRC
In line [[(sc)]] we remember the current position. [[(jump)][Line (jump)]]
jumps to point-min.

源码与示例可以进行 缩进(indented) ,以便与周围文本(尤其是普通列表结构,见 Plain Lists)对齐。默认情况下,Org 仅保留行之间的相对缩进,例如导出块内容时。但若有必要,可使用 ‘-i’ 参数保留全局缩进。见 Editing Source Code

若标签格式语法与语言语法冲突,可使用 ‘-l’ 参数修改格式,例如:

#+BEGIN_SRC pascal -n -r -l "((%s))"

另见变量 org-coderef-label-format

HTML 导出还支持将示例发布为文本区域,见 Text areas in HTML export

由于 ‘#+BEGIN’ … ‘#+END’ 结构需要频繁添加,Org 提供了快捷方式(见 Structure Templates)。

C-c ' (org-edit-special)

在对应原生模式下编辑光标处的源码示例。该操作会切换到临时缓冲区编辑源码,完成后按 C-c ' 退出,编辑后的内容会替换 Org 缓冲区中的旧内容。等宽区域(每行以冒号加空格开头)会使用 Artist 模式122编辑,方便绘制 ASCII 图形。在空行使用该命令会新建一个等宽区域。

在通过 C-c ' 创建的临时缓冲区中编辑源码示例时,调用 org-store-link (见 Handling Links)会提示输入标签。确保其在当前缓冲区唯一,并以 ‘(ref:label)’ 格式插入当前行尾。随后该标签会以 ‘(label)’ 形式存储为链接,可通过 C-c C-l 调用。


12.8 Captions

可以在文档特定内容前直接插入 ‘CAPTION’ 关键字,为其指定标题:

#+CAPTION: 这是下一个表格(或链接)的标题
| ... | ... |
|-----+-----|

标题也可以选用如下格式:

#+CAPTION[Short caption]: Longer caption.
#+CAPTION[简短标题]: 完整详细标题。

尽管图片和表格是最常见的带标题结构,但同一套标题机制也适用于其他多种内容—例如 LaTeX 公式、源代码块等。具体是否支持,取决于导出后端。


12.9 Horizontal Rules

由至少五个连续短横线组成的整行内容,在导出时会被转换为水平分隔线。


12.10 Creating Footnotes

脚注以位于行首(第0列)的方括号标记开始,不允许缩进。脚注在遇到下一个脚注定义、标题或两个连续空行时结束。文本中的脚注引用即为方括号内的标记。标记始终以 ‘fn:’ 开头。示例:

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

Org mode 在数字式语法基础上进行了扩展,支持 命名脚注(named) 与可选的行内定义。合法的引用格式如下:

[fn:NAME]

命名脚注引用,其中 NAME 为唯一标识词,也可使用数字以便自动生成。

[fn:: 此行内直接定义脚注内容]

匿名脚注,在引用位置直接给出定义。

[fn:NAME: 脚注定义内容]

带名称的行内脚注定义。由于 Org 支持对同一脚注的多次引用,之后可直接使用 ‘[fn:NAME]’ 追加引用。

脚注标签可自动生成,也可手动命名。该行为由变量 org-footnote-auto-label 及对应的 ‘STARTUP’ 关键字控制,详见该变量的文档字符串。

以下命令用于操作脚注:

C-c C-x f

脚注操作命令。

光标位于脚注引用处时,跳转到对应定义;位于定义处时,跳转到第一个引用。

其他情况下则新建脚注。根据变量 org-footnote-define-inline126,定义内容可直接嵌入引用处文本,或单独放置在变量 org-footnote-section 指定的位置。

带前缀参数调用该命令时,会显示附加选项菜单:

s按引用顺序对脚注定义排序
r对简单格式 ‘fn:N’ 的脚注重新编号
S先执行编号重置 r,再执行排序 s
n将所有脚注统一重命名为 ‘fn:1’ … ‘fn:n’ 序列
d删除光标处脚注,包括定义与所有引用

根据变量 org-footnote-auto-adjust127,在每次插入或删除脚注后可自动完成编号重排与排序。

C-c C-c

光标位于脚注引用处时跳转到定义,位于定义处时跳回引用。带前缀参数在脚注位置调用时,菜单与 C-c C-x f 相同。

C-c C-omouse-1/2

脚注标签同时也是指向对应定义或引用的链接,可使用常规链接跳转命令访问。


13 Exporting

有时你可能需要打印笔记、将其发布到网页,或与不使用 Org 的人共享。Org 可以将文档转换并导出为多种其他格式,同时尽可能保留原有结构(见 Document Structure)和标记格式(见 Markup for Rich Contents)。

负责将 Org 文件转换为其他格式的库称为 后端(backends) 。Org 自带支持以下后端:

用户可以通过 Emacs 包系统安装支持更多格式的库。为方便查找,这类包遵循统一命名规则: ox-NAME ,其中 NAME 为目标格式。例如 ox-koma-letter 对应 koma-letter 后端。更多库可在 ‘org-contrib’ 仓库中找到(见 Installation)。

Org 默认只加载以下格式的后端:ASCII、HTML、iCalendar、LaTeX 和 ODT。额外后端可通过两种方式加载:配置 org-export-backends 变量,或在 Emacs 初始化文件中加载对应库。例如加载 Markdown 后端可在配置中添加:

(require 'ox-md)

13.1 The Export Dispatcher

导出调度器是 Org 导出功能的主界面。它以层级菜单展示当前已配置的导出格式,选项以直观开关形式在同一界面显示。

Org 还为导出调度器提供极简提示界面。当变量 org-export-dispatch-use-expert-ui 设为非 nil 值时,Org 会在小缓冲区进行提示。按 ? 可切回层级菜单。

C-c C-e (org-export-dispatch)

调用导出调度器界面,选项显示为默认设置。C-u 前缀会保留上一次导出的选项,包括子树选择范围。

Org 默认导出整个缓冲区。若 Org 缓冲区中有激活区域,则只导出该区域。

在调度器界面内,以下组合键可进一步调整导出内容与方式。

C-a

切换异步导出。异步导出使用外部 Emacs 进程及专用初始化文件在后台完成导出,不阻塞当前 Emacs。导出长文档时尤其有用。

异步导出的输出会保存在 导出栈(export stack) 中。使用双重 C-u 前缀调用导出调度器可查看该栈;若已在导出菜单中,按 & 可显示栈内容。

可以通过设置 org-export-in-background ,将异步导出设为默认行为。

可通过 org-export-async-init-file 设置后台进程使用的初始化文件。

C-b

切换仅导出正文。常用于在导出时排除页眉页脚,仅对 HTML 中 ‘<head>...</head>’ 等带头部区域的格式生效。

org-export-body-only 设为默认可永久开启仅导出正文。

C-f

切换强制发布导出。发布功能通常只发布变更文件(见 Triggering Publication);强制发布会忽略时间戳,直接发布所有文件。

org-export-force-publishing 设为默认可永久开启强制发布(与 org-publish-use-timestamps-flag 类似,但仅影响导出调度器)。

C-s

切换仅导出子树。开启后,Org 只导出调用调度器时光标所在位置起始的子树,并以该子树顶层标题作为文档标题。若光标不在标题上,使用最近的上层标题;若在文档前言部分则报错并中止导出。

org-export-initial-scope 设为默认可永久开启子树导出。

C-v

切换仅导出可见内容。通过调整标题可见性,只导出文档特定部分,非常实用。另见 Sparse Trees

org-export-visible-only 设为默认可永久开启仅导出可见内容。


13.2 Export Settings

导出选项可在多处设置:全局变量;单个文件内通过缓冲区局部变量设置(见 Summary of In-Buffer Settings);单独设置关键字或用 ‘OPTIONS’ 关键字紧凑设置;子树级别通过属性设置(见 Properties and Columns)。低层级设置会覆盖高层级设置。

缓冲区设置可出现在文件任意位置,可直接书写或通过 ‘#+SETUPFILE: filename or URL’ 语法引入外部文件。针对特定后端的选项关键字集可在导出调度器(见 The Export Dispatcher)中按 # 使用 ‘插入模板(Insert template)’ 命令生成。逐个插入关键字时,建议输入 ‘#+’ 后按 M-TAB128 补全以确保正确。

所有后端通用的导出关键字及对应全局变量包括:

AUTHOR

文档作者 (user-full-name) 。

CREATOR

生成输出内容的程序标识 (org-export-creator-string)。

DATE

日期或时间戳129

EMAIL

邮箱地址 (user-mail-address)。

LANGUAGE

导出时用于翻译固定字符串的语言 (org-export-default-language)。例如 ‘#+LANGUAGE: fr’ 会将 ‘Table of contents’ 译为法语 ‘Table des matières130

SELECT_TAGS

选中导出的标签列表,默认 org-export-select-tags("export")’ 。子树带有 ‘export’ 标签时,该子树及其下级会被导出,其余无此标签的部分忽略。

按 ‘export’ 标签选择性导出时,第一个标题前的文本不会导出。

无 ‘export’ 标签的文件会导出全部内容。

如需自定义导出标签,可全局修改 org-export-select-tags 或在文档中添加 ‘#+SELECT_TAGS: tag1 tag2’ 。

EXCLUDE_TAGS

排除导出的标签列表,默认 org-export-exclude-tags("noexport")’ 。子树带有 ‘noexport’ 标签时,该子树及其下级会被排除。

标记 ‘noexport’ 的条目无条件排除,即使同时带有 ‘export’ 标签。子树即使不导出,其中代码块仍会执行。

如需自定义排除标签,可全局修改 org-export-exclude-tags 或在文档中添加 ‘#+EXCLUDE_TAGS: tag1 tag2’ 。

TITLE

文档标题。长标题可使用多行 ‘#+TITLE’ 。

EXPORT_FILE_NAME

指定输出文件名。未指定时,Org 会根据缓冲区名称和后端格式后缀自动生成。

OPTIONS’ 关键字为紧凑设置方式,可使用多行配置多个选项,支持以下参数:

'

切换智能引号 (org-export-with-smart-quotes)。启用后,根据语言将双引号作为主引号、单引号作为次引号,单独撇号视为省略符。

*

切换强调文本 (org-export-with-emphasize)。

-

切换特殊字符串转换 (org-export-with-special-strings)。

:

切换等宽区域 (org-export-with-fixed-width)。

<

切换是否包含时间/日期的激活/非激活标记 (org-export-with-timestamps)。

\n

切换是否保留换行 (org-export-preserve-breaks)。

^

切换类 TeX 上下标语法。若写 ‘^:{}’ ,则 ‘a_{b}’ 会被解析,简单写法 ‘a_b’ 保持原样 (org-export-with-sub-superscripts)。

arch

设置已归档子树的导出方式。设为 headline 时仅导出标题忽略内容 (org-export-with-archived-trees)。

author

切换是否在导出文件中包含作者名 (org-export-with-author)。

expand-links

切换是否展开文件路径中的环境变量 (org-export-expand-links)。

broken-links

切换发现无效内部链接时是否继续导出。设为 mark 时会在输出中明显标记问题链接 (org-export-with-broken-links)。

c

切换是否包含 ‘CLOCK’ 关键字 (org-export-with-clocks)。

creator

切换是否在导出文件中包含生成程序信息 (org-export-with-creator)。

d

切换是否包含抽屉,或指定包含/排除的抽屉列表 (org-export-with-drawers)。

date

切换是否在导出文件中包含日期 (org-export-with-date)。

e

切换是否包含实体字符 (org-export-with-entities)。

email

切换是否在导出文件中包含作者邮箱 (org-export-with-email)。

f

切换是否包含脚注 (org-export-with-footnotes)。

H

设置导出时仍作为标题的最低层级 (org-export-headline-levels)。低于该层级的标题在多数后端中会转为列表项。

inline

切换是否包含内联任务 (org-export-with-inlinetasks)。

num

切换章节编号 (org-export-with-section-numbers)。设为数字 N 时仅对 N 级及以上标题编号。将 ‘UNNUMBERED’ 属性设为非 nil 可完全禁用标题编号;若值为 ‘notoc’ ,该标题及其子项也不会出现在目录中(见 Table of Contents)。

p

切换是否导出计划信息 (org-export-with-planning)。计划信息指标题下方包含 ‘SCHEDULED’ 、 ‘DEADLINE’ 、 ‘CLOSED’ 等标记的行。

pri

切换是否包含优先级标记 (org-export-with-priority)。

prop

切换是否包含属性抽屉,或指定要包含的属性 (org-export-with-properties)。

stat

切换是否包含统计标记 (org-export-with-statistics-cookies)。

tags

切换是否包含标签,也可设为 not-in-toc (org-export-with-tags)。

tasks

切换是否包含任务(TODO 项); nil 移除所有任务; todo 移除已完成任务;或指定保留的关键字列表 (org-export-with-tasks)。

tex

nil 不导出; t 正常导出; verbatim 全部按原样保留 (org-export-with-latex)。

timestamp

切换是否在导出文件中包含创建时间 (org-export-timestamp-file)。

title

切换是否包含标题 (org-export-with-title)。

toc

切换是否包含目录,或设置层级限制 (org-export-with-toc)。

todo

切换是否在导出文本中包含 TODO 关键字 (org-export-with-todo-keywords)。

|

切换是否包含表格 (org-export-with-tables)。

导出子树时,特殊节点属性可覆盖以上关键字。这类属性以 ‘EXPORT_’ 为前缀,例如 ‘DATE’ 在子树中对应 ‘EXPORT_DATE’ 。除 ‘SETUPFILE’ 外,其余关键字均有对应的 ‘EXPORT_’ 属性。

org-export-allow-bind-keywordsnil ,可通过 ‘BIND’ 关键字在导出时将 Emacs 变量设为缓冲区局部变量,语法为 ‘#+BIND: variable value’ ,适用于无法通过关键字修改的缓冲区设置。


13.3 Table of Contents

目录包含文档中所有标题,深度与文件标题层级一致。如需修改深度或关闭目录,可设置 org-export-with-toc 变量;单文件内可在 ‘OPTIONS’ 关键字中使用 ‘toc’ 项实现相同效果:

#+OPTIONS: toc:2          (目录只包含两级标题)
#+OPTIONS: toc:nil        (完全不生成默认目录)

目录中会包含带编号与无编号标题131。如需排除某个无编号标题及其所有子项,将 ‘UNNUMBERED’ 属性设为 ‘notoc’ 。

* Subtree not numbered, not in table of contents either
  :PROPERTIES:
  :UNNUMBERED: notoc
  :END:

Org 默认将目录置于导出文档开头。如需移动目录位置,先通过 org-export-with-toc 或 ‘#+OPTIONS: toc:nil’ 关闭默认目录,再在目标位置插入 ‘#+TOC: headlines N’ 。

#+OPTIONS: toc:nil
...
#+TOC: headlines 2

为文档特定部分设置目录深度,可附加 ‘local’ 参数,表示相对于当前层级的深度。下例插入只包含直接子项的局部目录:

* Section
#+TOC: headlines 1 local

注意在 LaTeX 导出中此功能需要 titletoc 包,且因兼容性问题必须在 hyperref 之 加载,可自定义 org-latex-default-packages-alist

下例插入链接到指定目标子项的目录:

* Target
  :PROPERTIES:
  :CUSTOM_ID: TargetSection
  :END:
** Heading A
** Heading B
* Another section
#+TOC: headlines 1 :target #TargetSection

:target’ 属性在 HTML、Markdown、ODT、ASCII 导出中支持。

可使用 ‘TOC’ 关键字生成带标题的图表清单或代码清单:

#+TOC: listings
#+TOC: tables

Org 默认使用标题文本作为目录项,通过 ‘ALT_TITLE’ 属性可指定目录中显示的不同名称。


13.4 Include Files

导出过程中 可以插入其他文件内容。例如插入 ‘.emacs’ 文件可使用:

#+INCLUDE: "~/.emacs" src emacs-lisp

INCLUDE 关键字后有三个位置参数:

  1. 文件名,唯一必选参数。Org 不做正确性与内容校验。
  2. 用于包裹内容的块名称。若为 ‘example’ 、 ‘export’ 、 ‘src’ ,内容会通过 org-escape-code-in-string 转义。可使用任意块名,但以 ‘:’ 开头的块名需要加引号,如 ‘":name"’ 。
  3. 代码高亮使用的语言,仅对 ‘export’ 和 ‘src’ 类型有效。

如果插入的文件未指定标记语言,Org 会默认将其视为 Org 格式并照常处理,仅有少数例外情况。Org 会让插入文件中的脚注标记(见 Creating Footnotes)仅在该文件内有效。插入文件的内容归属于包含 ‘INCLUDE’ 关键字的同一结构—标题、列表项等。具体来说,文件内的标题会成为当前章节的子标题。可以通过附加关键字参数 ‘:minlevel’ 改变这一行为,它会将插入文件中的标题整体提升为最低层级。例如,下面的语法会让插入文件与当前顶层标题成为同级标题:

#+INCLUDE: "~/my-book/chapter2.org" :minlevel 1

使用 ‘:lines’ 参数可只插入文件部分行,范围为左闭右开区间,起止值可省略以使用默认值。

#+INCLUDE: "~/.emacs" :lines "5-10"插入第 5–9 行
#+INCLUDE: "~/.emacs" :lines "-10"插入第 1–9 行
#+INCLUDE: "~/.emacs" :lines "10-"从第 10 行插入到文件末尾

可使用文件链接提取 org-link-search 匹配的对象132(见 Search Options in File Links)。 ‘:lines’ 范围相对于目标元素,因此:

#+INCLUDE: "./paper.org::*conclusion" :lines "1-20"

会插入标题 ‘conclusion’ 下的前 20 行。

将 ‘:only-contents’ 设为非 nil 可只提取匹配对象的正文内容,忽略计划行与属性抽屉。例如插入自定义 ID 为 ‘theory’ 的标题正文:

#+INCLUDE: "./paper.org::#theory" :only-contents t

以下命令可跳转到插入文件:

C-c ' (org-edit-special)

访问光标处的插入文件。


13.5 Macro Replacement

宏在导出时替换文本片段133。宏可全局定义在 org-export-global-macros 中,或在文档内按以下语法定义:

#+MACRO: name   replacement text; $1, $2 are arguments
#+MACRO: name   替换文本;$1、$2 为参数

通过 ‘{{{name(arg1, arg2)}}}134 引用。例如:

#+MACRO: poem Rose is $1, violet's $2. Life's ordered: Org assists you.
{{{poem(red,blue)}}}

导出后变为:

Rose is red, violet's blue.  Life's ordered: Org assists you.

特殊规则:替换文本以 ‘(eval’ 开头时,Org 会将其作为 Emacs Lisp 表达式执行,参数自动转为字符串。例如下方宏:

#+MACRO: gnustamp (eval (concat "GNU/" (capitalize $1)))

导出时会将 ‘{{{gnustamp(linux)}}}’ 转为 ‘GNU/Linux’ 。

Org 在以下位置识别宏引用:段落、标题、verse 块、表格单元格、列表,以及 ‘CAPTION’ 、 ‘TITLE’ 、 ‘AUTHOR’ 、 ‘DATE’ 等关键字和部分后端导出选项。

Org 内置以下预定义宏:

{{{keyword(NAME)}}}
{{{title}}}
{{{author}}}
{{{email}}}

keyword’ 宏收集缓冲区中所有 NAME 关键字的值并用空格分隔。 ‘title’ 、 ‘author’ 、 ‘email’ 分别是 ‘{{{keyword(TITLE)}}}’ 、 ‘{{{keyword(AUTHOR)}}}’ 、 ‘{{{keyword(EMAIL)}}}’ 的简写。

{{{date}}}
{{{date(FORMAT)}}}

该宏对应 ‘DATE’ 关键字。FORMAT 是 ‘date’ 宏的可选参数,仅当 ‘DATE’ 为单个时间戳时生效。FORMAT 必须是 format-time-string 能够识别的格式字符串。

{{{time(FORMAT)}}}
{{{modification-time(FORMAT, VC)}}}

这些宏分别对应文档的导出日期时间和修改日期时间。FORMATformat-time-string 可以识别的字符串。如果 modification-time 宏的第二个参数不为 nil ,Org 会通过 ‘vc.el’ 从版本控制系统中获取文档的修改时间;否则,Org 将读取文件属性。

{{{input-file}}}

指向当前导出文件的文件名。

{{{property(PROPERTY-NAME)}}}
{{{property(PROPERTY-NAME, SEARCH OPTION)}}}

该宏返回当前条目中 PROPERTY-NAME 属性的值。如果 SEARCH-OPTION(见 Search Options in File Links)指向一个外部条目,则使用该外部条目的属性。

{{{n}}}
{{{n(NAME)}}}
{{{n(NAME, ACTION)}}}

该宏用于实现自定义计数器,返回导出当前缓冲区时该宏已被展开的次数。你可以使用不同的 NAME 值创建多个计数器。若 ACTION 为 ‘-’ ,则保持计数器上一次的值不变,即不递增指定计数器。若该值为数字,则将对应计数器设为该数值。若为其他非空字符串,则将对应计数器重置为 1。你可以留空 NAME 以重置默认计数器。

此外,行内代码块(见 Structure of Code Blocks)使用专用 ‘results’ 宏标记输出,不建议用户重新定义,除非明确知晓后果。

org-hide-macro-markers 设为非 nil 可隐藏宏两侧的括号。

Org 在导出流程最开始执行宏展开。


13.6 Comment Lines

以任意空白字符开头、后跟 ‘#’ 和空格的行视为注释,不会导出。

同样,注释块 ‘#+BEGIN_COMMENT’ … ‘#+END_COMMENT’ 不会导出。135

最后,在条目开头、其他关键字或优先级标记之后放置 ‘COMMENT’ 关键字,可将整个子树标记为注释。这种情况下,该子树不会被导出,其内部的代码块也不会被执行或 tangle 136。下面的命令可用于切换标题的注释状态。

C-c ; (org-toggle-comment)

切换条目开头的 ‘COMMENT’ 关键字。


13.7 ASCII/Latin-1/UTF-8 export

ASCII 导出生成仅含纯 ASCII 字符的输出文件,是最简单直接的纯文本输出,不包含任何 Org 标记。Latin-1 和 UTF-8 导出使用对应编码标准中的额外字符与符号。三种格式均为最基础文本输出,兼容性最强。

导出时 Org 会根据 org-ascii-text-width 设置的文本宽度自动换行与对齐。

Org 以类脚注样式导出链接:描述文本保留在正文中,链接地址放在下一个标题前的注释中,详见 org-ascii-links-to-notes

ASCII export commands

C-c C-e t a (org-ascii-export-to-ascii), C-c C-e t l, C-c C-e t u

导出为后缀 ‘.txt’ 的 ASCII 文件。 ‘myfile.org’ 导出为 ‘myfile.txt’ ,无警告覆盖;若原文件为 ‘myfile.txt’ ,则导出为 ‘myfile.txt.txt’ 避免数据丢失。

C-c C-e t A (org-ascii-export-to-ascii), C-c C-e t L, C-c C-e t U

导出到临时缓冲区,不生成文件。

ASCII specific export settings

ASCII 导出后端额外支持一个关键字用于自定义输出,设置方式与通用选项类似(见 Export Settings)。

SUBTITLE

文档副标题。长副标题可使用多行 ‘#+SUBTITLE’ ,Org 会连续打印并自动换行。

Header and sectioning structure

ASCII 导出时前三层大纲转为标题,更低层级转为列表。修改层级分界点见 Export Settings

Quoting ASCII text

在 Org 文件中插入仅 ASCII 后端识别的文本,可使用行内、关键字或导出块写法:

段落内的行内文本 @@ascii:and additional text@@。

#+ASCII: Some text

#+BEGIN_EXPORT ascii
仅在使用 ASCII 后端导出时输出此块内容
#+END_EXPORT

ASCII specific attributes

ASCII 后端仅识别一个属性 ‘:width’ ,用于 指定水平分隔线的字符宽度。设置宽度的关键字与语法为:

#+ATTR_ASCII: :width 10
-----

ASCII special blocks

除 ‘#+BEGIN_CENTER’ 块外(见 Paragraphs),ASCII 后端还支持以下两种左对齐与右对齐块:

#+BEGIN_JUSTIFYLEFT
It's just a jump to the left...
#+END_JUSTIFYLEFT

#+BEGIN_JUSTIFYRIGHT
...and then a step to the right.
#+END_JUSTIFYRIGHT

13.8 Beamer Export

Org 通过 Beamer 导出功能将 Org 文件树形结构转换为高质量的交互式演示幻灯片(presentations)。 Beamer 是一种 LaTeX 文档类,用于创建 PDF、HTML 等常用格式的演示文稿。

强烈建议在阅读本章其余内容前先熟悉 Beamer 相关术语。 参见 https://en.wikipedia.org/wiki/Beamer_(LaTeX) 及其引用资料。


13.8.1 Beamer export commands

C-c C-e l b (org-beamer-export-to-latex)

导出为扩展名为 ‘.tex’ 的 LaTeX 文件。若原文件为 ‘myfile.org’ , Org 将导出为 ‘myfile.tex’ ,并直接覆盖且无提示。

C-c C-e l B (org-beamer-export-as-latex)

导出至临时缓冲区,不生成文件。

C-c C-e l P (org-beamer-export-to-pdf)

导出为 LaTeX 文件并转换为 PDF 格式。

C-c C-e l O

导出为 LaTeX 文件并转换为 PDF 格式,随后打开该 PDF 文件。


13.8.2 Beamer specific export settings

Beamer 导出后端提供若干额外关键字用于自定义 Beamer 输出。 这些关键字的用法与常规导出选项设置类似(见 Export Settings)。

BEAMER_THEME

Beamer 布局主题 (org-beamer-theme)。使用方括号指定选项。示例:

#+BEAMER_THEME: Rochester [height=20pt]
BEAMER_FONT_THEME

Beamer 字体主题。

BEAMER_INNER_THEME

Beamer 内部主题。

BEAMER_OUTER_THEME

Beamer 外部主题。

BEAMER_HEADER

插入到导言区、恰好位于 ‘hyperref’ 设置之前的任意代码行。

DESCRIPTION

文档描述。长描述可使用多行 ‘DESCRIPTION’ 关键字。 默认情况下, ‘hyperref’ 会将 ‘DESCRIPTION’ 作为元数据插入。 可通过 org-latex-hyperref-template 配置文档元数据, 通过 org-latex-title-command 配置将描述排版至封面部分。

KEYWORDS

定义文档内容的关键词。必要时可使用多行 ‘KEYWORDS’ 。 默认情况下, ‘hyperref’ 会将 ‘KEYWORDS’ 作为元数据插入。 可通过 org-latex-hyperref-template 配置文档元数据, 通过 org-latex-title-command 配置将关键词排版至封面部分。

SUBTITLE

文档副标题。排版格式可通过 org-beamer-subtitle-format 字符串设置。 可通过 org-latex-hyperref-template 配置文档元数据, 通过 org-latex-title-command 配置将副标题排版至封面部分。


13.8.3 Frames and Blocks in Beamer

Org 会将标题层级转换为 Beamer 的章节元素、框架与块。 任何嵌套层级不太深的 Org 树形结构原则上均可导出为 Beamer 演示文稿。

  • 当 Org 中的标题层级等于 org-beamer-frame-level 或 ‘OPTIONS’ 行中的 ‘H’ 值时(见 Export Settings), Org 标题会转为 Beamer 框架。

    若 Org 遇到 ‘BEAMER_ENV’ 属性被设为 ‘frame’ 或 ‘fullframe’ , 则会忽略该标题所在子树的 org-beamer-frame-level 设置, 强制将对应标题转为框架。在 Beamer 术语中,全屏框架是不带标题的框架。

  • Org 将 Beamer 框架内的内容以块环境形式导出。 当设置 ‘BEAMER_ENV’ 属性时,可强制将内容包裹为特定块类型137。 有效值参见 org-beamer-environments-default ,如需添加更多类型可参考 org-beamer-environments-extra
  • 若 ‘BEAMER_ENV’ 设为 ‘appendix’ ,Org 会将该项导出为附录。 设为 ‘note’ 时,该项会根据标题层级导出为框架内或框架间的注释。 设为 ‘noteNH’ 时,导出为不带标题的注释。 设为 ‘againframe’ 时,Org 使用 ‘\againframe’ 命令导出该项, 此时必须设置 ‘BEAMER_REF’ 属性,因为 ‘\againframe’ 需要指定要恢复的框架。

    设为 ‘ignoreheading’ 时,导出时会忽略标题但保留内容, 常用于在框架之间插入内容,也可用于正确关闭 ‘column’ 环境。

    若设置 ‘BEAMER_SUBTITLE’ ,其值会作为该标题对应框架的副标题导出。 该属性对未导出为框架的标题无效。

    为标题设置 ‘BEAMER_ACT’ 后,导出时会将其转为叠加或动作说明。 若用方括号包裹,则作为默认叠加说明。 使用 ‘BEAMER_OPT’ 可设置适用于当前 Beamer 框架或块的任意选项, 导出后端会自动添加合适的尖括号或方括号,并对可能需要逐字环境的代码自动添加 ‘fragile’ 选项。

    要在 Beamer 幻灯片中创建列,可在 Org 文件的对应标题上使用 ‘BEAMER_COL’ 属性。 将其值设为表示总文本宽度占比的小数,导出时会据此设置列宽并以该 Org 条目内容填充列。 若该条目未定义特定环境,则导出时忽略该标题;若已定义环境,则将标题作为列标题。 Beamer 导出会自动处理相邻标题对应的 LaTeX 列间距。如需手动调整特殊布局,可使用 ‘BEAMER_ENV’ 属性。


13.8.4 Beamer specific syntax

由于 Org 的 Beamer 导出后端基于 LaTeX 后端扩展而来,因此也支持其他 LaTeX 专用语法, 例如 ‘#+LATEX:’ 或 ‘#+ATTR_LATEX:’ ,详见 LaTeX Export

使用 ‘toc:t’ 的 ‘OPTION’ 关键字生成的目录会被 Beamer 导出包裹在 ‘frame’ 环境中。 使用 ‘TOC’ 关键字生成的目录则不会被包裹(见 Table of Contents)。 使用方括号指定选项。

#+TOC: headlines [currentsection]

可通过以下结构插入 Beamer 专用代码:

#+BEAMER: \pause

#+BEGIN_EXPORT beamer
  Only Beamer export backend exports this.
#+END_EXPORT

Text @@beamer:some code@@ within a paragraph.

类似上面最后一种的行内语法,可用于为 bolditemlinkradio-targettarget 等类型对象添加叠加说明。 将值用尖括号包裹并放在对象开头,示例如下:

A *@@beamer:<2->@@useful* feature

Beamer 导出识别 ‘ATTR_BEAMER’ 关键字及其以下 Beamer 配置属性: ‘:environment’ 用于修改局部 Beamer 环境, ‘:overlay’ 用于以尖括号或方括号指定 Beamer 叠加效果, ‘:options’ 用于插入可选参数。

#+ATTR_BEAMER: :environment nonindentlist
- item 1, not indented
- item 2, not indented
- item 3, not indented
#+ATTR_BEAMER: :overlay <+->
- item 1
- item 2
#+ATTR_BEAMER: :options [Lagrange]
Let $G$ be a finite group, and let $H$ be
a subgroup of $G$.  Then the order of $H$ divides the order of $G$.

13.8.5 Editing support

Org Beamer 模式是专门用于快速编辑 Beamer 文档的次要模式。

#+STARTUP: beamer
C-c C-b (org-beamer-select-environment)

Org Beamer 模式提供该快捷键,用于快速选择 Beamer 标准环境并设置 ‘BEAMER_COL’ 属性。


13.8.6 A Beamer example

以下是一个可直接用于 Beamer 导出的 Org 文档示例。

#+TITLE: Example Presentation
#+AUTHOR: Carsten Dominik
#+OPTIONS: H:2 toc:t num:t
#+LATEX_CLASS: beamer
#+STARTUP: beamer
#+LATEX_CLASS_OPTIONS: [presentation]
#+BEAMER_THEME: Madrid
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col)

* This is the first structural section

** Frame 1
*** Thanks to Eric Fraga                                           :B_block:
    :PROPERTIES:
    :BEAMER_COL: 0.48
    :BEAMER_ENV: block
    :END:
    for the first viable Beamer setup in Org
*** Thanks to everyone else                                        :B_block:
    :PROPERTIES:
    :BEAMER_COL: 0.48
    :BEAMER_ACT: <2->
    :BEAMER_ENV: block
    :END:
    for contributing to the discussion
**** This will be formatted as a beamer note                       :B_note:
     :PROPERTIES:
     :BEAMER_env: note
     :END:
** Frame 2 (where we will not use columns)
*** Request
    Please test this stuff!

13.9 HTML Export

Org mode 包含一款 HTML 导出器,支持丰富的 HTML 格式,兼容 XHTML 1.0 严格标准。


13.9.1 HTML export commands

C-c C-e h h (org-html-export-to-html)

导出为后缀为 ‘.html’ 的 HTML 文件。对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.html’ ,覆盖时不会提示。C-c C-e h o 会导出 HTML 并在网页浏览器中打开该文件。

C-c C-e h H (org-html-export-as-html)

导出到临时缓冲区,不会创建文件。


13.9.2 HTML specific export settings

HTML 导出提供了若干关键字,用法与 Export Settings 中介绍的常规选项设置类似。

DESCRIPTION

文档描述信息,HTML 导出器会将其作为 HTML meta 标签插入到 HTML 文件中。描述内容较长时可使用多行 ‘DESCRIPTION’ ,导出器会自动处理换行。

导出器还会包含其他若干 meta 标签,可通过修改 org-html-meta-tags 进行自定义。

HTML_DOCTYPE

指定文档类型,例如 HTML5 (org-html-doctype)。

HTML_CONTAINER

指定用于包裹章节与元素的 HTML 容器,例如 ‘div’ (org-html-container-element)。

HTML_LINK_HOME

主页链接对应的 URL (org-html-link-home)。

HTML_LINK_UP

已导出 HTML 页面的上级链接 URL (org-html-link-up)。

HTML_MATHJAX

MathJax 相关选项 (org-html-mathjax-options)。MathJax 用于在 HTML 文档中排版 LaTeX 数学公式。示例见 Math formatting in HTML export

HTML_HEAD

追加到 HTML 文档头部的自定义内容 (org-html-head)。

HTML_HEAD_EXTRA

追加到 HTML 文档头部的更多自定义内容 (org-html-head-extra)。

KEYWORDS

用于描述文档内容的关键词。HTML 导出器会将这些关键词作为 HTML meta 标签插入。关键词较长时可使用多行 ‘KEYWORDS’ 。

LATEX_HEADER

追加到导言区的自定义内容;在将 LaTeX 片段转码为图片时,HTML 导出器会一并使用该内容(见 Math formatting in HTML export)。

SUBTITLE

文档副标题。当文档类型为 ‘HTML5’ 且 CSS 中包含 ‘subtitle’ 类时,HTML 导出器会对副标题进行格式化。

本手册后续章节会对其中部分关键字做更详细说明。


13.9.3 HTML doctypes

Org 可导出为多种 (X)HTML 变体。

通过设置 org-html-doctype 变量可选择不同 (X)HTML 变体。导出器会根据所选变体自动调整 HTML 转换语法。Org 内置以下预设变体:

  • "html4-strict"
  • "html4-transitional"
  • "html4-frameset"
  • "xhtml-strict"
  • "xhtml-transitional"
  • "xhtml-frameset"
  • "xhtml-11"
  • "html5"
  • "xhtml5"

详情见变量 org-html-doctype-alist ,默认值为 "xhtml-strict"

Org 的 HTML 导出器默认不启用 HTML5 标准新增的块级元素。如需启用,可将 org-html-html5-fancy 设置为非 nil ,或在文件中通过 ‘OPTIONS’ 行设置 ‘html5-fancy’ 。

HTML5 文档支持任意 ‘#+BEGIN’ … ‘#+END’ 块,示例:

#+BEGIN_aside
  Lorem ipsum
#+END_aside

导出结果为:

<aside>
  <p>Lorem ipsum</p>
</aside>

而如下代码:

#+ATTR_HTML: :controls controls :width 350
#+BEGIN_video
#+HTML: <source src="movie.mp4" type="video/mp4">
#+HTML: <source src="movie.ogg" type="video/ogg">
Your browser does not support the video tag.
#+END_video

导出结果为:

<video controls="controls" width="350">
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  <p>Your browser does not support the video tag.</p>
</video>

当特殊块没有对应的 HTML5 元素时,HTML 导出器会使用标准转换方式(见 org-html-html5-elements )。例如 ‘#+BEGIN_lederhosen’ 会导出为 <div class="lederhosen">

特殊块不能包含标题。若要让 HTML 导出器将标题及其内容用 <section><article> 标签包裹,可为标题设置 ‘HTML_CONTAINER’ 属性。


13.9.4 HTML preamble and postamble

HTML 导出器支持分别设置页眉与页脚。 org-html-preamble 默认值为 t ,表示导出器会插入页眉。格式字符串见变量 org-html-preamble-format

org-html-preamble 设置为字符串可覆盖默认格式;若设置为函数,HTML 导出器会执行该函数并将返回字符串作为页眉内容。若设为 nil ,则不生成页眉。

上述规则同样适用于 org-html-postambleorg-html-postamble-format 。此外, org-html-postamble 可设为 auto (默认值),导出器会自动根据作者姓名、邮箱、创建工具与日期生成页脚。


13.9.5 Exporting to minimal HTML

如需输出不含 CSS、JavaScript、页眉与页脚的极简 HTML 文件,需设置以下变量:

(setq org-html-head ""
      org-html-head-extra ""
      org-html-head-include-default-style nil
      org-html-head-include-scripts nil
      org-html-preamble nil
      org-html-postamble nil
      org-html-use-infojs nil)

13.9.6 Quoting HTML tags

HTML 导出后端会将 ‘<’ 与 ‘>’ 分别转换为 ‘&lt;’ 与 ‘&gt;’ 。如需在 Org 文件中插入原始 HTML 代码并直接输出,可使用行内语法 ‘@@html:...@@’ ,示例:

@@html:<b>@@bold text@@html:</b>@@

对于较长的 HTML 代码块,可使用以下 HTML 导出代码块:

#+HTML: Literal HTML code for export

#+BEGIN_EXPORT html
  All lines between these markers are exported literally
#+END_EXPORT

13.9.7 Headlines in HTML export

标题会导出为 ‘<h1>’ 、 ‘<h2>’ 等标签。每个标题的 ‘id’ 属性取自 ‘CUSTOM_ID’ 属性,若无则自动生成唯一值,详见 Internal Links

标题可包含指向自身的链接,启用方式如下:

  • 将变量 org-html-self-link-headlines 设置为非 nil
  • 在 Org 文件中使用 html-self-link-headlines 选项
    #+OPTIONS: html-self-link-headlines:t
    

启用后,标题文本会被包裹在 ‘<a>’ 标签中,标签的 ‘href’ 属性指向标题自身,实现自链接。


13.9.9 Tables in HTML export

HTML 导出后端在将 Org 表格导出为 HTML 时会使用 org-html-table-default-attributes 。默认情况下导出器不绘制框架与单元格边框。如需为单个表格修改设置,可在表格前添加如下内容:

#+CAPTION: This is a table with lines around and between cells
#+ATTR_HTML: :border 2 :rules all :frame border

注意在 HTML5 中表格属性已被弃用,推荐使用 CSS 替代。当文档类型设为 HTML5 时(见 HTML doctypes),Org 会忽略 org-html-table-default-attributes 。 ‘#+ATTR_HTML:’ 仍生效但不建议使用。

HTML 导出后端会保留 Org 表格中的列分组设置(见 Column Groups)。

以下为 HTML 表格导出的更多自定义选项:

org-html-table-align-individual-fields

nil 时为每个表格单元格添加对齐相关样式属性。

org-html-table-caption-above

nil 时将标题置于表格开头。

org-html-table-data-tags

表格数据单元格的起始与结束标签。

org-html-table-default-attributes

表格标签的默认属性与取值。

org-html-table-header-tags

表格表头单元格的起始与结束标签。

org-html-table-row-tags

表格行的起始与结束标签。

org-html-table-use-header-tags-for-first-column

nil 时将表格首列使用表头标签格式化。


13.9.10 Images in HTML export

HTML 导出后端可将 Org 图片链接转换为 HTML 行内图片与可点击图片链接。

当 Org 文件中的链接无描述文本时,HTML 导出后端默认会将其行内显示为图片。例如 ‘[[file:myimg.jpg]]’ 会直接显示图片,而 ‘[[file:myimg.jpg][the image]]’ 则显示为文本链接。详情见变量 org-html-inline-images

若 Org 链接的描述部分本身是另一个指向图片的 ‘file:’ 或 ‘https:’ 链接(具体规则由 org-html-inline-image-rules 定义),HTML 导出后端会行内显示该图片并链接到原图。该语法可实现低分辨率缩略图指向高分辨率原图,示例:

[[file:highres.jpg][file:thumb.jpg]]

如需修改行内图片属性,可在 Org 文件中使用 ‘#+ATTR_HTML’ 行。下例将图片右对齐,并添加 alttitle 属性以适配文本阅读器与现代网页无障碍标准。

#+CAPTION: A black cat stalking a spider
#+ATTR_HTML: :alt cat/spider image :title Action! :align right
[[./img/a.jpg]]

HTML 导出后端会原样保留 Org 文件中的 ‘http’ 链接。


13.9.11 Math formatting in HTML export

LaTeX 数学片段(见 LaTeX fragments)可通过两种方式在 HTML 页面显示。默认使用 MathJax,在 Org 中可直接使用138139。部分 MathJax 选项可通过 org-html-mathjax-options 或缓冲区设置,例如下列配置:

#+HTML_MATHJAX: align: left indent: 5em tagside: left

可将公式编号显示在左侧,公式距左边缘 5em。

如需使用本地 MathJax,可通过 ‘path’ 选项指定:

#+HTML_MATHJAX: path:the/path/to/mathjax.js

所有支持的变量见 org-html-mathjax-options 的文档字符串。MathJax 模板可通过 org-html-mathjax-template 配置。

也可选择将 LaTeX 片段处理为小图片插入浏览器页面。在 MathJax 出现前,这是 Org 文件的默认方式。该方式需要系统安装 dvipng、dvisvgm 或 ImageMagick 套件,启用方式为:

#+OPTIONS: tex:dvipng
#+OPTIONS: tex:dvisvgm

#+OPTIONS: tex:imagemagick

13.9.12 Text areas in HTML export

在 Org mode Babel 出现之前,在 HTML 中发布代码常用 ‘:textarea’ 实现。该方式的优势是浏览器内置简单 JavaScript 命令即可方便复制粘贴,甚至可在粘贴前编辑内容。

HTML 导出后端可创建此类文本域,需要在示例块或源代码块前添加包含 ‘:textarea’ 选项的 ‘#+ATTR_HTML’ 行,其他 Org 块类型不支持该选项。

默认情况下 HTML 导出后端创建的文本域宽度为 80 字符,高度自适应内容。可通过 ‘#+ATTR_HTML’ 行的 ‘:width’ 与 ‘:height’ 选项覆盖默认值。

#+ATTR_HTML: :textarea t :width 40
#+BEGIN_EXAMPLE
  (defun org-xor (a b)
     "Exclusive or."
     (if a (not b) b))
#+END_EXAMPLE

13.9.13 CSS support

可自定义导出文件的 CSS 样式。HTML 导出器会为文档相应部分分配以下专用 CSS 类140,你可修改这些样式,也可使用标题、表格等标准类。

p.author作者信息(含邮箱)
p.date发布日期
p.creator创建工具信息(含 Org mode 版本)
.title文档标题
.subtitle文档副标题
.todoTODO 关键字,所有未完成状态
.doneDONE 关键字,所有已完成状态
.WAITING每个 TODO 关键字会使用自身名称作为类名
.timestamp时间戳
.timestamp-kwd与时间戳关联的关键字,如 ‘SCHEDULED
.timestamp-wrapper包裹关键字与时间戳的层
.tag标题中的标签
._HOME每个标签使用自身名称作为类名,“@” 替换为 “_”
.target链接目标
.linenr代码示例中的行号
.code-highlighted用于高亮引用代码行
div.outline-N第 N 级大纲的框架(标题+正文)
div.outline-text-N第 N 级大纲正文的额外框架
.section-number-N标题中的章节编号,按层级区分
.figure-number图表编号标签,如 “Figure 1:”
.table-number表格编号标签,如 “Table 1:”
.listing-number代码清单编号标签,如 “Listing 1:”
div.figure行内图片的格式化方式
pre.src格式化源代码
pre.example普通示例内容
p.verse诗歌段落
div.footnotes脚注区域标题
p.footnote脚注定义段落
.footref脚注引用编号(始终为 <sup>)
.footnum脚注定义中的编号(始终为 <sup>)
.org-svg链接 ‘.svg’ 图片的默认类名

HTML 导出后端会在每个导出的 HTML 文件中嵌入精简的默认样式。如需使用其他样式覆盖默认样式,可在 Org 文件中使用以下关键字,它们会替换导出器的全局默认样式。

#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="style1.css" />
#+HTML_HEAD_EXTRA: <link rel="alternate stylesheet" type="text/css" href="style2.css" />

To just turn off the default style, customize 如需仅关闭默认样式,可自定义 org-html-head-include-default-style 变量,或在 Org 文件中使用如下选项行:

#+OPTIONS: html-style:nil

对于较长的样式定义,可使用多行 ‘HTML_HEAD’ 与 ‘HTML_HEAD_EXTRA’ 关键字,或用 <style> ... </style> 块包裹,两种方式均可避免依赖外部文件。

如需为子树添加样式,可使用 ‘HTML_CONTAINER_CLASS’ 属性为该子树分配类名。如需为特定标题指定 CSS 样式,可使用 ‘CUSTOM_ID’ 属性中的 ID;也可通过 ‘HTML_HEADLINE_CLASS’ 属性为标题分配专属类名。

请勿修改 org-html-style-default 常量,建议使用上述更简便的自定义方式。


13.9.14 JavaScript supported display of web pages

Sebastian Rose 专门为 Org 生成的 HTML 文件编写了一款 JavaScript 脚本,支持两种浏览方式。一种是类 Info 模式,每次只单独显示一个章节,可通过 np 等按键导航,按 ? 查看可用按键说明。另一种是折叠视图,与 Org 在 Emacs 内的展示方式类似。该脚本可在 https://orgmode.org/org-info.js 获取,文档见 https://orgmode.org/worg/code/org-info-js/。脚本托管在 https://orgmode.org,但为稳定起见建议部署在自己的服务器上。

如需使用该脚本,只需在 Org 文件中添加如下行:

#+INFOJS_OPT: view:info toc:nil

HTML 头部会自动加入调用该脚本所需代码。选项设置语法如上,支持的选项如下:

path:

脚本路径。默认从 https://orgmode.org/org-info.js 加载,也可使用本地副本,例如 ‘../scripts/org-info.js’ 。

view:

页面初始显示模式,可选值:

info类 Info 界面,每页一个章节
overview折叠界面,初始仅显示顶层章节
content折叠界面,初始显示所有标题
showall折叠界面,显示所有标题与正文
sdepth:

Info 模式与折叠模式中独立章节的最大标题层级。默认取自 org-export-headline-levels ,即 ‘OPTIONS’ 中的 ‘H’ 开关。若该值小于 org-export-headline-levels ,单个 Info/折叠章节仍可包含子标题。

toc:

目录是否 初始 可见。即使设为 ‘nil’ ,也可通过 i 显示目录。

tdepth:

目录层级。默认取自变量 org-export-headline-levelsorg-export-with-toc

ftoc:

页面 CSS 是否为 “目录(toc)” 设置固定定位?若是,目录会以章节形式展示。

ltoc:

是否在每个章节内显示简短子内容?设为 ‘above’ 可将该内容置于章节正文上方。

mouse:

鼠标悬停在标题上时的高亮效果,默认为 ‘underline’ ,也可使用背景色如 ‘#cccccc’ 。

buttons:

是否在各处显示视图切换按钮?默认 ‘nil’ ,仅显示一个切换按钮。

可通过自定义 org-infojs-options 变量设置上述选项的默认值。若希望所有页面都启用该脚本,可配置 org-export-html-use-infojs 变量。


13.10 LaTeX Export

LaTeX 导出后端可处理复杂文档,支持加载标准或自定义 LaTeX 文档类,使用不同的 LaTeX 编译引擎生成文件,并输出包含索引、参考文献与目录的完整超链接 PDF 文件,适用于在线交互式查看或高质量印刷出版。

本节会详细介绍相关细节,急于上手的用户可快速参考以下变量:编译引擎参见 org-latex-compiler ;编译流程参见 org-latex-pdf-process ;宏包相关参见 org-latex-default-packages-alistorg-latex-packages-alist

关于 LaTeX 导出后端的重要说明:其对 Org 文档中的空行敏感,因为 LaTeX 本身依靠空行区分段落等语法结构。

后续小节默认用户熟悉常用 LaTeX 术语。可访问 https://tug.org/begin.html 了解 LaTeX 基础。已安装 LaTeX 的用户也可在终端执行 ‘texdoc latex’ 打开 LaTeX 入门文档141


13.10.1 LaTeX/PDF export commands

C-c C-e l l (org-latex-export-to-latex)

导出为扩展名为 ‘.tex’ 的 LaTeX 文件。若原文件为 ‘myfile.org’ ,Org 会直接导出为 ‘myfile.tex’ ,无提示覆盖已有文件。

C-c C-e l L (org-latex-export-as-latex)

导出到临时缓冲区,不创建实际文件。

C-c C-e l p (org-latex-export-to-pdf)

先导出为 LaTeX 文件,再转换为 PDF 文件。

C-c C-e l o

导出为 LaTeX 文件并转换为 PDF,随后使用默认阅读器打开该 PDF。

M-x org-export-region-as-latex

将选定区域按 Org 模式语法转换为 LaTeX 代码。这是全局命令,可在任意缓冲区中调用。

LaTeX 导出后端支持以下 LaTeX 编译引擎: ‘pdflatex’ 、 ‘xelatex’ 、 ‘lualatex’ 。这些引擎使用不同编译器、宏包与输出选项编译 LaTeX 文件。 LaTeX 导出后端会从 org-latex-compiler 变量或 Org 文件中的 ‘#+LATEX_COMPILER’ 关键字获取要使用的编译器版本。 如需配合特定编译器加载宏包,可查看 org-latex-default-packages-alist 的文档字符串。参考文献编译器可通过 org-latex-bib-compiler 设置142


13.10.2 LaTeX specific export settings

LaTeX 导出后端提供若干额外关键字用于自定义 LaTeX 输出,使用方式与通用选项类似(参见 Export Settings)。

DESCRIPTION

文档描述信息。hyperref 宏包会将描述、作者名、关键词及相关文件元数据插入输出文件。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面部分。长描述可使用多个 ‘DESCRIPTION’ 关键字。

LANGUAGE

文档主语言的语言代码。未指定 ‘LANGUAGE’ 关键字时,使用 org-export-default-language 的值(默认为 =en=,美式英语)。

Org 支持的语言代码列表保存在变量 org-latex-language-alist 中。

该设置生效需根据所用 LaTeX 编译器加载 ‘babel’ 或 ‘polyglossia’ 宏包,并传入对应语言参数。可通过修改 org-latex-packages-alist 变量实现,示例如下(注意 ‘polyglossia’ 不兼容 pdfLaTeX):

(add-to-list 'org-latex-packages-alist
             '("AUTO" "babel" t ("pdflatex" "xelatex" "lualatex")))
(add-to-list 'org-latex-packages-alist
             '("AUTO" "polyglossia" t ("xelatex" "lualatex")))
LATEX_CLASS

LaTeX 文档类,如 articlereportbook 等,包含预设导言区与标题层级映射,供 LaTeX 导出后端使用。后端从 org-latex-default-class 变量读取默认类名,Org 默认文档类为 article 。合法的默认类必须是 org-latex-classes 中的元素。

LATEX_CLASS_OPTIONS

LaTeX 导出后端调用文档类时使用的选项参数。

LATEX_COMPILER

用于生成 PDF 的编译器,如 ‘pdflatex’ 、 ‘xelatex’ 、 ‘lualatex’ ,参见 org-latex-compiler

LATEX_HEADER’, ‘LATEX_HEADER_EXTRA

向文档导言区添加的任意代码行,位于 hyperref 设置之前。可通过 org-latex-classes 调整 LaTeX 导言区的结构与顺序。

LATEX_CLASS_PRE

在 LaTeX 导言区前添加的任意代码行。

KEYWORDS

文档关键词。hyperref 宏包会将关键词与作者名、描述等元数据一同插入输出文件。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面。必要时可使用多行 ‘KEYWORDS’ 。

SUBTITLE

文档副标题,按 org-latex-subtitle-format 格式排版。若 org-latex-subtitle-separatenil ,副标题会排在 \title 宏之外。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面。

后续小节会提供更详细说明。


13.10.3 LaTeX header and sectioning structure

LaTeX 导出后端会将 Org 的前三层大纲转换为 LaTeX 标题,剩余层级导出为列表。如需全局修改层级与列表的分界点,参见 Export Settings

默认情况下,LaTeX 导出后端使用 article 文档类。

如需全局修改默认文档类,编辑 org-latex-default-class ;如需在单个 Org 文件中本地修改,添加选项行 ‘#+LATEX_CLASS: myclass’ ;如需仅对文件部分内容修改,为子树设置属性 ‘EXPORT_LATEX_CLASS’ 。此处填写的类名必须是 org-latex-classes 中的合法成员。 该变量为每个类定义导言区模板,导出工具会将 org-latex-default-packages-alistorg-latex-packages-alist 的值填入其中。可使用这三个变量定义自定义章节结构或文档类。

LaTeX 导出后端会将 ‘LATEX_CLASS_OPTIONS’ 关键字与 ‘EXPORT_LATEX_CLASS_OPTIONS’ 属性作为选项传递给 LaTeX 的 \documentclass 宏。选项及其语法(包括方括号包裹)遵循 LaTeX 规范。

#+LATEX_CLASS_OPTIONS: [a4paper,11pt,twoside,twocolumn]

LaTeX 导出后端会将 ‘LATEX_HEADER’ 与 ‘LATEX_HEADER_EXTRA’ 关键字的值追加到 LaTeX 导言区。 org-latex-classes 的文档字符串有更详细说明。另外注意,预览 LaTeX 代码片段时,LaTeX 导出后端不会追加 ‘LATEX_HEADER_EXTRA’ (参见 Previewing LaTeX fragments)。

包含上述导言区设置的 Org 文件示例:

#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [a4paper]
#+LATEX_HEADER: \usepackage{xyz}

* Headline 1
  some text
* Headline 2
  some more text

LaTeX 导出后端会将 ‘LATEX_CLASS_PRE’ 关键字的值添加在 LaTeX 导言区之前。当需要为文档类中包含的宏包设置传入参数时可使用该选项。例如,为 xcolor 宏包使用扩展颜色名称:

#+LATEX_CLASS_PRE: \PassOptionsToPackage{dvipsnames}{xcolor}

文档中也可加载 LaTeX 宏包 ‘babel’ 或 ‘polyglossia’ 。两种情况下,字符串“AUTO”都会被替换为文档中 ‘LANGUAGE’ 关键字的对应值(若存在),或 org-export-default-language 的值。下面分情况给出示例。

Babel’ 支持经典语法,同时也支持使用 ‘\babelprovide’ 命令的新语法,通过新的 ‘INI’ 文件方式加载语言。注意部分语言仅支持通过 babel 的 INI 文件提供,无法使用经典语法声明,只能通过 ‘\babelprovide’ 命令(参见 https://mirrors.ctan.org/macros/latex/required/babel/base/babel.pdf)。合法用法示例:

#+LATEX_HEADER: \usepackage[french,italian,AUTO]{babel}

其中 “AUTO” 为主要语言。也可使用 ‘\babelprovide’ 命令加载:

#+LATEX_HEADER: \usepackage[french,italian]{babel}
#+LATEX_HEADER: \babelprovide[import, main]{AUTO}

Polyglossia’ 生效需使用与 ‘babel’ 相同的经典语法(注意 这并非 polyglossia 原生语法)。例如,文档主语言为通用希腊语,次要语言为法语:

#+LANGUAGE: el-polyton
#+LATEX_HEADER: \usepackage[french,AUTO]{polyglossia}

导出后对应的 LaTeX 代码(使用 ‘polyglossia’ 原生语法):

\usepackage{polyglossia}
\setmainlanguage[variant=polytonic]{greek}
\setotherlanguage{french}

LaTeX 后端默认使用文档类或用户在 ‘LATEX_HEADER’ 中指定的罗马字体族。将选项 org-latex-use-sans 设置为 ‘t’ 可强制 LaTeX 编译器默认使用无衬线字体。也可在文档选项中添加:

#+OPTIONS: latex-use-sans:t

13.10.4 Quoting LaTeX code

当现有 LaTeX 导出自定义选项不足以精细调整输出效果时,可插入任意 LaTeX 代码(参见 Embedded LaTeX)。在 Org 文件中嵌入此类代码有三种方式,各自使用不同的引用语法。

使用 @ 符号行内引用:

Code embedded in-line @@latex:any arbitrary LaTeX code@@ in a paragraph.

Org 文件中,以一行或多行关键字形式插入:

#+LATEX: any arbitrary LaTeX code

以导出块形式插入,后端会直接导出起止标记之间的所有代码:

#+BEGIN_EXPORT latex
  any arbitrary LaTeX code
#+END_EXPORT

13.10.5 Tables in LaTeX export

LaTeX 导出后端支持为表格内容与布局指定多种 LaTeX 属性。除设置标签(参见 Internal Links)与标题(参见 Captions)外,其他合法 LaTeX 属性包括:

:mode

LaTeX 导出后端会根据模式对表格进行不同包裹,以正确渲染数学符号。模式可选 ‘table’ 、 ‘math’ 、 ‘inline-math’ 、 ‘verbatim’ 或 ‘tabbing’ 。

若为 ‘math’ 或 ‘inline-math’ 模式,表格会被包裹在数学环境中,但单元格内容原样导出。若为 ‘tabbing’ 则使用 LaTeX tabbing 环境,并使用正确的制表符 ‘\>’ 。 LaTeX 导出后端根据 org-latex-default-table-mode 确定默认模式,并会将同一模式下的连续表格合并为单个环境。

:environment

设置 LaTeX 导出后端导出 Org 表格时使用的默认表格环境。常用 LaTeX 表格环境由以下宏包提供:tabularx、longtable、array、tabu、bmatrix。如需使用 tabularx、tabu 等宏包或其替代宏包,需将其加入 org-latex-packages-alist 变量,以便 LaTeX 导出后端在生成的 LaTeX 文件中插入对应加载语句。如需为 LaTeX 片段预览配置这些宏包,可查看 org-latex-packages-alist 的文档字符串。

:caption

使用 ‘CAPTION’ 关键字为表格设置简单标题(参见 Captions)。自定义标题可使用 ‘:caption’ 属性,直接接受原始 LaTeX 代码。 ‘:caption’ 的值会覆盖 ‘CAPTION’ 的值。

:float’, ‘:placement

LaTeX 中的表格环境默认非浮动体。如需设为浮动对象,可将 ‘:float’ 设置为以下值之一: ‘t’ (使用默认 ‘table’ 环境)、 ‘sideways’ (使用 ‘sidewaystable’ 环境)、 ‘multicolumn’ (使用 ‘table*’ 环境使表格跨多栏)以及 ‘nil’ 。 除此之外, ‘:float’ 也可传入任意值,例如通过 LaTeX 的 ‘float’ 宏包定义的自定义浮动类型。

LaTeX 浮动体可额外设置 ‘:placement’ 布局属性,即常用的 ‘[h t b p ! H]’ 方括号内参数。注意 ‘:float sideways’ 类型的表格会忽略 ‘:placement’ 属性。

:align’, ‘:font’, ‘:width

LaTeX 导出后端使用这些属性设置普通表格的对齐方式、字体与宽度。

:options

:options’ 属性允许添加可选参数列表(LaTeX 导出中放在方括号内),部分表格环境(如 tabularray 宏包的 longtblr)支持该结构。示例: ‘:options remark{Note}={note},remark{Source}={source}’ 。

:spread

当 ‘:spread’ 非 nil 时,LaTeX 导出后端会针对 tabu 与 longtabu 环境按 ‘:width’ 拉伸或压缩表格。未设置 ‘:width’ 时 ‘:spread’ 无效。

:booktabs’, ‘:center’, ‘:rmlines

三个属性均为开关。 ‘:booktabs’ 为普通表格启用现代排版增强效果,需通过 org-latex-packages-alist 加载 booktabs 宏包。 ‘:center’ 用于表格居中。 ‘:rmlines’ 仅对“table.el”表格生效,移除除首条水平线外的所有 ASCII 横线。

:math-prefix’, ‘:math-suffix’, ‘:math-arguments

LaTeX 导出后端会将 ‘:math-prefix’ 字符串插入表格前的数学环境中,将 ‘:math-suffix’ 插入表格后的数学环境中,将 ‘:math-arguments’ 字符串插入宏名与表格内容之间。 ‘:math-arguments’ 适用于需要多参数的矩阵宏,如 ‘qbordermatrix’ 。

LaTeX 表格属性可适配多种场景,如矩阵运算或跨页表格:

#+ATTR_LATEX: :environment longtable :align l|lp{3cm}r|l
| ... | ... |
| ... | ... |

#+ATTR_LATEX: :mode math :environment bmatrix :math-suffix \times
| a | b |
| c | d |
#+ATTR_LATEX: :mode math :environment bmatrix
| 1 | 2 |
| 3 | 4 |

使用 LaTeX 命令 ‘\bicaption{HeadingA}{HeadingB}’ 设置标题:

#+ATTR_LATEX: :caption \bicaption{HeadingA}{HeadingB}
| ... | ... |
| ... | ... |

13.10.6 Images in LaTeX export

LaTeX 导出后端会将 Org 文件中无描述的图片链接(如 ‘[[file:img.jpg]]’ 或 ‘[[./img.jpg]]’ )直接作为图片嵌入最终 PDF 输出,在 PDF 中不再是链接,而是页面上的实际图片。 LaTeX 导出后端使用 ‘\includegraphics’ 宏插入图片。对于 TikZ(https://sourceforge.net/projects/pgf/)图片,后端会在 tikzpicture 环境中使用 \input 宏引入。

指定图片 ‘:width’ 、 ‘:height’ 、 ‘:scale’ 及其他 ‘:options’ 语法如下:

#+ATTR_LATEX: :width 5cm :options angle=90
[[./img/sed-hr4049.pdf]]

:scale’ 属性会同时覆盖 ‘:width’ 与 ‘:height’ 。

自定义标题可使用 ‘:caption’ 属性,覆盖默认的 ‘#+CAPTION’ 值:

#+ATTR_LATEX: :caption \bicaption{HeadingA}{HeadingB}
[[./img/sed-hr4049.pdf]]

若按 Captions 中的方式设置标题,LaTeX 导出后端会将图片包裹在浮动 ‘figure’ 环境中。如需不设置标题也使图片浮动,可将 ‘:float’ 属性设为以下值之一:

t

使用默认 ‘figure’ 环境。

multicolumn

使图片跨页面多栏,后端使用 ‘figure*’ 环境包裹。

wrap

文字环绕在图片右侧,图片占据页面左半部分。

sideways

在新页面以旋转 90 度的横向方式显示,使用 ‘sidewaysfigure’ 环境,会覆盖 ‘:placement’ 设置。

nil

即使使用标题,也避免 ‘:float’ 。

任意自定义值

例如通过 LaTeX 的 ‘float’ 宏包定义的自定义浮动类型。

使用 ‘placement’ 属性修改浮动环境的位置参数。

#+ATTR_LATEX: :float wrap :width 0.38\textwidth :placement {r}{0.4\textwidth}
[[./img/hst.png]]

LaTeX 导出后端默认将所有图片居中。将 ‘:center’ 设为 ‘nil’ 可关闭居中。全局关闭居中可将 org-latex-images-centered 设为 ‘nil’ 。

将 ‘:comment-include’ 属性设为非 nil 值,LaTeX 导出后端会将 ‘\includegraphics’ 宏注释掉。


13.10.7 Plain lists in LaTeX export

LaTeX 导出后端为普通列表支持 ‘environment’ 与 ‘options’ 属性,两者配合可自定义列表,示例如下:

#+LATEX_HEADER: \usepackage[inline]{enumitem}
Some ways to say "Hello":
#+ATTR_LATEX: :environment itemize*
#+ATTR_LATEX: :options [label={}, itemjoin={,}, itemjoin*={, and}]
- Hola
- Bonjour
- Guten Tag.

LaTeX 原生仅支持四层列表嵌套,如需更深层级可使用外部宏包,如 LaTeX 的 ‘enumitem’ :

#+LATEX_HEADER: \usepackage{enumitem}
#+LATEX_HEADER: \renewlist{itemize}{itemize}{9}
#+LATEX_HEADER: \setlist[itemize]{label=$\circ$}
- One
  - Two
    - Three
      - Four
        - Five

13.10.8 Source blocks in LaTeX export

LaTeX 导出后端根据 org-latex-src-block-backend 的值提供多种代码块渲染方式。默认值 ‘verbatim’ 以原样格式输出代码,无额外样式。其他值支持更丰富的彩色高亮,但需要额外 LaTeX 宏包( ‘listings’ 、 ‘minted’ )、系统工具( ‘minted’ )或 Emacs 包( ‘engraved’ )。详细说明参见 org-latex-src-block-backend 文档字符串。

LaTeX 导出后端可通过 ‘:float’ 与 ‘:options’ 属性将代码块设为浮动对象。 ‘:float’ 取值:

t

将代码块设为浮动体;默认情况下带标题的代码块均为浮动体。

multicolumn

使代码块跨页面多栏显示。

nil

即使使用标题也不启用 ‘:float’ 浮动体;适用于可能无法在单页内容纳的源代码块。

#+ATTR_LATEX: :float nil
#+BEGIN_SRC emacs-lisp
  Lisp code that may not fit in a single page.
#+END_SRC

LaTeX 导出后端会将 ‘:options’ 中的字符串传递给对应 LaTeX 宏包,用于单独定制该代码块。下例为 Engraved 或 Minted 设置 ‘:options’ 。Minted 是功能丰富的代码高亮 LaTeX 宏包143。 Minted 与 Engraved 均基于 fvextra,因此支持许多相同选项。

#+ATTR_LATEX: :options mathescape
#+BEGIN_SRC emacs-lisp
  (defun Fib (n) ; $n_i = n_{i-2} + n_{i-1}$
    (if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2)))))
#+END_SRC

如需为文件中所有代码块统一设置选项,可使用 org-latex-listings-options~、~org-latex-engraved-optionsorg-latex-minted-options 变量。


13.10.9 Example blocks in LaTeX export

LaTeX 导出后端会将示例块内容包裹在 ‘verbatim’ 环境中。如需全局控制所用环境,可修改自定义变量 org-latex-default-example-environment ,或设置合适的导出过滤器(参见 Advanced Export Configuration)。

如需为特定示例块使用其他环境,可使用 ‘:environment’ 参数:

#+ATTR_LATEX: :environment myverbatim
#+BEGIN_EXAMPLE
  This sentence is false.
#+END_EXAMPLE

向环境传递选项可使用 :options 参数:

#+ATTR_LATEX: :environment Verbatim :options [fontsize=\footnotesize]
#+BEGIN_EXAMPLE
  This sentence is false.
#+END_EXAMPLE

注意: 在示例块中使用 Verbatim 时,需将 fancyvrb 添加到 org-latex-packages-alist ,或在文档导言区添加:

#+LATEX_HEADER: \usepackage{fancyvrb}

13.10.10 Special blocks in LaTeX export

对于 Org 文件中的其他特殊块,LaTeX 导出后端会创建同名环境,并将 ‘:options’ (如有)原样追加到环境起始语句后。示例:

#+BEGIN_abstract
  We demonstrate how to solve the Syracuse problem.
#+END_abstract

#+ATTR_LATEX: :options [Proof of important theorem]
#+BEGIN_proof
  ...
  Therefore, any even number greater than 2 is the sum of two primes.
#+END_proof

导出后为:

\begin{abstract}
  We demonstrate how to solve the Syracuse problem.
\end{abstract}

\begin{proof}[Proof of important theorem]
  ...
  Therefore, any even number greater than 2 is the sum of two primes.
\end{proof}

如需插入特定标题命令,可使用 ‘:caption’ 属性,覆盖标准 ‘CAPTION’ 值(如有)。示例:

#+ATTR_LATEX: :caption \MyCaption{HeadingA}
#+BEGIN_proof
  ...
#+END_proof

13.10.11 Horizontal rules in LaTeX export

LaTeX 导出后端根据指定的 ‘:width’ 与 ‘:thickness’ 属性转换水平线。示例:

#+ATTR_LATEX: :width .6\textwidth :thickness 0.8pt
-----

13.10.12 Verse blocks in LaTeX export

LaTeX 导出后端为诗歌块支持五个属性: ‘:lines’ 、 ‘:center’ 、 ‘:versewidth’ 、 ‘:latexcode’ 与 ‘:literal’ 。前三个需要外部 LaTeX 宏包 ‘verse.sty’ ,该宏包是标准 LaTeX verse 环境的扩展。

:lines

为诗歌添加行号标注,值为整数,指定行号递增步长。

:center

值为 ‘t’ 时,所有诗歌按排版惯例光学居中,以最长行为基准,最长行需通过 ‘:versewidth’ 属性指定。

:versewidth

值为文本字符串,即诗歌中最长的一行。

:latexcode

接受可插入 LaTeX ‘verse’ 环境内的任意 LaTeX 代码。

:literal

值为 t 时保留所有空行,导出为 ‘\vspace*{\baselineskip}’ ,包括内容前后的空行。 注意未设置 ‘:literal’ 时,诗节间多个空行会导出为单个空行,内容前后空行会被移除,更符合 LaTeX ‘verse’ 环境与 ‘verse’ 宏包的语法规范。 若已加载 ‘verse’ 宏包,可通过全局长度 ‘\stanzaskip’ 控制诗节间距(参见 https://www.ctan.org/pkg/verse)。

完整示例(莎士比亚第一首十四行诗):

#+ATTR_LATEX: :center t :latexcode \color{red} :lines 5
#+ATTR_LATEX: :versewidth Feed’st thy light’s flame with self-substantial fuel,
#+BEGIN_VERSE
From fairest creatures we desire increase,
That thereby beauty’s rose might never die,
But as the riper should by time decease
His tender heir might bear his memory
But thou, contracted to thine own bright eyes,
Feed’st thy light’s flame with self-substantial fuel,
Making a famine where abundance lies,
Thyself thy foe, to thy sweet self too cruel.
Thou that art now the world’s fresh ornament,
And only herald to the gaudy spring,
Within thine own bud buriest thy content,
And, tender churl, mak’st waste in niggardly.
Pity the world, or else this glutton be,
To eat the world’s due, by the grave and thee.
#+END_VERSE

13.10.13 Quote blocks in LaTeX export

LaTeX 导出后端为引用块支持两个属性: ‘:environment’ (指定任意引用环境,默认值为 org-latex-default-quote-environment: "quote" )与 ‘:options’ 。 例如,使用标准 LaTeX 类中的 ‘quotation’ 环境替代默认 ‘quote’ 环境:

#+ATTR_LATEX: :environment quotation
#+BEGIN_QUOTE
some text...
#+END_QUOTE

使用 LaTeX 宏包 ‘csquotes’ 中的 ‘foreigndisplayquote’ 环境并指定 ‘german’ 选项:

#+LATEX_HEADER:\usepackage[autostyle=true]{csquotes}
#+ATTR_LATEX: :environment foreigndisplayquote :options {german}
#+BEGIN_QUOTE
some text in German...
#+END_QUOTE

导出为 LaTeX 代码:

\begin{foreigndisplayquote}{german}
some text in German...
\end{foreigndisplayquote}

13.10.14 Controlling the way the table of contents is generated

导出为 LaTeX 时,只有带编号的章节会被加入目录。这一行为更贴近 LaTeX 原生逻辑,与其他导出工具不同(参见 Table of Contents)。 如需无编号章节出现在目录中,可设置 ‘UNNUMBERED’ 属性为 ‘toc’ :

:PROPERTIES:
:UNNUMBERED: toc
:END:

如需让 LaTeX 导出工具行为与其他工具一致,可将变量 org-latex-toc-include-unnumbered 设为 t

(setq org-latex-toc-include-unnumbered t)

或在文件局部变量中添加该设置。

此时无编号章节会被加入目录,除非将 ‘UNNUMBERED’ 属性设为 ‘notoc’ :

:PROPERTIES:
:UNNUMBERED: notoc
:END:

13.11 Markdown Export

Markdown 导出后端 “md” 可将 Org 文件转换为 Markdown 格式,格式定义参见 https://daringfireball.net/projects/markdown/。该格式为原始 Markdown 规范,由 John Gruber 与 Aaron Swartz 制定。

由于 “md” 后端基于 HTML 后端构建(参见 HTML Export),对于 Markdown 语法中未定义的 Org 结构(如表格),它会将其转换为 HTML 格式。

需要注意的是,原始 Markdown 语法与其他常用 Markdown 方言存在差异。更多细节可参见 https://en.wikipedia.org/wiki/Markdown

Markdown export commands

C-c C-e m m (org-md-export-to-markdown)

导出为 Markdown 语法的文本文件。对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.md’ ,且直接覆盖不做提示。

C-c C-e m M (org-md-export-as-markdown)

导出至临时缓冲区,不创建文件。

C-c C-e m o

导出为 Markdown 语法的文本文件并打开。

Header and sectioning structure

依据 org-md-headline-style 的设置,Markdown 导出可生成 atxsetext 两种类型的标题。 setext 仅支持两级标题,而 atx 支持六级标题。 mixed 模式会将一级、二级标题以 setext-样式导出,三至六级标题以 atx-样式导出。超出上述层级限制时,导出后端会将标题转换为列表。可在绝对限制之前设置层级上限(参见 Export Settings)。


13.12 OpenDocument Text Export

ODT 导出后端用于生成开放文档文本(ODT)格式文件。该导出器创建的文档遵循 OpenDocument-v1.2 specification144,且与 LibreOffice 3.4 兼容。


13.12.1 Pre-requisites for ODT export

ODT 导出后端依赖 zip 程序生成最终的压缩 ODT 输出。请检查本地是否存在可用且可执行的 ‘zip’ 工具,缺少该工具则导出无法完成。


13.12.2 ODT export commands

C-c C-e o o (org-odt-export-to-odt)

导出为开放文档文本文件。

若指定了 org-odt-preferred-output-format ,ODT 导出后端会自动将导出文件转换为该格式。

对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.odt’ ,直接覆盖不做提示。仅当选中区域时,ODT 导出后端才会只导出该区域。

若选中区域为单个树形结构,ODT 导出后端会将该树形结构的标题设为文档标题。顺带一提,C-c @ 可选中当前子树。若该树形结构标题拥有或继承 ‘EXPORT_FILE_NAME’ 属性,ODT 导出后端会使用该属性值作为文件名。

C-c C-e o O

导出为开放文档文本文件并打开生成的文件。

若指定了 org-export-odt-preferred-output-format ,则打开转换后的文件。参见 Automatically exporting to other formats


13.12.3 ODT specific export settings

ODT 导出后端提供若干额外关键字用于自定义 ODT 输出。这些关键字的设置方式与通用选项类似(参见 Export Settings)。

DESCRIPTION

文档描述信息,ODT 导出后端会将其作为文档元数据插入。长描述可使用多行以 ‘DESCRIPTION’ 开头的内容。

KEYWORDS

文档关键词。ODT 导出后端会将描述、作者名、关键词及相关文件元数据一同插入输出文件的元数据中。必要时可使用多行 ‘KEYWORDS’ 。

ODT_STYLES_FILE

ODT 导出后端默认使用 org-odt-styles-file 。详细说明参见 Applying custom styles

SUBTITLE

文档副标题。


13.12.4 Extending ODT export

ODT 导出后端可借助专用 ODT 转换程序,生成除 ODT 外的其他格式文档。其通用接口可对接主流转换工具,生成 ‘doc’ 等格式,或将文档从一种格式(如 ‘csv’ )转换为另一种格式(如 ‘xls’ )。

可自定义 org-odt-convert-process 变量指向 ‘unoconv’ ,这是 ODT 推荐的转换工具。正常安装的 LibreOffice 通常已自带 ‘unoconv’ ,也可替换为其他转换工具。参见 Configuring a document converter

Automatically exporting to other formats

若 ODT 格式仅作为生成 ‘doc’ 、 ‘docx’ 、 ‘rtf’ 、 ‘pdf’ 等格式的中间步骤,可扩展 ODT 导出后端直接生成目标格式。在 org-odt-preferred-output-format 变量中指定最终格式即可,这是扩展方式之一(参见 ODT export commands)。

Converting between document formats

Org 导出后端可与各类文本文档格式转换工具协同工作。新一代转换工具如 LibreOffice、Pandoc 可同时支持数百种格式,Org 能与已安装的任意转换工具保持一致的交互方式。以下是通用命令:

M-x org-odt-convert

将现有文档从一种格式转换为另一种格式。携带前缀参数时,会打开新生成的文件。


13.12.5 Applying custom styles

ODT 导出后端内置多种开放文档样式(参见 Working with OpenDocument style files)。如需扩展或进一步自定义内置样式表,可直接编辑样式表,或使用 LibreOffice 等应用生成。以下示例展示通过 LibreOffice 创建样式的方法。

Applying custom styles: the easy way

  1. 创建示例文件 ‘example.org’ ,按如下所示配置并导出为 ODT 格式。
    #+OPTIONS: H:10 num:t
    
  2. Open the above ‘example.odt’ using LibreOffice. Use the Stylist to locate the target styles, which typically have the “Org” prefix. Open one, modify, and save as either OpenDocument Text (ODT) or OpenDocument Template (OTT) file.
  3. 自定义变量 org-odt-styles-file 并指向新创建的文件。更多配置选项参见 Overriding factory styles

    若要为特定文件应用 ODT 样式,可按如下示例使用 ‘ODT_STYLES_FILE’ 关键字:

    #+ODT_STYLES_FILE: "/path/to/example.ott"
    

    #+ODT_STYLES_FILE: ("/path/to/file.ott" ("styles.xml" "image/hdr.png"))
    

Using third-party styles and templates

ODT 导出后端依赖大量模板与样式名称,使用第三方样式和模板可能导致不兼容。基于内置 ODT 模板与样式衍生的模板通常问题更少。


13.12.7 Tables in ODT export

ODT 导出后端支持原生 Org mode 表格(参见 Tables)与简单的 ‘table.el’ 表格。不支持包含单元格跨行、跨列的复杂 ‘table.el’ 表格,此类表格会在导出文档中被移除。

默认情况下,ODT 导出后端导出的表格带有上下框架,且有分隔线划分行组与列组(参见 Column Groups)。所有表格会被设置为相同宽度,同时遵循表格对齐方式与列相对宽度设置(参见 Column Width and Alignment)。

注意:ODT 导出后端将列宽解释为权重比例,默认权重为 1。

在 ‘ATTR_ODT’ 行中指定 ‘:rel-width’ 属性可控制表格宽度,示例如下:

#+ATTR_ODT: :rel-width 50
| Area/Month    |   Jan |   Feb |   Mar |   Sum |
|---------------+-------+-------+-------+-------|
| /             |     < |       |       |     < |
| <l13>         |  <r5> |  <r5> |  <r5> |  <r6> |
| North America |     1 |    21 |   926 |   948 |
| Middle East   |     6 |    75 |   844 |   925 |
| Asia Pacific  |     9 |    27 |   790 |   826 |
|---------------+-------+-------+-------+-------|
| Sum           |    16 |   123 |  2560 |  2699 |

导出后,上述表格会占据文本宽度区域的 50%。导出器按 13:5:5:5:6 的比例分配列宽,第一列左对齐,其余列右对齐。竖线分隔表头与最后一列,横线分隔表头与最后一行。

如需更深度的自定义,可创建自定义表格样式,并通过 ‘ATTR_ODT’ 关键字关联至表格。参见 Customizing tables in ODT export


13.12.8 Images in ODT export

Embedding images

ODT 导出后端会处理 Org 文件中不含描述的图片链接,例如 ‘[[file:img.jpg]]’ 或 ‘[[./img.jpg]]’ , 在最终输出中直接插入图片。以下两种写法均可生效:

[[file:img.png]]
[[./img.png]]

Embedding clickable images

若要创建可点击的图片,需使用一个链接,其描述部分为指向图片文件的另一个链接。 例如,插入图片 ‘org-mode-unicorn.png’ ,点击后跳转到 https://orgmode.org 网站,写法如下:

[[https://orgmode.org][./org-mode-unicorn.png]]

Sizing and scaling of embedded images

通过 ‘ATTR_ODT’ 属性控制嵌入图片的尺寸与缩放比例。

ODT 导出后端会先确定图片在最终文档中的尺寸,该尺寸以厘米为单位。 随后后端会查询图片文件的像素尺寸,此过程依赖 ImageMagick 的 identify 程序, 或 Emacs 的 create-imageimage-size API。处理大文件或批量操作时,优先使用 ImageMagick。 后端会通过 org-odt-pixels-per-inch 将像素尺寸转换为常用的 72 dpi 或 96 dpi, 该变量默认值取自 display-pixels-per-inch ,可根据输出设备性能调整以获得更好效果。 常见的图片缩放操作如下:

显式指定图片尺寸

将 ‘img.png’ 以 10 厘米 × 10 厘米尺寸插入:

#+ATTR_ODT: :width 10 :height 10
[[./img.png]]
按比例缩放图片

将 ‘img.png’ 按原尺寸的一半插入:

#+ATTR_ODT: :scale 0.5
[[./img.png]]
按指定宽度缩放图片(保持宽高比)

将 ‘img.png’ 宽度设为 10 厘米,同时保持原始宽高比:

#+ATTR_ODT: :width 10
[[./img.png]]
按指定高度缩放图片(保持宽高比)

将 ‘img.png’ 高度设为 10 厘米,同时保持原始宽高比:

#+ATTR_ODT: :height 10
[[./img.png]]

Anchoring of images

ODT 导出后端支持将图片锚定到 ‘as-char’ 、 ‘paragraph’ 或 ‘page’ 。 可通过 ‘ATTR_ODT’ 行中的 ‘:anchor’ 属性设置锚定方式。

创建锚定到页面的图片:

#+ATTR_ODT: :anchor page
[[./img.png]]

13.12.9 Math formatting in ODT export

ODT 导出工具对数学公式有专门支持。


13.12.9.1 LaTeX math snippets

LaTeX 数学公式片段(见 LaTeX fragments)可通过以下方式嵌入 ODT 文档:

MathML

在 Org 文件中添加以下行,该选项按单个文件生效。

#+OPTIONS: tex:t

启用该选项后,LaTeX 片段会先通过外部 LaTeX 转 MathML 转换工具转为 MathML 片段, 再以开放文档公式形式嵌入导出文档。

可通过自定义变量 org-latex-to-mathml-convert-commandorg-latex-to-mathml-jar-file 指定 LaTeX 转 MathML 的转换工具。

若使用 MathToWeb145 作为转换工具,可按如下配置:

(setq org-latex-to-mathml-convert-command
      "java -jar %j -unicode -force -df %o %I"
      org-latex-to-mathml-jar-file
      "/path/to/mathtoweb.jar")

或改用 LaTeX​ML146

(setq org-latex-to-mathml-convert-command
      "latexmlmath %i --presentationmathml=%o")

快速验证 LaTeX 转 MathML 工具可靠性的命令:

M-x org-export-as-odf

将 LaTeX 数学公式片段转换为开放文档公式( ‘.odf’ )文件。

M-x org-export-as-odf-and-open

将 LaTeX 数学公式片段转换为开放文档公式( ‘.odf’ )文件, 并使用系统默认应用打开该文件。

PNG images

在 Org 文件中添加以下行,该选项按单个文件生效。

#+OPTIONS: tex:dvipng
#+OPTIONS: tex:dvisvgm

#+OPTIONS: tex:imagemagick

该模式下,LaTeX 片段会被处理为 PNG 或 SVG 图片并嵌入导出文档, 此方法需要安装 dvipng、dvisvgm 或 ImageMagick 工具。


13.12.9.2 MathML and OpenDocument formula files

若直接在 ODT 文档中嵌入 LaTeX 数学公式不稳定,可尝试另一种方式: 通过链接引入公式对应的 MathML( ‘.mml’ )源码或开放文档公式( ‘.odf’ )文件,示例如下:

[[./equation.mml]]

[[./equation.odf]]

13.12.10 Labels and captions in ODT export

ODT 格式会根据对象类型处理标签与标题。行内图片、表格、LaTeX 片段、数学公式会分别编号并添加标题, 每个对象按在 Org 文件中首次出现的顺序获得唯一序号,不同类别序号独立。标题即为附加在这些对象上的标签。

#+CAPTION: Bell curve
#+NAME:   fig:SED-HR4049
[[./img/a.png]]

渲染后在导出文档中显示效果如下:

Figure 2: Bell curve

如需修改标题中的类别名称,可自定义选项 org-odt-category-map-alist 。 例如,将嵌入图片的默认标识 “Figure” 改为 “Illustration”,配置如下:

(setq org-odt-category-map-alist
      '(("__Figure__" "Illustration" "value" "Figure" org-odt--enumerable-image-p)))

修改后上述示例显示为:

Illustration 2: Bell curve

13.12.11 Literal examples in ODT export

ODT 导出后端支持原样示例(见 Literal Examples)并完整保留语法高亮。 内部实现上,ODT 导出后端依赖 ‘htmlfontify.el’ 生成精美代码清单所需的样式定义, 自动生成的样式以 ‘OrgSrc’ 为前缀,并继承 Emacs 语法高亮库对对应语言所用文本的视觉样式的颜色。

如需自定义语法高亮样式,可自定义 org-odt-create-custom-styles-for-srcblocks 选项。

如需关闭原样示例的语法高亮,可自定义 org-odt-fontify-srcblocks 选项。


13.12.12 Advanced topics in ODT export

ODT 导出后端提供丰富功能,适用于高级用户与高频 ODT 格式使用场景。

Configuring a document converter

ODT 导出后端可直接适配主流转换工具,几乎无需额外配置(见 Extending ODT export)。 以下内容适用于不被支持的转换工具或调整默认配置的场景。

注册转换工具

将转换工具名称添加到变量 org-odt-convert-processes , 同时需指定该工具的命令行调用方式,详见该变量文档字符串。

配置工具支持格式

通过自定义变量 org-odt-convert-capabilities 指定转换工具可处理的格式, 可参考该变量默认值配置新工具,详情见其文档字符串。

选择转换工具

通过自定义选项 org-odt-convert-process ,将新添加的转换工具设为首选工具。

Working with OpenDocument style files

本节介绍 ODT 导出工具的内部实现:生成带样式文档的方式,以及自动样式与自定义开放文档样式的使用。

ODT 导出工具生成输出依赖两个文件, 这些文件随发行版一同分发,存放路径由变量 org-odt-styles-dir 指定。两个文件分别为:

OrgOdtStyles.xml

该文件内容会并入最终 ODT 文档的 =styles.xml=, 会在以下场景被修改:

  1. 根据用户设置控制大纲编号;
  2. 添加 ‘htmlfontify.el’ 为代码块语法高亮生成的样式。
OrgOdtContentTemplate.xml

该文件内容会并入最终 ODT 文档的 ‘content.xml’ , Org 大纲内容会插入到文件的 ‘<office:text>’ … ‘</office:text>’ 元素之间。

除作为最终 ‘content.xml’ 的模板外,该文件还用于:

  1. 包含导出工具引用的、用于表格格式化的自动样式;
  2. 包含 ‘<text:sequence-decl>’ … ‘</text:sequence-decl>’ 元素, 控制表格、图片、公式等对象的编号。

以下两个变量控制 ODT 导出工具读取自定义样式与内容模板文件的路径, 自定义这些变量可覆盖导出工具的默认样式。

org-odt-styles-file

ODT 导出后端使用该变量指向的文件(如 ‘styles.xml’ )生成最终输出, 可接受以下取值:

FILE.xml

使用该文件替代默认 ‘styles.xml’ 。

FILE.odt’ 或 ‘FILE.ott

使用指定开放文档文本或模板文件中包含的 ‘styles.xml’ 。

FILE.odt’ 或 ‘FILE.ott’ 及部分内嵌文件

使用指定开放文档文本或模板文件中的 ‘styles.xml’ , 同时提取指定成员文件并嵌入最终 ODT 文档。

当 ‘styles.xml’ 引用页眉、页脚图片等附加文件时适用此选项。

nil

使用默认 ‘styles.xml’ 。

org-odt-content-template-file

使用该变量指定最终输出中使用的空白 ‘content.xml’ 。

Creating one-off styles

ODT 导出后端可读取 Org 文件中嵌入的原生开放文档 XML 代码, 此类直接格式化方式适用于临时单次使用场景。

在普通文本中嵌入 ODT 标签

使用 ‘@@odt:...@@’ 包裹开放文档语法实现行内标记。 例如高亮一段文本:

@@odt:<text:span text:style-name="Highlight">This is highlighted
text</text:span>@@. 但这段为普通文本。

提示: 如需查看示例效果,编辑 ‘styles.xml’ (见 默认样式), 添加如下自定义 Highlight 样式:

<style:style style:name="Highlight" style:family="text">
  <style:text-properties fo:background-color="#ff0000"/>
</style:style>
嵌入单行开放文档 XML

ODT 导出后端可读取 Org 文件中以 ‘#+ODT:’ 开头的单行配置。 例如强制分页:

#+ODT: <text:p text:style-name="PageBreak"/>

提示: 如需查看示例效果,编辑 ‘styles.xml’ (见 默认样式), 添加如下自定义 ‘PageBreak’ 样式。

<style:style style:name="PageBreak" style:family="paragraph"
             style:parent-style-name="Text_20_body">
  <style:paragraph-properties fo:break-before="page"/>
</style:style>
嵌入整块开放文档 XML

ODT 导出后端支持读取 ODT 导出块形式的开放文档 XML, 此类块使用 ‘#+BEGIN_EXPORT odt’ … ‘#+END_EXPORT’ 结构。

例如创建一段使用粗体的临时段落:

#+BEGIN_EXPORT odt
  <text:p text:style-name="Text_20_body_20_bold">
  This paragraph is specially formatted and uses bold text.
  </text:p>
#+END_EXPORT

Customizing tables in ODT export

通过 ‘#+ATTR_ODT’ 行指定自定义表格样式,覆盖默认表格格式。 关于表格默认格式的说明,见 Tables in ODT export

该功能高度模拟开放文档 v1.2 规范147 中表格模板的定义方式。

如需快速预览该功能,安装以下配置后导出后续表格:

(setq org-export-odt-table-styles
      (append org-export-odt-table-styles
              '(("TableWithHeaderRowAndColumn" "Custom"
                 ((use-first-row-styles . t)
                  (use-first-column-styles . t)))
                ("TableWithFirstRowandLastRow" "Custom"
                 ((use-first-row-styles . t)
                  (use-last-row-styles . t))))))
#+ATTR_ODT: :style TableWithHeaderRowAndColumn
| Name  | Phone | Age |
| Peter |  1234 |  17 |
| Anna  |  4321 |  25 |

上例使用 ‘Custom’ 模板,并定义了两种表格样式 ‘TableWithHeaderRowAndColumn’ 与 ‘TableWithFirstRowandLastRow’ 。 重要: 实现该模板所需的开放文档样式已预先定义, 可在 ‘OrgOdtContentTemplate.xml’ (见 默认样式)的 ‘Custom Table Template’ 部分找到。 添加新模板需在此处定义新样式。

使用该功能的步骤:

  1. 创建表格模板148

    表格模板是针对以下表格单元格类别的 ‘table-cell’ 与 ‘paragraph’ 样式集合:

    • Body(主体单元格)
    • First column(首列)
    • Last column(末列)
    • First row(首行)
    • Last row(末行)
    • Even row(偶数行)
    • Odd row(奇数行)
    • Even column(偶数列)
    • Odd Column(奇数列)

    上述样式名称需根据表格模板名称按固定规则命名。

    以名为 ‘Custom’ 的表格模板为例,所需样式名称如下表:

    单元格类型单元格样式段落样式
    BodyCustomTableCellCustomTableParagraph
    First columnCustomFirstColumnTableCellCustomFirstColumnTableParagraph
    Last columnCustomLastColumnTableCellCustomLastColumnTableParagraph
    First rowCustomFirstRowTableCellCustomFirstRowTableParagraph
    Last rowCustomLastRowTableCellCustomLastRowTableParagraph
    Even rowCustomEvenRowTableCellCustomEvenRowTableParagraph
    Odd rowCustomOddRowTableCellCustomOddRowTableParagraph
    Even columnCustomEvenColumnTableCellCustomEvenColumnTableParagraph
    Odd columnCustomOddColumnTableCellCustomOddColumnTableParagraph

    创建名为 ‘Custom’ 的表格模板,需在内容模板文件(见 默认样式) 的 ‘<office:automatic-styles>’ … ‘</office:automatic-styles>’ 元素中定义上述样式。

  2. 定义表格样式149

    定义表格样式需在变量 org-odt-table-styles 中添加条目,并指定:

    • 步骤 (1) 中创建的表格模板名称;
    • 该模板中需要启用的单元格样式集合。

    例如下方条目基于同一模板 ‘Custom’ 定义了两种表格样式 ‘TableWithHeaderRowAndColumn’ 与 ‘TableWithFirstRowandLastRow’ ,通过选择性启用模板中的单元格样式实现不同效果。

    (setq org-export-odt-table-styles
          (append org-export-odt-table-styles
                  '(("TableWithHeaderRowAndColumn" "Custom"
                     ((use-first-row-styles . t)
                      (use-first-column-styles . t)))
                    ("TableWithFirstRowandLastRow" "Custom"
                     ((use-first-row-styles . t)
                      (use-last-row-styles . t))))))
    
  3. 将表格与表格样式关联。

    在 ‘ATTR_ODT’ 行中指定步骤 (2) 中创建的表格样式,示例如下:

    #+ATTR_ODT: :style TableWithHeaderRowAndColumn
    | Name  | Phone | Age |
    | Peter |  1234 |  17 |
    | Anna  |  4321 |  25 |
    

Validating OpenDocument XML

有时 ODT 文件因损坏无法打开,可通过开放文档 Relax NG Compact(RNC)语法模式验证文件是否损坏。 验证前需先用 ‘zip’ 解压 ‘.odt’ 文件,注意 ‘.odt’ 文件本质是 ZIP 压缩包:(emacs)File Archives。 ODT 文件内容为 XML 格式,XML 文件验证与模式敏感编辑的通用帮助见 (nxml-mode)Introduction

自定义 org-odt-schema-dir 指向存放开放文档 RNC 文件与模式定位规则的目录, ODT 导出后端会自动更新 rng-schema-locating-files


13.13 Org Export

org 导出后端会在当前缓冲区中生成 Org 文档的标准化版本。 导出器会执行 Babel 代码(参见 Evaluating Code Blocks),并移除专属于其他后端的内容。

Org export commands

C-c C-e O o (org-org-export-to-org)

导出为扩展名为 ‘.org’ 的 Org 文件。若原文件为 ‘myfile.org’ , 则会导出为 ‘myfile.org.org’ ,且无提示直接覆盖。

C-c C-e O v (~~)

导出为 Org 文件并打开该文件。


13.14 Texinfo Export


13.14.1 Texinfo export commands

C-c C-e i t (org-texinfo-export-to-texinfo)

导出为扩展名为 ‘.texi’ 的 Texinfo 文件。若原文件为 ‘myfile.org’ , 则会导出为 ‘myfile.texi’ ,且无提示直接覆盖。

C-c C-e i i (org-texinfo-export-to-info)

先导出为 Texinfo 格式,再处理生成 Info 文件。 若要生成 DocBook 等其他格式,可自定义 org-texinfo-info-process 变量。


13.14.2 Texinfo specific export settings

Texinfo 导出后端提供若干额外关键字,用于自定义 Texinfo 输出内容。 这些关键字的设置方式与通用选项类似(参见 Export Settings)。

SUBTITLE

文档副标题。

SUBAUTHOR

文档的其他作者。

TEXINFO_FILENAME

Texinfo 文件名。

TEXINFO_CLASS

默认文档类 (org-texinfo-default-class), 该值必须是 org-texinfo-classes 中的成员。

TEXINFO_HEADER

在文件头部末尾插入的任意内容行。

TEXINFO_POST_HEADER

在文件头部结束后插入的任意内容行。

TEXINFO_DIR_CATEGORY

文档在目录中的分类,默认为 Misc

TEXINFO_DIR_NAME

文档在目录中的名称。 该名称为短名称,在主 Info 目录中可通过 m 命令查找到对应手册。 默认使用 Texinfo 文件的基础名。

Texinfo 条目的完整格式为 * DIRNAME: NODE. ,其中 NODE 通常为 (FILENAME) 。 该选项一般只设置 DIRNAME 部分;如需更精细控制,也可直接填写完整条目 (通过包含括号或开头的 ~* ~ 识别)。

TEXINFO_DIR_DESC

文档在目录中的描述,默认使用文档标题。

TEXINFO_PRINTED_TITLE

文档打印版标题。


13.14.3 Texinfo file header

Texinfo 后端在生成文件头部后,会自动为 Info 文件生成名称与目标路径。 如需指定更合理的路径与名称以覆盖默认设置,可使用 ‘TEXINFO_FILENAME’ 关键字。

除输出文件名外,Texinfo 头部还包含语言信息(参见 Export Settings) 与 org-texinfo-coding-system 变量设定的编码系统。 如需在头部添加其他命令,可插入 ‘TEXINFO_HEADER’ 关键字,示例如下:

#+TEXINFO_HEADER: @synindex

若不想重复设置同一组命令,可在 org-texinfo-classes 中定义一次类, 然后在文档中通过 ‘TEXINFO_CLASS’ 关键字指定该类以启用。


13.14.5 Info directory file

Texinfo 导出的最终结果是生成一个 Info 文件。 该 Info 文件的元数据通过分类、标题、描述相关变量控制, 即 ‘TEXINFO_DIR_CATEGORY’ 、 ‘TEXINFO_DIR_NAME’ 与 ‘TEXINFO_DIR_DESC’ 关键字, 用于指定该文件在 Info 目录结构中的位置。

以下为写入 Info 目录文件的示例:

#+TEXINFO_DIR_CATEGORY: Emacs
#+TEXINFO_DIR_NAME: Org Mode
#+TEXINFO_DIR_DESC: Outline-based notes management and organizer

13.14.6 Headings and sectioning structure

Texinfo 导出后端使用预设规则将 Org 标题转换为对应 Texinfo 结构命令。 该规则会将顶层标题映射为标记为 @chapter 的带编号章节, 将下级标题映射为标记为 @unnumbered 的无编号章节。 如需覆盖该映射并使用 @part 或其他 Texinfo 结构命令, 可在 org-texinfo-classes 中定义新类,并通过 ‘TEXINFO_CLASS’ 关键字启用。 若未定义并启用新类,则默认使用 org-texinfo-default-class

若某个 Org 标题级别未关联对应的 Texinfo 结构命令, 或低于指定阈值(参见 Export Settings), Texinfo 导出后端会将其转换为列表项。

Texinfo 导出后端会将任意带有非 nilAPPENDIX’ 属性的标题转为附录, 该行为与 Org 标题级别、 ‘TEXINFO_CLASS’ 关键字无关。

Texinfo 导出后端会在每个常规结构的 Org 标题后创建菜单条目。 如需使用更简短的菜单条目覆盖默认值,可使用 ‘ALT_TITLE’ 属性(参见 Table of Contents)。 Texinfo 菜单条目还支持使用更长的 ‘DESCRIPTION’ 属性。 以下示例同时使用两者覆盖默认菜单条目:

* Controlling Screen Display
  :PROPERTIES:
  :ALT_TITLE: Display
  :DESCRIPTION: Controlling Screen Display
  :END:

第一个标题之前的文本属于 Top 节点,即读者进入 Info 手册时的起始节点。 因此该部分内容通常不会出现在从 ‘.texi’ 文件生成的打印版中。 更多信息参见 (texinfo)The Top Node


13.14.7 Indices

Texinfo 导出后端可识别 Org 文件中以下索引关键字: ‘CINDEX’ 、 ‘FINDEX’ 、 ‘KINDEX’ 、 ‘PINDEX’ 、 ‘TINDEX’ 与 ‘VINDEX’ 。 其值需直接写为原始 Texinfo 代码; 特别地,若 ‘{’ 、 ‘}’ 、 ‘@’ 字符不属于 Texinfo 命令,需使用 ‘@’ 转义。

#+CINDEX: Defining indexing entries

如需为某个标题生成索引条目,可将 ‘INDEX’ 属性设为 ‘cp’ 或 ‘vr’ 。 这两个缩写源自 Texinfo,分别代表概念索引与变量索引。 Texinfo 手册中包含所有其他索引类型的缩写。 导出后端会将该标题导出为无编号章节或节命令,并在内容后插入索引。

* Concept Index
  :PROPERTIES:
  :INDEX: cp
  :END:

13.14.8 Quoting Texinfo code

可使用以下三种方式之一插入或转义原始 Texinfo 代码:

Richard @@texinfo:@sc{@@Stallman@@texinfo:}@@ commence' GNU.

#+TEXINFO: @need800
This paragraph is preceded by...

#+BEGIN_EXPORT texinfo
  @auindex Johnson, Mark
  @auindex Lakoff, George
#+END_EXPORT

13.14.9 Plain lists in Texinfo export

Texinfo 导出后端会使用默认命令 ‘@itemize’ 转换 Org 文件中的无序列表与有序列表。

有序列表导出为 Texinfo 格式时会自动编号。该编号规则遵循列表第一项中设置的任意计数器(见 Plain Lists)。 ‘:enum’ 属性还可让列表从指定数字开始,或切换为字母列表,示例如下:

#+ATTR_TEXINFO: :enum A
1. Alpha
2. Bravo
3. Charlie

Texinfo 导出后端默认使用 ‘@table’ 命令转换 Org 文件中的描述列表,最终生成两列表格。若要修改该行为,可将 ‘:table-type’ 属性设为 ‘ftable’ 或 ‘vtable’ 。更多信息参见 (texinfo)Two-column Tables

Texinfo 导出后端默认会根据 org-texinfo-table-default-markup 中保存的默认设置应用文本高亮。若要覆盖默认高亮命令,可通过 ‘:indic’ 属性指定其他命令。

Org 语法限制每个列表项只能有一个条目。不过 Texinfo 导出后端可通过 ‘:sep’ 属性传入的文本对条目进行拆分,拆分后的每一部分会作为表格第一列的新条目。

以下示例展示了上述所有属性的用法:

#+ATTR_TEXINFO: :table-type vtable :sep , :indic asis
- foo, bar :: This is the common text for variables foo and bar.

转换后为

@vtable @asis
@item foo
@itemx bar
This is the common text for variables foo and bar.
@end table

:compact’ 属性是 ‘:sep’ 属性的替代方案,支持将每个条目单独写在一行。当该属性非 nil ,且描述列表中的某一项无正文但后续紧跟另一项时,第二项会被转写为 ‘@itemx’ 。下面示例的转写结果与上方示例一致。

#+ATTR_TEXINFO: :table-type vtable :indic asis :compact t
- foo ::
- bar ::
  This is the common text for variables foo and bar.

可通过文件级导出选项 ‘compact-itemx’ 为文件中所有列表启用该紧凑语法,或通过变量 org-texinfo-compact-itemx 进行全局启用。

Texinfo 导出后端还支持两种编写 Texinfo 定义命令的方式(见 (texinfo)Definition Commands)。一种基于描述列表,将在下文介绍;另一种依赖专用块(见 Special blocks in Texinfo export)。

Org 文件中以 ‘Function:’ 或其他特定前缀开头的描述列表项,会通过 Texinfo 定义命令进行转换。即使同一列表中其他项无此前缀也可正常工作;必要时,单个描述列表会通过多个表格(如 ‘@vtable’ )与定义命令(如 ‘@defun’ )共同完成转换。

- Function: org-texinfo-drawer drawer contents info ::
  Transcode a DRAWER element from Org to Texinfo.

转换后为

@defun org-texinfo-drawer drawer contents info ::
  Transcode a DRAWER element from Org to Texinfo.
@end defun

可识别的前缀包括 ‘Command:’ 、 ‘Function:’ 、 ‘Macro:’ 、 ‘Special Form:’ 、 ‘Variable:’ 与 ‘User Option:’ 。这些前缀与对应定义命令在 Info 文件中显示的前缀一致。例如 Org 文件中以 ‘Function:’ 开头的项会被转换为 Texinfo 文件中的 ‘@defun’ 命令,该命令最终在 Info 文件中显示为以 ‘-- Function:’ 开头的定义。

作为特殊情况,前缀 ‘Key:’ 同样可被识别。Texinfo 中没有专门用于按键绑定的定义命令,且 Info 文件输出中也不会显示 ‘Key:’ 前缀。即便如此,该特殊用法仍被支持,因其提供了便捷的简写方式,示例如下:

- Key: C-c C-c (do-something) ::
  This command does something.

- User Option: do-something-somehow ::
  This option controls how exactly ~do-something~ does its thing.

转换后为

@table @asis
@item @kbd{C-c C-c} (@code{do-something})
@kindex C-c C-c
@findex do-something
This command does something.
@end table

@defopt do-something-somehow
This option controls how exactly @code{do-something} does its thing.
@end defopt

括号中的命令为可选内容,写法如上所示。


13.14.10 Tables in Texinfo export

导出表格时,Texinfo 导出后端会使用每一列中最宽单元格的宽度。若要覆盖该行为,改用行宽比例指定列宽,可使用 ‘:columns’ 属性。示例如下。

#+ATTR_TEXINFO: :columns .5 .5
| a cell | another cell |

13.14.11 Images in Texinfo export

在 Org 文件中插入图片的文件链接,Texinfo 导出后端便会嵌入该图片。链接需使用常规支持的图片扩展名,且不附带描述。如需缩放图片,可使用 ‘:width’ 与 ‘:height’ 属性。替代文本可通过 ‘:alt’ 属性指定,文本内容使用 Texinfo 代码编写,示例如下:

#+ATTR_TEXINFO: :width 1in :alt Alternate @i{text}
[[ridt.pdf]]

13.14.12 Quotations in Texinfo export

可在引用块中编写引用文本(见 Paragraphs)。还可通过 ‘:tag’ 属性为引用开头的部分文本添加强调样式。

#+ATTR_TEXINFO: :tag Warning
#+BEGIN_QUOTE
Striking your thumb with a hammer may cause severe pain and discomfort.
#+END_QUOTE

如需指定引用作者,可使用 ‘:author’ 属性。

#+ATTR_TEXINFO: :author King Arthur
#+BEGIN_QUOTE
The Lady of the Lake, her arm clad in the purest shimmering samite,
held aloft Excalibur from the bosom of the water, signifying by divine
providence that I, Arthur, was to carry Excalibur.  That is why I am
your king.
#+END_QUOTE

13.14.13 Key bindings in Texinfo export

Org 未提供与 Texinfo 的 @kbd@key 命令对应的按键绑定标记。一种处理方式是使用代码语法替代。例如 ‘~C-x SPC~’ 会被转写为 @code{C-x SPC}

更优的方案是定义并使用名为 kbd 的 Org 宏。为简化该操作,内置了函数 org-texinfo-kbd-macro ,推荐用法如下:

#+macro: kbd (eval (org-texinfo-kbd-macro $1))

Type {{{kbd(C-c SPC)}}}.

转换后为

Type @kbd{C-c @key{SPC}}.

13.14.14 Special blocks in Texinfo export

Texinfo 导出后端支持两种编写 Texinfo 定义命令的方式。一种在本节介绍,另一种见 Plain lists in Texinfo export

Texinfo 导出后端会将专用块转换为同名命令,并将任意 ‘:options’ 属性添加至命令末尾,示例如下:

#+ATTR_TEXINFO: :options org-org-export-to-org ...
#+BEGIN_defun
  A somewhat obsessive function name.
#+END_defun

转换后为

@defun org-org-export-to-org ...
  A somewhat obsessive function name.
@end defun

13.14.15 A Texinfo example

以下是更完整的 Org 文件示例。对应 Texinfo 代码示例参见 (texinfo)GNU Sample Texts

#+TITLE: GNU Sample {{{version}}}
#+SUBTITLE: for version {{{version}}}, {{{updated}}}
#+AUTHOR: A.U. Thor
#+EMAIL: [email protected]

#+OPTIONS: ':t toc:t author:t email:t
#+LANGUAGE: en

#+MACRO: version 2.0
#+MACRO: updated last updated 4 March 2014

#+TEXINFO_FILENAME: sample.info
#+TEXINFO_HEADER: @syncodeindex pg cp

#+TEXINFO_DIR_CATEGORY: Texinfo documentation system
#+TEXINFO_DIR_NAME: sample
#+TEXINFO_DIR_DESC: Invoking sample

#+TEXINFO_PRINTED_TITLE: GNU Sample

This manual is for GNU Sample (version {{{version}}},
{{{updated}}}).

* Copying
  :PROPERTIES:
  :COPYING:  t
  :END:

  This manual is for GNU Sample (version {{{version}}},
  {{{updated}}}), which is an example in the Texinfo documentation.

  Copyright \copy 2016 Free Software Foundation, Inc.

  #+BEGIN_QUOTE
  Permission is granted to copy, distribute and/or modify this
  document under the terms of the GNU Free Documentation License,
  Version 1.3 or any later version published by the Free Software
  Foundation; with no Invariant Sections, with no Front-Cover Texts,
  and with no Back-Cover Texts.  A copy of the license is included in
  the section entitled "GNU Free Documentation License".
  #+END_QUOTE

* Invoking sample

  #+PINDEX: sample
  #+CINDEX: invoking @command{sample}

  This is a sample manual.  There is no sample program to invoke, but
  if there were, you could see its basic usage and command line
  options here.

* GNU Free Documentation License
  :PROPERTIES:
  :APPENDIX: t
  :END:

  #+INCLUDE: fdl.org

* Index
  :PROPERTIES:
  :INDEX:    cp
  :END:

13.15 iCalendar Export

Org 模式能实现良好互操作性,很大程度上得益于其可便捷与外部应用进行导入导出操作。iCalendar 导出后端可从 Org 文件中提取日历数据,并导出为标准 iCalendar 格式。

默认情况下,iCalendar 导出仅包含带有活动时间戳或日记 sexp 的标题150

若时间戳包含具体时间但无明确结束时间(即无时间范围),导出事件默认时长为 2 小时,可通过 org-agenda-default-appointment-duration 覆盖该设置。

iCalendar 导出后端还可根据变量 org-icalendar-include-todo 的配置导出 TODO 条目。后端会将普通时间戳导出为 ‘VEVENT’ ,TODO 项导出为 ‘VTODO’ ,并从非 TODO 项的截止时间中生成事件。

后端会使用 Org TODO 项中的截止时间与计划时间,设置 iCalendar TODO 条目的开始时间与到期时间。更多细节参见变量 org-icalendar-use-deadlineorg-icalendar-use-scheduledorg-icalendar-todo-unscheduled-start

对于标题上的标签,iCalendar 导出后端会将其转换为 iCalendar 分类。如需调整标签与 TODO 状态的继承规则,可配置变量 org-icalendar-categories 。如需根据时间设置闹钟提醒,可配置变量 org-icalendar-alarm-time

iCalendar 格式标准要求每条目具备全局唯一标识符(UID)。iCalendar 导出后端会在导出时自动生成 UID。若要将 UID 保存至 Org 文件,可设置变量 org-icalendar-store-UID 。后端会读取条目的 ‘ID’ 属性,以便在后续导出中复用相同 UID。

由于单个 Org 条目可能生成多个 iCalendar 条目(时间戳、截止时间、计划项或 TODO 项),Org 会根据触发 iCalendar 条目创建的 Org 条目部分,为 UID 添加前缀。前缀可保证 UID 唯一,同时便于同步程序追溯关联关系。

C-c C-e c f (org-icalendar-export-to-ics)

从当前 Org 缓冲区生成 iCalendar 条目,并保存至同一目录下,文件扩展名为 ‘.ics’ 。

C-c C-e c a (org-icalendar-export-agenda-files)

org-agenda-files 中的 Org 文件生成 iCalendar 条目,并为每个 Org 文件单独保存为 iCalendar 文件。

C-c C-e c c (org-icalendar-combine-agenda-files)

org-agenda-files 中的 Org 文件生成合并后的 iCalendar 文件,并写入 org-icalendar-combined-agenda-file 指定的文件名。

iCalendar 导出后端会在导出时读取 Org 条目的 ‘SUMMARY’ 、 ‘DESCRIPTION’ 、 ‘LOCATION’ 、 ‘TIMEZONE’ 与 ‘CLASS’ 属性。如需强制后端继承 ‘LOCATION’ 、 ‘TIMEZONE’ 与 ‘CLASS’ 属性,可配置变量 org-use-property-inheritance

SUMMARY’ 、 ‘LOCATION’ 与 ‘DESCRIPTION’ 属性支持通过 ‘<PROPERTY>+’ 语法定义多行摘要、地点或描述(见 Property Syntax):

* Meeting at location with multi-line address
:PROPERTIES:
:LOCATION:  Someplace
:LOCATION+: Some Street 5
:LOCATION+: 12345 Small Town
:END:
<2024-01-08 Mon 14:20-15:00>

当 Org 条目无 ‘SUMMARY’ 、 ‘DESCRIPTION’ 、 ‘LOCATION’ 与 ‘CLASS’ 属性时,iCalendar 导出后端会从标题提取摘要,从条目正文提取描述内容。变量 org-icalendar-include-body 用于限制转换为描述的正文最大字符数。

TIMEZONE’ 属性可用于为单个条目指定时区,并应用于所有带时间戳的条目。时区需按照 IANA 时区数据库格式填写,例如 ‘Asia/Almaty’ 。此外,属性值也可设为 ‘UTC’ ,仅强制该条目使用 UTC 时间。

CLASS’ 属性可用于为单个条目指定可见级别或访问权限,并应用于所有带类别信息的条目。iCalendar 标准定义了三种可见级别:

PUBLIC

条目公开可见(默认值)。

CONFIDENTIAL

仅限定客户端可访问该事件。

PRIVATE

仅所有者可获取该条目。

服务器应将未知类别属性视为 ‘PRIVATE’ 。

导出的 iCalendar 文件可告知客户端检查更新的频率。该时长可通过变量 org-icalendar-ttl 全局设置,或通过 ‘ICAL-TTL’ 关键字为单个文档设置。该选项需使用 iCalendar 时长格式配置,更多细节参见 org-icalendar-ttl 的文档字符串。

导出为 iCalendar 格式在很大程度上依赖目标应用的支持能力,不同应用的兼容程度存在差异。特定应用的使用建议可参考 Org 模式常见问题解答。


13.16 Other Built-in Backends

Org 内置的其他导出后端包括:

  • ox-man.el’: 导出为手册页格式。

如需激活此类后端,可自定义 org-export-backends ,或通过 ‘(require 'ox-man)’ 直接加载。加载成功后,后端会在导出调度器中添加新按键(见 The Export Dispatcher)。

使用方法与配置细节可参考对应文件的注释部分,例如 ‘ox-man.el’ 。


13.17 Advanced Export Configuration

Export hooks

导出过程会在实际导出开始前执行两个钩子。第一个钩子 org-export-before-processing-functions 会在缓冲区中的宏、Babel 代码以及包含关键字展开之前运行。第二个钩子 org-export-before-parsing-functions 会在缓冲区被解析之前运行。

添加到这些钩子中的函数会以单个参数调用:实际使用的导出后端,以符号形式表示。你可以用它们对文档进行大规模的结构修改。例如,你可以在导出期间移除缓冲区中的所有标题,示例如下:

(defun my-headline-removal (backend)
  "Remove all headlines in the current buffer.
BACKEND is the export backend being used, as a symbol."
  (org-map-entries
   (lambda ()
     (delete-region (point) (line-beginning-position 2))
     ;; We need to tell `org-map-entries' to not skip over heading at
     ;; point.  Otherwise, it would continue from _next_ heading.  See
     ;; the docstring of `org-map-entries' for details.
     (setq org-map-continue-from (point)))))

(add-hook 'org-export-before-parsing-functions #'my-headline-removal)

Filters

过滤器是应用于指定后端特定部分的函数列表。过滤器中第一个函数的输出会传递给下一个函数,最终输出为过滤器中最后一个函数的结果。

Org 导出过程拥有许多适用于不同类型对象、纯文本、语法树、导出选项和最终输出格式的过滤器集。过滤器以元素类型或对象类型命名:~org-export-filter-TYPE-functions~ ,其中 TYPE 为过滤器的目标类型。有效类型包括:

bodyboldbabel-call
center-blockclockcode
diary-sexpdrawerdynamic-block
entityexample-blockexport-block
export-snippetfinal-outputfixed-width
footnote-definitionfootnote-referenceheadline
horizontal-ruleinline-babel-callinline-src-block
inlinetaskitalicitem
keywordlatex-environmentlatex-fragment
line-breaklinknode-property
optionsparagraphparse-tree
plain-listplain-textplanning
property-drawerquote-blockradio-target
sectionspecial-blocksrc-block
statistics-cookiestrike-throughsubscript
superscripttabletable-cell
table-rowtargettimestamp
underlineverbatimverse-block

下面是一个过滤器示例,它会在 LaTeX 后端中将 Org 缓冲区中的非换行空格 ~ ~ 替换为 ‘~’ 。

(defun my-latex-filter-nobreaks (text backend info)
  "Ensure \" \" are properly handled in LaTeX export."
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string " " "~" text)))

(add-to-list 'org-export-filter-plain-text-functions
             'my-latex-filter-nobreaks)

过滤器需要三个参数:待转换的代码、后端名称以及一些关于导出过程的可选信息。第三个参数可以安全忽略。注意使用 org-export-derived-backend-p 谓词来判断 latex 后端或从 latex 派生的其他后端(如 beamer )。

Defining filters for individual files

Org 导出不仅可以针对后端设置过滤器,还可以通过 ‘BIND’ 关键字针对特定文件设置过滤器。下面是包含两个过滤器的示例:一个移除时间戳中的括号,另一个移除删除线文本。过滤器函数定义在同一 Org 文件的代码块中,这对调试十分方便。

#+BIND: org-export-filter-timestamp-functions (tmp-f-timestamp)
#+BIND: org-export-filter-strike-through-functions (tmp-f-strike-through)
#+BEGIN_SRC emacs-lisp :exports results :results none
  (defun tmp-f-timestamp (s backend info)
    (replace-regexp-in-string "&[lg]t;\\|[][]" "" s))
  (defun tmp-f-strike-through (s backend info) "")
#+END_SRC

Summary of the export process

Org 模式导出是一个多步骤过程,基于缓冲区的临时副本进行操作。导出过程包含 4 个主要步骤:

  1. 处理临时副本,对缓冲区文本进行必要修改;
  2. 解析缓冲区,将纯 Org 标记转换为抽象语法树(AST);
  3. 根据所选导出后端的规则,将 AST 转换为文本;
  4. 对最终导出的文本进行后处理。

处理源 Org 缓冲区的临时副本 151:

  1. 执行 org-export-before-processing-functions (见 Export hooks);
  2. 在整个缓冲区中展开 ‘#+include’ 关键字(见 Include Files);
  3. 在整个缓冲区中移除注释子树(见 Comment Lines);
  4. 在整个缓冲区中替换宏(见 Macro Replacement),除非 org-export-replace-macros 为 nil;
  5. org-export-use-babel 非空(默认值)时,处理代码块:

解析临时缓冲区,创建 AST:

  1. 执行 org-export-before-parsing-functions (见 Export hooks)。钩子函数仍可修改缓冲区;
  2. 根据子树专属导出设置、缓冲区内部关键字、 ‘#+BIND’ 关键字以及缓冲区局部和全局自定义项计算导出选项值。整个缓冲区都会被纳入考量;
  3. org-org-with-cite-processors 非空(默认值)时,确定相关参考文献并记录到导出选项中(见 Citations)。整个缓冲区都会被纳入考量;
  4. 执行 org-export-filter-options-functions
  5. 解析临时缓冲区的可访问部分以生成 AST。AST 是表示 Org 语法元素的嵌套列表(更多细节见 Org Element API):
    (org-data ...
     (heading
      (section
       (paragraph (plain-text) (bold (plain-text))))
      (heading)
      (heading (section ...))))
    

    在此步骤之后,对临时缓冲区的修改将不再影响导出;Org 导出仅基于 AST 进行操作;

  6. 从 AST 中移除不会被导出的元素:
    • 根据 ‘SELECT_TAGS’ 和 ‘EXCLUDE_TAGS’ 导出关键字、 ‘task’ 、 ‘inline’ 、 ‘arch’ 导出选项移除标题(见 Export Settings);
    • 注释内容;
    • 根据 ‘#+OPTIONS’ 关键字移除时钟、抽屉、固定宽度环境、脚注、LaTeX 环境与片段、节点属性、规划行、属性抽屉、统计标记、时间戳等(见 Export Settings);
    • 移除包含宽度和对齐标记的表格行,除非所选导出后端将 :with-special-rows 导出选项设为非空(见 Column Width and Alignment);
    • 移除包含重新计算标记的表格列(见 Advanced features)。
  7. 根据 ‘expand-links’ 导出选项展开文件链接 AST 节点中的环境变量(见 Export Settings);
  8. 执行 org-export-filter-parse-tree-functions 。这些函数可通过副作用修改 AST;
  9. org-org-with-cite-processors 非空(默认值)时,根据所选引用导出处理器的规则替换引用 AST 节点和 ‘#+print_bibliography’ 关键字 AST 节点(见 Citation export processors)。

通过深度优先遍历 AST 节点,将 AST 转换为文本:

  1. 将叶节点(无子节点)按照所选导出后端中 “转码器(transcoders)” 的规定转换为文本 152;
  2. 将转换后的节点通过对应的导出过滤器(见 Filters);
  3. 拼接所有转换后的子节点以生成父节点内容;
  4. 将包含子节点的节点转换为文本,先将节点自身及其导出内容传入对应转码器,再传入导出过滤器(见 Filters)。

对导出文本进行后处理:

  1. 按照导出后端的规定,对转换后的抽象语法树(AST)进行后处理。153 该步骤通常会向导出文本中添加生成内容(例如目录);
  2. 执行 org-export-filter-body-functions
  3. 除非选择仅导出正文(见 The Export Dispatcher),否则根据导出后端规则向最终文档添加必要的元数据。例如:文档作者/标题;HTML 头部/尾部;LaTeX 导言区;
  4. org-org-with-cite-processors 非空(默认值)时,根据引用导出处理器规则添加参考文献元数据;
  5. 执行 org-export-filter-final-output-functions

Extending an existing backend

转换过程的部分内容可针对特定元素进行扩展,以引入新的或修改后的转换规则。HTML 导出后端正是通过这种方式扩展以支持 Markdown 格式。扩展可无缝工作,扩展后端未处理的过滤内容将由原后端处理。在 Org 的所有导出自定义方式中,扩展功能十分强大,因为它在解析器层面运作。

在本示例中,让 ascii 后端显示源代码块中使用的语言,并且仅在某个属性为非 nil 时显示,如下所示:

#+ATTR_ASCII: :language t

然后基于 ASCII 后端扩展自定义的 “my-ascii” 后端。

(defun my-ascii-src-block (src-block contents info)
  "Transcode a SRC-BLOCK element from Org to ASCII.
CONTENTS is nil.  INFO is a plist used as a communication
channel."
  (if (not (org-export-read-attribute :attr_ascii src-block :language))
      (org-export-with-backend 'ascii src-block contents info)
    (concat
     (format ",--[ %s ]--\n%s`----"
             (org-element-property :language src-block)
             (replace-regexp-in-string
              "^" "| "
              (org-element-normalize-string
               (org-export-format-code-default src-block info)))))))

(org-export-define-derived-backend 'my-ascii 'ascii
  :translate-alist '((src-block . my-ascii-src-block)))

my-ascii-src-block 函数会读取当前元素上方的属性。若值为假,则交由 ascii 后端处理;若为真(本示例中即为真),则在代码周围创建框线并预留位置插入语言字符串。最后一段代码创建新后端,仅在转换 src-block 类型元素时生效。

要使用新定义的后端,在 Org 缓冲区中执行以下代码:

(org-export-to-buffer 'my-ascii "*Org MY-ASCII Export*")

后续可考虑实现交互式函数、在导出调度器菜单中自动添加选项等用户友好的改进。更多细节见 https://orgmode.org/worg/dev/org-export-reference.html


13.18 Export Region

部分导出后端包含将 Org 格式文本区域转换为其他格式(如 HTML 或 LaTeX)的命令,转换后会替换原内容。相关命令如下:

org-export-region-to-ascii

将选中区域转换为 ASCII 格式。

org-export-region-to-utf8

将选中区域转换为 UTF-8 格式。

org-export-region-to-html

将选中区域转换为 HTML 格式。

org-export-region-to-latex

将选中区域转换为 LaTeX 格式。

org-export-region-to-texinfo

将选中区域转换为 Texinfo 格式。

org-export-region-to-md

将选中区域转换为 Markdown 格式。

这种原地转换对于在非 Org 缓冲区中快速转换表格和列表尤为方便。例如,在 HTML 缓冲区中用 Org 语法编写列表,选中后通过 M-x org-html-convert-region-to-html 转换为 HTML。


14 Publishing

Org 包含一套发布管理系统,可让你配置由相互关联的 Org 文件组成的 项目(projects) ,实现自动转换为 HTML。你还可以配置 Org,将导出的 HTML 页面及相关附件(如图片、源代码文件)自动上传至网页服务器。

你也可以使用 Org 将文件转换为 PDF,甚至同时进行 HTML 与 PDF 转换,让文件在服务器上以两种格式提供。

该发布功能由 David O’Toole 贡献给 Org。


14.1 Configuration

发布需要进行大量配置,以指定项目的文件、目标路径及诸多其他属性。


14.1.1 The variable org-publish-project-alist

发布的配置几乎完全通过设置一个名为 org-publish-project-alist 的变量完成。该列表中的每一项配置一个项目,可采用以下两种形式之一:

("project-name" :property value :property value ...)

即格式规范、键值交替出现的属性列表;或者:

("project-name" :components ("project-name" "project-name" ...))

两种形式均通过指定属性值来配置项目。一个项目定义了待发布的文件集合,以及发布这些文件时使用的发布配置。 当项目采用上述第二种形式时, :components 属性中的各个成员视为子项目,用于归类需要不同发布选项的文件。 发布此类 “元项目(meta-project)” 时,所有子组件会按给定顺序一并发布。


14.1.2 Sources and destinations for files

大部分属性为可选,但部分属性建议始终设置。尤其需要让 Org 知晓源文件的查找位置,以及发布文件的存放位置。

:base-directory

存放发布源文件的目录。

:publishing-directory

输出文件的发布目录。你可以使用 Emacs tramp 包适用的文件名语法,直接发布至网页服务器;也可以先发布到本地目录,再通过外部工具上传网站(参见 Uploading Files)。

:preparation-function

发布流程开始前调用的函数或函数列表,例如运行 ‘make’ 更新待发布文件。每个预处理函数均接收单个参数:项目属性列表。

:completion-function

发布流程结束后调用的函数或函数列表,例如修改生成文件的权限。每个完成函数均接收单个参数:项目属性列表。


14.1.3 Selecting files

默认情况下,基础目录下所有扩展名为 ‘.org’ 的文件均视为项目的一部分。可通过设置以下属性修改该行为:

:base-extension

源文件的扩展名(不含点),实际为正则表达式。若需包含 :base-directory 下所有文件(包括无扩展名文件),可将其设为符号 any

:exclude

用于匹配不应发布的文件名的正则表达式,即便这些文件符合扩展名筛选条件。

:include

无论 :base-extension:exclude 如何设置,均强制包含的文件列表。

:recursive

nil 表示递归遍历基础目录,查找待发布文件。


14.1.4 Publishing action

发布指将文件复制到目标目录,并可在过程中进行格式转换。默认转换是将 Org 文件导出为 HTML 文件,由函数 org-html-publish-to-html 调用 HTML 导出器完成(参见 HTML Export)。 你也可以使用 org-latex-publish-to-pdf 将内容发布为 PDF,或使用对应函数发布为 ASCII、Texinfo 等格式。

若希望将 Org 文件以 ‘.org’ 格式发布,但移除其中已 归档(archived)已注释(commented)标签排除(tag-excluded) 的树形结构,可使用 org-org-publish-to-org 。 该函数会生成 ‘file.org’ 并存放到发布目录。若需要该文件的网页化版本,可将参数 :htmlized-source 设为 t , 将在发布目录生成 ‘file.org.html154

图片等其他文件仅需复制至发布目标,可使用 org-publish-attachment 实现。对于非 Org 文件,必须指定发布函数:

:publishing-function

执行文件发布的函数,也可以是函数列表,所有函数会依次调用。

:htmlized-source

nil 表示发布源文件的网页化版本。

该函数必须接收三个参数:至少包含 :publishing-directory 属性的属性列表、待发布文件名,以及输出文件的发布目录路径。 函数需读取指定文件,按需执行转换,并将结果写入目标文件夹。


14.1.5 Options for the exporters

属性列表可用于为 HTML 与 LaTeX 导出器设置多项导出选项。多数情况下,这些属性对应 Org 中的用户变量。 下表列出这些属性及其关联的变量,详情参见对应变量的文档字符串。

当在 org-publish-project-alist 中为属性赋值时,发布过程中该设置会覆盖对应用户变量的值(若存在)。 而文件内部设置的选项(参见 Export Settings)优先级最高,会覆盖所有其他设置。

Generic properties

:authoruser-full-name
:emailuser-mail-address
:languageorg-export-default-language
:select-tagsorg-export-select-tags
:exclude-tagsorg-export-exclude-tags
:creatororg-export-creator-string
:headline-levelsorg-export-headline-levels
:preserve-breaksorg-export-preserve-breaks
:section-numbersorg-export-with-section-numbers
:time-stamp-fileorg-export-timestamp-file
:with-archived-treesorg-export-with-archived-trees
:with-authororg-export-with-author
:expand-linksorg-export-expand-links
:with-broken-linksorg-export-with-broken-links
:with-clocksorg-export-with-clocks
:with-creatororg-export-with-creator
:with-dateorg-export-with-date
:with-drawersorg-export-with-drawers
:with-emailorg-export-with-email
:with-emphasizeorg-export-with-emphasize
:with-entitiesorg-export-with-entities
:with-fixed-widthorg-export-with-fixed-width
:with-footnotesorg-export-with-footnotes
:with-inlinetasksorg-export-with-inlinetasks
:with-latexorg-export-with-latex
:with-planningorg-export-with-planning
:with-priorityorg-export-with-priority
:with-propertiesorg-export-with-properties
:with-smart-quotesorg-export-with-smart-quotes
:with-special-stringsorg-export-with-special-strings
:with-statistics-cookiesorg-export-with-statistics-cookies
:with-sub-superscriptorg-export-with-sub-superscripts
:with-tocorg-export-with-toc
:with-tablesorg-export-with-tables
:with-tagsorg-export-with-tags
:with-tasksorg-export-with-tasks
:with-timestampsorg-export-with-timestamps
:with-titleorg-export-with-title
:with-todo-keywordsorg-export-with-todo-keywords
:with-cite-processorsorg-export-process-citations
:cite-exportorg-cite-export-processors

ASCII specific properties

:ascii-bulletsorg-ascii-bullets
:ascii-caption-aboveorg-ascii-caption-above
:ascii-charsetorg-ascii-charset
:ascii-global-marginorg-ascii-global-margin
:ascii-format-drawer-functionorg-ascii-format-drawer-function
:ascii-format-inlinetask-functionorg-ascii-format-inlinetask-function
:ascii-headline-spacingorg-ascii-headline-spacing
:ascii-indented-line-widthorg-ascii-indented-line-width
:ascii-inlinetask-widthorg-ascii-inlinetask-width
:ascii-inner-marginorg-ascii-inner-margin
:ascii-links-to-notesorg-ascii-links-to-notes
:ascii-list-marginorg-ascii-list-margin
:ascii-paragraph-spacingorg-ascii-paragraph-spacing
:ascii-quote-marginorg-ascii-quote-margin
:ascii-table-keep-all-vertical-linesorg-ascii-table-keep-all-vertical-lines
:ascii-table-use-ascii-artorg-ascii-table-use-ascii-art
:ascii-table-widen-columnsorg-ascii-table-widen-columns
:ascii-text-widthorg-ascii-text-width
:ascii-underlineorg-ascii-underline
:ascii-verbatim-formatorg-ascii-verbatim-format

Beamer specific properties

:headline-levelsorg-beamer-frame-level
:beamer-subtitle-formatorg-beamer-subtitle-format
:beamer-column-view-formatorg-beamer-column-view-format
:beamer-themeorg-beamer-theme
:beamer-environments-extraorg-beamer-environments-extra
:beamer-frame-default-optionsorg-beamer-frame-default-options
:beamer-outline-frame-optionsorg-beamer-outline-frame-options
:beamer-outline-frame-titleorg-beamer-outline-frame-title

HTML specific properties

:html-doctypeorg-html-doctype
:html-containerorg-html-container-element
:html-content-classorg-html-content-class
:html-html5-fancyorg-html-html5-fancy
:html-link-use-abs-urlorg-html-link-use-abs-url
:html-link-homeorg-html-link-home
:html-link-uporg-html-link-up
:html-equation-reference-formatorg-html-equation-reference-format
:html-postambleorg-html-postamble
:html-preambleorg-html-preamble
:html-headorg-html-head
:html-head-extraorg-html-head-extra
:html-head-include-default-styleorg-html-head-include-default-style
:html-head-include-scriptsorg-html-head-include-scripts
:html-allow-name-attribute-in-anchorsorg-html-allow-name-attribute-in-anchors
:html-divsorg-html-divs
:html-checkbox-typeorg-html-checkbox-type
:html-extensionorg-html-extension
:html-footnote-formatorg-html-footnote-format
:html-footnote-separatororg-html-footnote-separator
:html-footnotes-sectionorg-html-footnotes-section
:html-format-drawer-functionorg-html-format-drawer-function
:html-format-headline-functionorg-html-format-headline-function
:html-format-inlinetask-functionorg-html-format-inlinetask-function
:html-home/up-formatorg-html-home/up-format
:html-indentorg-html-indent
:html-infojs-optionsorg-html-infojs-options
:html-infojs-templateorg-html-infojs-template
:html-inline-image-rulesorg-html-inline-image-rules
:html-link-org-files-as-htmlorg-html-link-org-files-as-html
:html-mathjax-optionsorg-html-mathjax-options
:html-mathjax-templateorg-html-mathjax-template
:html-metadata-timestamp-formatorg-html-metadata-timestamp-format
:html-postamble-formatorg-html-postamble-format
:html-preamble-formatorg-html-preamble-format
:html-prefer-user-labelsorg-html-prefer-user-labels
:html-self-link-headlinesorg-html-self-link-headlines
:html-table-align-individual-fieldsorg-html-table-align-individual-fields
:html-table-caption-aboveorg-html-table-caption-above
:html-table-data-tagsorg-html-table-data-tags
:html-table-header-tagsorg-html-table-header-tags
:html-table-use-header-tags-for-first-columnorg-html-table-use-header-tags-for-first-column
:html-tag-class-prefixorg-html-tag-class-prefix
:html-text-markup-alistorg-html-text-markup-alist
:html-todo-kwd-class-prefixorg-html-todo-kwd-class-prefix
:html-toplevel-hlevelorg-html-toplevel-hlevel
:html-use-infojsorg-html-use-infojs
:html-validation-linkorg-html-validation-link
:html-viewportorg-html-viewport
:html-inline-imagesorg-html-inline-images
:html-table-attributesorg-html-table-default-attributes
:html-table-row-open-tagorg-html-table-row-open-tag
:html-table-row-close-tagorg-html-table-row-close-tag
:html-xml-declarationorg-html-xml-declaration
:html-wrap-src-linesorg-html-wrap-src-lines
:html-klipsify-srcorg-html-klipsify-src
:html-klipse-cssorg-html-klipse-css
:html-klipse-jsorg-html-klipse-js
:html-klipse-selection-scriptorg-html-klipse-selection-script
:creatororg-html-creator-string
:with-latexorg-html-with-latex

LaTeX specific properties

:latex-classorg-latex-default-class
:latex-active-timestamp-formatorg-latex-active-timestamp-format
:latex-caption-aboveorg-latex-caption-above
:latex-classesorg-latex-classes
:latex-default-figure-positionorg-latex-default-figure-position
:latex-default-table-environmentorg-latex-default-table-environment
:latex-default-quote-environmentorg-latex-default-quote-environment
:latex-default-table-modeorg-latex-default-table-mode
:latex-default-footnote-commandorg-latex-default-footnote-command
:latex-diary-timestamp-formatorg-latex-diary-timestamp-format
:latex-engraved-optionsorg-latex-engraved-options
:latex-engraved-preambleorg-latex-engraved-preamble
:latex-engraved-themeorg-latex-engraved-theme
:latex-footnote-defined-formatorg-latex-footnote-defined-format
:latex-footnote-separatororg-latex-footnote-separator
:latex-format-drawer-functionorg-latex-format-drawer-function
:latex-format-headline-functionorg-latex-format-headline-function
:latex-format-inlinetask-functionorg-latex-format-inlinetask-function
:latex-hyperref-templateorg-latex-hyperref-template
:latex-image-default-scaleorg-latex-image-default-scale
:latex-image-default-heightorg-latex-image-default-height
:latex-image-default-optionorg-latex-image-default-option
:latex-image-default-widthorg-latex-image-default-width
:latex-images-centeredorg-latex-images-centered
:latex-inactive-timestamp-formatorg-latex-inactive-timestamp-format
:latex-inline-image-rulesorg-latex-inline-image-rules
:latex-link-with-unknown-path-formatorg-latex-link-with-unknown-path-format
:latex-src-block-backendorg-latex-src-block-backend
:latex-listings-langsorg-latex-listings-langs
:latex-listings-optionsorg-latex-listings-options
:latex-listings-src-omit-languageorg-latex-listings-src-omit-language
:latex-minted-langsorg-latex-minted-langs
:latex-minted-optionsorg-latex-minted-options
:latex-prefer-user-labelsorg-latex-prefer-user-labels
:latex-subtitle-formatorg-latex-subtitle-format
:latex-subtitle-separateorg-latex-subtitle-separate
:latex-table-scientific-notationorg-latex-table-scientific-notation
:latex-tables-booktabsorg-latex-tables-booktabs
:latex-tables-centeredorg-latex-tables-centered
:latex-text-markup-alistorg-latex-text-markup-alist
:latex-title-commandorg-latex-title-command
:latex-toc-commandorg-latex-toc-command
:latex-compilerorg-latex-compiler
:latex-use-sansorg-latex-use-sans

Markdown specific properties

:md-footnote-formatorg-md-footnote-format
:md-footnotes-sectionorg-md-footnotes-section
:md-headline-styleorg-md-headline-style
:md-toplevel-hlevelorg-md-toplevel-hlevel
:md-link-org-files-as-mdorg-md-link-org-files-as-md

ODT specific properties

:odt-styles-fileorg-odt-styles-file
:odt-with-forbidden-charsorg-odt-with-forbidden-chars
:odt-content-template-fileorg-odt-content-template-file
:odt-display-outline-levelorg-odt-display-outline-level
:odt-fontify-srcblocksorg-odt-fontify-srcblocks
:odt-format-drawer-functionorg-odt-format-drawer-function
:odt-format-headline-functionorg-odt-format-headline-function
:odt-format-inlinetask-functionorg-odt-format-inlinetask-function
:odt-inline-formula-rulesorg-odt-inline-formula-rules
:odt-inline-image-rulesorg-odt-inline-image-rules
:odt-pixels-per-inchorg-odt-pixels-per-inch
:odt-table-stylesorg-odt-table-styles
:odt-use-date-fieldsorg-odt-use-date-fields
:with-latexorg-odt-with-latex

Texinfo specific properties

:texinfo-classorg-texinfo-default-class
:texinfo-classesorg-texinfo-classes
:texinfo-format-headline-functionorg-texinfo-format-headline-function
:texinfo-node-description-columnorg-texinfo-node-description-column
:texinfo-active-timestamp-formatorg-texinfo-active-timestamp-format
:texinfo-inactive-timestamp-formatorg-texinfo-inactive-timestamp-format
:texinfo-diary-timestamp-formatorg-texinfo-diary-timestamp-format
:texinfo-link-with-unknown-path-formatorg-texinfo-link-with-unknown-path-format
:texinfo-tables-verbatimorg-texinfo-tables-verbatim
:texinfo-table-scientific-notationorg-texinfo-table-scientific-notation
:texinfo-table-default-markuporg-texinfo-table-default-markup
:texinfo-text-markup-alistorg-texinfo-text-markup-alist
:texinfo-format-drawer-functionorg-texinfo-format-drawer-function
:texinfo-format-inlinetask-functionorg-texinfo-format-inlinetask-function
:texinfo-compact-itemxorg-texinfo-compact-itemx
:with-latexorg-texinfo-with-latex

14.1.7 Generating a sitemap

可使用以下属性控制指定项目的站点地图发布。

:auto-sitemap

nil 时,在执行 org-publish-current-projectorg-publish-all 时自动发布站点地图。

:sitemap-filename

站点地图输出文件名,默认为 ‘sitemap.org’ ,发布后变为 ‘sitemap.html’ 。

:sitemap-title

站点地图页面标题,默认为文件名。

:sitemap-style

可选 list (站点地图仅为相关文件标题的项目列表)或 tree (站点地图体现源文件的目录结构),默认为 tree

:sitemap-format-entry

该选项用于设置站点地图条目的格式。它是一个接收三个参数的函数:相对于项目基础目录的文件或目录名、 站点地图样式、当前项目,函数应返回一个字符串。默认值会将文件名转为链接,并使用文档标题作为链接描述。 如需特殊格式,可使用 org-publish-find-dateorg-publish-find-titleorg-publish-find-property 获取已发布文档的附加信息。

:sitemap-function

用于生成站点地图的插件函数。该函数接收两个参数:站点地图标题、项目涉及的文件与目录构成的嵌套列表, 该列表可通过 org-list-to-genericorg-list-to-subtree 等进一步转换。默认值生成指向项目内所有文件的纯链接列表。

:sitemap-sort-folders

文件夹在站点地图中的显示位置。设为 first (默认)或 last 可分别让文件夹显示在最前或最后; 设为 ignore 则完全忽略文件夹;其他值会将文件与文件夹混合显示。该变量在站点地图样式为 tree 时无效。

:sitemap-sort-files

文件在站点地图中的排序方式。可选 alphabetically (默认,按字母序)、 chronologically (按时间序,旧文件在前) 或 anti-chronologically (按反时间序,新文件在前)。文件日期通过 org-publish-find-date 获取。

:sitemap-ignore-case

排序是否区分大小写,默认为 nil


14.1.8 Generating an index

Org 可以为发布项目的所有文件生成跨文档索引。

:makeindex

nil 时,在 ‘theindex.org’ 中生成索引并发布为 ‘theindex.html’ 。

该文件在首次发布设置了 :makeindex 的项目时自动创建,文件仅包含 ‘#+INCLUDE: "theindex.inc"’ 语句。 你可以围绕该包含语句添加标题、样式等内容。

索引条目通过 ‘INDEX’ 关键字指定。包含感叹号的条目会创建子项。

*** Curriculum Vitae
#+INDEX: CV
#+INDEX: Application!CV

14.2 Uploading Files

对于已经在使用 Rsync、Unison 等第三方同步工具的用户,可能更倾向于不使用 Org 模式中高度依赖 Tramp 的内置远程发布功能。Tramp 虽然实用且功能强大,但在批量传输多个文件时效率不高,且在高负载使用场景下已知会出现问题。

专业的同步工具具备多项优势。除了对比时间戳,它们还会校验文件内容与权限/属性。因此你可以选择先将网站发布到本地目录—甚至直接与 Org 文件放在 同一位置—再通过 Unison 或 Rsync 与远程主机完成同步。

以 Unison 为例,它可以配置仅向指定远程目标传输哪些文件,能大幅简化项目发布的配置逻辑。只需将所有文件放在正确位置,通过 org-publish 处理 Org 文件,后续同步工作交由同步工具完成即可。这种场景下无需在项目配置中包含 JPG、CSS、PNG 等附件文件,第三方工具会自动同步这些内容。

发布到本地目录的速度也远快于远程发布,因此可以更轻松地重新发布整个项目。若将 org-publish-use-timestamps-flag 设置为 nil ,还能确保重新包含所有已修改的外部文件,例如通过 ‘INCLUDE’ 关键字引入的示例源码文件。Org 内置的时间戳机制无法智能检测被引入文件是否发生修改。


14.3 Sample Configuration

下面提供两组配置示例。第一个是仅发布一组 Org 文件的简单项目,第二个则是包含多个组件的复杂项目。


14.3.1 Example: simple publishing configuration

该示例将一组 Org 文件发布到本地机器的 ‘public_html’ 目录。

(setq org-publish-project-alist
      '(("org"
         :base-directory "~/org/"
         :publishing-function org-html-publish-to-html
         :publishing-directory "~/public_html"
         :section-numbers nil
         :with-toc nil
         :html-head "<link rel=\"stylesheet\"
                    href=\"../other/mystyle.css\"
                    type=\"text/css\"/>")))

14.3.2 Example: complex publishing configuration

这个更复杂的示例用于发布完整网站,包含转换为 HTML 的 Org 文件、图片文件、Emacs Lisp 源码以及样式表。发布目录为远程路径,且会排除私有文件。

为保证链接正常生效,需注意在 Web 服务器上复刻本地目录结构,并使用相对文件路径。例如,若 Org 文件存放在 ‘~/org/’ ,可发布的图片存放在 ‘~/images/’ ,则图片链接应写作:

file:../images/myimage.png

在 Web 服务器上,图片的相对路径需保持一致。可通过在服务器对应位置创建 ‘images/’ 文件夹并将图片发布至该目录实现。

(setq org-publish-project-alist
      `(("orgfiles"
         :base-directory "~/org/"
         :base-extension "org"
         :publishing-directory "/ssh:user@host:~/html/notebook/"
         :publishing-function org-html-publish-to-html
         :exclude ,(rx (or "PrivateFile.org" (seq line-start "private/"))) ;; regexp
         :headline-levels 3
         :section-numbers nil
         :with-toc nil
         :html-head "<link rel=\"stylesheet\"
                  href=\"../other/mystyle.css\" type=\"text/css\"/>"
         :html-preamble t)

        ("images"
         :base-directory "~/images/"
         :base-extension "jpg\\|gif\\|png"
         :publishing-directory "/ssh:user@host:~/html/images/"
         :publishing-function org-publish-attachment)

        ("other"
         :base-directory "~/other/"
         :base-extension "css\\|el"
         :publishing-directory "/ssh:user@host:~/html/other/"
         :publishing-function org-publish-attachment)
        ("website" :components ("orgfiles" "images" "other"))))

14.4 Triggering Publication

配置完成后,可通过以下命令执行 Org 发布操作:

C-c C-e P x (org-publish)

提示选择指定项目并发布该项目下所有文件。

C-c C-e P p (org-publish-current-project)

发布当前文件所属的项目。

C-c C-e P f (org-publish-current-file)

仅发布当前文件。

C-c C-e P a (org-publish-all)

发布所有项目。

Org 使用时间戳追踪文件修改状态。上述命令默认仅发布已修改的文件。可通过为任意命令添加前缀参数,或自定义变量 org-publish-use-timestamps-flag 来覆盖该行为,强制发布所有文件。当文件通过 ‘SETUPFILE’ 或 ‘INCLUDE’ 关键字引入其他文件时,通常需要执行此操作。


15 Citation handling

虽然链接(参见 Hyperlinks)通常足以在 Org 中引用内部或外部信息,但在引用多个目标或排版印刷出版物时存在局限性。

Org 模式提供了更完善的标记语法用于 “引用(cite)” 外部资源。以下是一段 Org 模式示例代码:

#+bibliography: citationdata.bib

Org mode is used by various communities [cite:teaching: @orgteaching;
and TeX: @orgtex].  [cite/author/caps:@orgtex] uses Org mode to simplify
writing scientific publications, while [cite/author/caps:@orgteaching]
experiments with Org babel to improve teaching.

#+print_bibliography:

Org 模式会从 ‘#+bibliography’ 数据库中收集引用元数据,并用于排版导出为任意格式的文档。下方示例为 ASCII 格式的导出效果:

Org mode is used by various communities (teaching: Birkenkrahe, Marcus,
2023, and TeX: Somma, Emmanuele F, 2023).  Somma, Emmanuele F uses Org
mode to simplify writing scientific publications, while Birkenkrahe,
Marcus experiment with Org babel to improve teaching.

Birkenkrahe, Marcus (2023). /Teaching Data Science with Literate
Programming Tools/, MDPI.

Somma, Emmanuele F (2023). /Simplifying LaTeX with ORG-mode in Emacs/,
TUGboat volume.

除导出功能外,用户还可以通过补全功能从参考文献库中搜索并插入引用(通过 org-cite-insert )。引用同样具备普通链接的特性,使用 org-open-at-point 执行 “打开(following)” 操作时,会跳转到对应的引用元数据位置。

你可以通过内置或外部的 引用处理器(citation processors) ,自定义引用管理的各项 功能(capability)

Org 模式内置多款引用处理器,适配 LaTeX 导出与 BibTeX 文献库( ‘bibtex’ 、 ‘biblatex’ 、 ‘natbib’ 处理器),也支持使用 引用样式语言 定义的通用格式( ‘csl’ 处理器)。 默认引用处理器为 ‘basic’ ,可兼容任意导出格式,并同时识别 BibTeX 与 CSL 文献库。更多引用处理器以 Emacs 扩展包形式分发。

可混合使用多个引用处理器以满足个性化需求。配置 org-cite-activate-processororg-cite-follow-processororg-cite-insert-processororg-cite-export-processors ,为不同引用功能指定对应处理器:

activate

语法高亮、悬浮提示预览等。

follow

通过 org-open-at-point 对光标处引用执行操作。

insert

通过 org-cite-insert 添加和编辑引用。

export

依托不同库适配各类目标导出格式。


15.1 Citations

添加引用前,需先设置一个或多个文献库,可通过 org-cite-global-bibliography 全局配置,或使用一个或多个 “bibliography” 关键字本地配置。

#+bibliography: SomeFile.bib
#+bibliography: /some/other/file.json
#+bibliography: "/some/file/with spaces/in its name.bib"

Org 模式会合并所有本地与全局文献库,用于检索引用键值。

随后可使用 org-cite-insert 插入并编辑引用,该命令可通过快捷键 C-c C-x @ 触发。

一条 引用(citation) 需要一个或多个 引用键(citation key(s)) ,用于唯一标识文献库中的某条文献。

  • 每条引用均使用方括号包裹,并以 ‘cite’ 类型标识。
  • 每个引用键以 ‘@’ 符号开头。
    [cite:@key]
    
  • 每个引用键可搭配 前缀(prefix) (如  “see ” )和/或 后缀(suffix) (如  “p. 123”(第123页) ),补充理解引用所需但未包含在文献条目中的信息。
    [cite:see @key p. 123]
    
  • 单条引用可同时引用多篇文献,引用键之间以分号分隔,该类引用组的格式由样式决定。
    [cite:@key1;@key2;@key3]
    
  • 还可在 ‘cite’ 关键字与冒号之间插入 ‘/’ 与样式名称,指定引用的样式变体,该用法通常仅适用于作者-年份格式。
    [cite/style:common prefix ;prefix @key suffix; ... ; common suffix]
    

    若未指定 ‘style’ ,则使用以下两种默认样式之一:

    • CITE_EXPORT’ 关键字中定义的默认样式(参见 Citation export processors
      #+cite_export: basic numeric noauthor/bare
      [cite:@key] 等同于 [cite/noauthor/bare:@key]
      
    • 若未设置 ‘CITE_EXPORT’ ,则使用默认 ‘nil’ 样式
      [cite:@key] 等同于 [cite/nil:@key]
      

引用的必填要素仅有:

  • cite’ 关键字与冒号;
  • 每个引用键前的 ‘@’ 符号;
  • 包裹引用内容的方括号。

15.2 Citation export processors

Org 目前包含以下导出处理器:

  • 两款处理器支持导出为多种格式,包括 ‘latex’ (及 ‘pdf’ )、 ‘html’ 、 ‘odt’ 和纯文本(UTF8):
    basic

    基础导出处理器,适用于无需向后兼容、格式化需求较低的场景;

    csl

    该导出处理器通过 citeproc-el 库,使用基于 引文样式语言 编写的格式文件;

  • 另外三款处理器仅针对 LaTeX 及其衍生格式:
    bibtex

    该导出处理器使用 LaTeX 经典文献工具 BibTeX,可兼容其文献数据与样式文件(含大量出版社专用样式),仅支持 LaTeX 的 ‘\cite’ 与 ‘\nocite’ 命令。

    natbib

    功能与 ‘bibtex’ 处理器类似,但使用 LaTeX 宏包 ‘natbib’ ,相比原生 ‘\cite’ 命令支持更多样式变体。

    biblatex

    该后端支持 BibLaTeX 格式的文献数据与样式,BibLaTeX 是 LaTeX 的替代文献处理工具,解决了 BibTeX 的多项核心缺陷,但尚未被出版社广泛采用。

CITE_EXPORT’ 关键字用于指定导出处理器、引用样式与文献样式,示例如下(所有参数均为可选):

#+cite_export: [export processor name] [bibliography style] [default citation style]
#+cite_export: basic author-year author

指定使用 ‘basic’ 导出处理器,引用以作者姓名呈现,参考文献按作者姓名与年份排序;

#+cite_export: csl /some/path/to/vancouver-brackets.csl

指定使用 ‘csl’ 处理器与对应 CSL 样式,本例中按照 ‘温哥华’ 规范定义数字型引用与参考文献格式(多用于医学期刊),引用内容以方括号包裹;

#+cite_export: natbib kluwer

指定使用 ‘natbib’ 导出处理器,引用样式符合哈佛格式与 Wolkers-Kluwer 出版社规范;由于依赖 LaTeX 环境中的 bibtex 处理器,仅能导出为 PDF 格式。

#+cite_export: biblatex numeric,backend=bibtex

指定使用 ‘biblatex’ 导出处理器,默认样式为 ‘numeric’ ,后端为 ‘bibtex’ 。需优先定义样式,再设置 ‘biblatex’ 宏包的其他加载参数。也可按照 ‘biblatex’ 文档说明,使用 key=val,key=val 格式配置:

#+cite_export: biblatex backend=bibtex,style=numeric

Emacs 配置中的 org-cite-biblatex-options 变量即采用该格式。由于依赖 LaTeX 环境中的 biblatex 处理器,仅能导出为 PDF 格式。


15.3 Bibliography printing

PRINT_BIBLIOGRAPHY’ 关键字用于指定参考文献的打印位置(注意冒号):

#+print_bibliography:

基于 LaTeX 的导出处理器 ‘bibtex’ 、 ‘natbib’ 、 ‘biblatex’ 生成的参考文献默认带有章节标题,而 ‘basic’ 与 ‘csl’ 处理器生成的参考文献列表无标题。

一个文档可包含多个 ‘PRINT_BIBLIOGRAPHY’ 关键字,每个关键字都会触发参考文献打印。

该关键字可搭配附加选项使用,例如仅打印指定分类的文献条目或控制格式。不同引用导出处理器支持的 ‘PRINT_BIBLIOGRAPHY’ 选项及含义各不相同,部分处理器不支持传递选项。


15.3.1 Bibliography options in the ‘biblatex’ and ‘csl’ export processors

biblatex’ 与 ‘csl’ 导出处理器通过 ‘PRINT_BIBLIOGRAPHY’ 关键字附带的属性列表支持参考文献选项,示例:

#+print_bibliography: :keyword algebra :type book

包含空格的取值需用双引号包裹。若需重复使用某个键,可使用逗号分隔多个取值,中间不可加空格:

#+print_bibliography: :keyword "algebraic logic" :nottype article,book

biblatex’ 导出处理器支持 BibLaTeX 中 \printbibliography 命令的全部选项。

csl’ 处理器支持以下选项:

:keyword <keyword(,keyword2...)>

仅输出其关键字字段包含所有指定关键字的条目。

:notkeyword <keyword(,keyword2...)>

仅输出其关键字字段不包含任意一个指定关键字的条目。

:type <entrytype>

仅输出类型为 ‘<entrytype>’ 的条目。条目类型优先使用 BibTeX/BibLaTeX 条目类型(当该信息可用,即条目从 BibTeX/BibLaTeX 参考文献读取时),否则使用 CSL 条目类型。

:nottype <entrytype(,entrytype2...)>

仅输出类型不在指定条目类型范围内的条目。条目类型判定规则与 ‘:type’ 一致。

:csltype <entrytype>

仅输出其 CSL 条目类型(可能基于 BibTeX/BibLaTeX 到 CSL 的转换)为 ‘<entrytype>’ 的条目。

:notcsltype <entrytype(,entrytype2...)>

仅输出其 CSL 条目类型(可能基于 BibTeX/BibLaTeX 到 CSL 的转换)不在所列类型范围内的条目。

:filter <predicate>

仅输出使指定 Emacs Lisp 谓词返回非 nil 值的条目。


16 Working with Source Code

此处的源代码指以人类可读编程语言编写的纯文本计算机指令集合,可包含注释。只要源代码用起止标记标识,Org 即可在文档中对其进行管理。 使用源代码的第一步是定义代码块,代码块可放置在 Org 文档几乎任意位置,无需局限于前言或文末。 但如果代码块位于 Org 注释或等宽区域内,Org 将无法对其进行管理。

以下是一段 Emacs Lisp 代码块示例:

#+BEGIN_SRC emacs-lisp
  (defun org-xor (a b)
     "Exclusive or."
     (if a (not b) b))
#+END_SRC

代码块是 Org 多种块类型之一,其他还包括 “居中块(center)”、“注释块(comment)”、“动态块(dynamic)”、“示例块(example)”、“导出块(export)”、“引用块(quote)”、“特殊块(special)”与“诗歌块(verse)”。本节仅针对 ‘#+BEGIN_SRC’ 与 ‘#+END_SRC’ 包裹的代码块。

后续章节将详细介绍 Org 处理源代码的各项功能。


16.1 Features Overview

Org 可对 ‘#+BEGIN_SRC’ 至 ‘#+END_SRC’ 包裹的代码块执行多种操作,简化现代源代码维护的基础管理工作。Org 可编辑、格式化、提取、导出与发布代码块,也可编译执行代码块并捕获运行结果。 Org 模式文档中常将代码块称为 活动代码块(live code) ,因其可修改 Org 文档内容或导出产物。用户可通过调整头部参数(参见 Using Header Arguments),控制每个代码块在编译、执行、提取与导出时的 “活跃度(liveliness)”。

编辑与格式化代码块时,Org 会调用对应语言的 Emacs 主模式,该模式包含专为该语言设计的编辑功能。

Org 可提取一个或多个代码块并写入源码文件,这一过程在文学编程中被称为 代码提取(tangle)

导出与发布时,Org 后端会对代码块进行合适的格式化处理,通常支持原生语法高亮。

执行与编译代码块时,用户可配置 Org 选择对应编译器。Org 支持收集执行或编译结果,插入到 Org 文档中并/或进行导出。除文本结果外,Org 还可插入音频、视频、图片等其他类型数据的链接,并可将编译器错误信息关联至代码块中的对应行。

Org 管理代码块的一项重要特性是:可通过统一语法,在不同语言的代码块间传递变量、函数与结果。多数文学编程工具仅支持单一语言,而 Org 与语言无关的设计允许开发者为不同任务选用合适的编程语言,并在同一 Org 文档中混合使用。这种多语言互通特性,也是其创始人 Eric Schulte 与 Dan Davison 将该功能命名为 Org Babel 的原因。

Org 模式将文本、数据、代码、执行环境配置、运行结果,以及相关论述、结论、引用、内外链接统一保存在单个文档中,实现了可复现研究的便捷验证与维护。


16.2 Structure of Code Blocks

Org 提供两种源代码组织方式:代码块与行内代码,具体规范如下。

代码块遵循以下结构:

#+NAME: <name>
#+BEGIN_SRC <language> <switches> <header arguments>
  <body>
#+END_SRC

无需担心难以记忆代码块语法,Org 模式提供命令可将现有文本包裹为代码块(参见 Structure Templates)。Org 还可配合 Emacs 中的其他补全系统使用,部分补全系统出现早于 Org,支持专用领域语言定义模板。常规使用模板可减少错误、提升准确性并保持格式统一。

行内代码遵循以下结构:

src_<language>{<body>}

src_<language>[<header arguments>]{<body>}
#+NAME: <name>

可选。为代码块命名,使其可像函数一样被其他代码块或行内代码调用执行并捕获结果。其他代码块、外部文件及表格公式(参见 The Spreadsheet)均可通过名称引用该代码块,作用与命名 Org 表格一致。Org 模式要求名称唯一,重名时行为未定义,行内代码块不支持命名。

#+BEGIN_SRC’ … ‘#+END_SRC

必选。标记代码块的起止边界, ‘#+BEGIN_SRC’ 行可携带后续所述的附加参数。

<language>

可选。代码块所用编程语言的标识符,支持的语言标识符参见 Languages

若省略 ‘<language>’ 标识符,则代码块不可包含 ‘<switches>’ 与 ‘<header arguments>’ ,否则首个开关/参数会被识别为语言。

org-src-fontify-natively 设置为非 nil 时,语言标识符还用于在 Org 缓冲区中对代码块进行语法高亮,参见 Editing Source Code

<switches>

可选。用于精细控制代码的执行、导出与格式(参见 Literal Examples 中关于开关的说明)。

<header arguments>

可选。用于控制代码块执行、导出与代码提取的多项行为(参见 Using Header Arguments)。借助 Org 属性功能,可将头部参数选择性应用于整个缓冲区或文档特定子树。

<body>

对应指定编程语言的源代码内容。


16.3 Using Header Arguments

Org 内置了适用于所有语言的通用头部参数。随着各语言在源代码块中逐步支持,也会为特定语言新增专属头部参数。头部参数以英文冒号开头,后接小写的参数名进行指定。

由于头部参数可通过多种方式设置,当出现重复或冲突时,Org 遵循 局部设置优先级更高 的原则。例如函数调用中的头部参数值,会覆盖全局默认的参数值。

System-wide header arguments

可通过自定义变量 org-babel-default-header-args 指定全局生效的头部参数值,其默认配置如下:

:session    => "none"
:results    => "replace"
:exports    => "code"
:cache      => "no"
:noweb      => "no"
:hlines     => "no"
:tangle     => "no"

行内源代码块(见 Structure of Code Blocks)使用略有差异的默认头部参数,定义在 org-babel-default-inline-header-args 中:

:session    => "none"
:results    => "replace"
:exports    => "results"
:hlines     => "yes"

行内代码块与普通代码块的默认头部参数中,最明显的区别在于 ‘:exports’ 参数。行内代码块默认只导出执行结果,而非代码本身。

与默认值不同,通过 Org mode 属性设置的头部参数(见 Header arguments in Org mode properties)对普通代码块和行内代码块均生效。

下面的示例将 ‘:noweb’ 头部参数默认设为 ‘yes’ ,使 Org 默认展开 ‘:noweb’ 引用。

(setq org-babel-default-header-args
      (cons '(:noweb . "yes")
            (assq-delete-all :noweb org-babel-default-header-args)))

每种语言均可通过自定义变量 org-babel-default-header-args:<LANG> 设置专属默认头部参数,其中 <LANG> 为对应语言名称。详细说明可参考各语言在线文档:https://orgmode.org/worg/org-contrib/babel/

Header arguments in Org mode properties

如需对整个缓冲区生效头部参数,可在 Org 文件任意位置使用 ‘PROPERTY’ 关键字(见 Property Syntax)。

下面的示例让所有 R 代码块在同一会话中执行。将 ‘:results’ 设为 ‘silent’ 会忽略所有代码块的执行结果(不只是 R 块),所有代码块均不插入结果。

#+PROPERTY: header-args:R  :session *R*
#+PROPERTY: header-args    :results silent

通过 Org 属性抽屉设置的头部参数(见 Property Syntax)在所在子树及下级节点生效。由于属性抽屉可出现在文件层级结构的任意位置,Org 以最外层调用或源代码块为准解析参数值,且不受 org-use-property-inheritance 设置影响。

本示例中,子树下所有代码块的 ‘:cache’ 默认值为 ‘yes’ 。

* sample header
  :PROPERTIES:
  :header-args:    :cache yes
  :END:

通过绑定到 C-c C-x porg-set-property 函数定义的属性对所有激活语言生效,优先级高于 org-babel-default-header-args 中的设置。

语言专属的头部参数也可从属性 ‘header-args:<LANG>’ 中读取,其中 <LANG> 为语言标识符,示例如下:

* Heading
  :PROPERTIES:
  :header-args:clojure:    :session *clojure-1*
  :header-args:R:          :session *R*
  :END:
** Subheading
  :PROPERTIES:
  :header-args:clojure:    :session *clojure-2*
  :END:

上述配置会让 ‘Heading’ 和 ‘Subheading’ 下的 Clojure 块使用不同会话,而所有 R 块使用同一会话。 ‘Subheading’ 中的块会继承 ‘Heading’ 的设置。

Code block specific header arguments

最常用的方式是在源代码块的 ‘#+BEGIN_SRC’ 行直接设置头部参数。该层级的参数优先级高于 org-babel-default-header-args 变量与属性中设置的参数。

下面的示例中, ‘:results’ 设为 ‘silent’ 会忽略代码执行结果; ‘:exports’ 设为 ‘code’ 表示仅将代码块主体导出为 HTML 或 LaTeX。

#+NAME: factorial
#+BEGIN_SRC haskell :results silent :exports code :var n=0
  fac 0 = 1
  fac n = n * fac (n-1)
#+END_SRC

行内代码块中使用相同头部参数的写法:

src_haskell[:exports both]{fac 5}

代码块头部参数可分行书写,每行以 ‘#+HEADER:’ 开头。注意 Org 目前仅为兼容旧版支持复数形式的 ‘#+HEADERS:’ ,未来可能移除该写法。

无名代码块的多行头部参数示例:

#+HEADER: :var data1=1
#+BEGIN_SRC emacs-lisp :var data2=2
   (message "data1:%S, data2:%S" data1 data2)
#+END_SRC

#+RESULTS:
: data1:1, data2:2

命名代码块的多行头部参数示例:

#+NAME: named-block
#+HEADER: :var data=2
#+BEGIN_SRC emacs-lisp
  (message "data:%S" data)
#+END_SRC

#+RESULTS: named-block
  : data:2

Header arguments in function calls

函数调用中的头部参数优先级最高,出现冲突时会覆盖所有其他设置。下面展示两个 ‘#+CALL:’ 示例。 ‘CALL’ 关键字的完整语法见 Evaluating Code Blocks

本示例中, ‘:exports results’ 头部参数作用于 ‘#+CALL:’ 行的执行过程:

#+CALL: factorial(n=5) :exports results

本示例中, ‘:session special’ 头部参数作用于 ‘factorial’ 代码块的执行:

#+CALL: factorial[:session special](n=5)

16.4 Environment of a Code Block

Passing arguments

使用 ‘var’ 向源代码块传递参数。代码块中变量的具体用法因语言而异,详见各语言专属文档,但 ‘var’ 的语法对所有语言统一,包括变量声明与默认值赋值。

使用 ‘var’ 头部参数向代码块传递参数的语法格式为:

:var NAME=ASSIGN

NAME 为代码块主体中绑定的变量名。ASSIGN 可以是字面量(字符串、数字)、表格引用、列表、字面量示例、其他代码块(可带参数),或是某代码块的执行结果。ASSIGN 也可通过冒号分隔文件名与引用目标,指定外部文件中的元素。

:var NAME=FILE:REFERENCE

若 ‘FILE’ 不存在,则直接在当前文件中按原引用名称查找。因此 ‘:var table=tbl:example’ 会在当前缓冲区中查找对应表格。

以下为按引用传递值的示例:

table

使用 ‘NAME’ 关键字命名的表格。

#+NAME: example-table
| 1 |
| 2 |
| 3 |
| 4 |

#+NAME: table-length
#+BEGIN_SRC emacs-lisp :var table=example-table
  (length table)
#+END_SRC

#+RESULTS: table-length
: 4

传递表格时,可对包含列名/行名的行或列进行特殊处理。

colnames’ 头部参数可取值 ‘yes’ 、 ‘no’ 或 ‘nil’ ,默认 ‘nil’ :若输入表格存在列名(第二行为横线),Org 会先移除列名,处理表格后再恢复列名并写入结果。取值 ‘yes’ 时,即使表格无横线,也会对首行非横线内容执行相同逻辑。取值 ‘no’ 时则完全不预处理列名。

#+NAME: less-cols
| a |
|---|
| b |
| c |

#+BEGIN_SRC python :var tab=less-cols :colnames nil
return [[val + '*' for val in row] for row in tab]
#+END_SRC

#+RESULTS:
| a  |
|----|
| b* |
| c* |

同理, ‘rownames’ 头部参数可取 ‘yes’ 或 ‘no’ 。取值 ‘yes’ 时,Org 会移除首列,处理表格后恢复并写入结果;默认 ‘no’ ,即不处理首列。注意 Emacs Lisp 代码块会忽略 ‘rownames’ 参数,因其表格操作较为简便。

#+NAME: with-rownames
| one | 1 | 2 | 3 | 4 |  5 |
| two | 6 | 7 | 8 | 9 | 10 |

#+BEGIN_SRC python :var tab=with-rownames :rownames yes
return [[val + 10 for val in row] for row in tab]
#+END_SRC

#+RESULTS:
| one | 11 | 12 | 13 | 14 | 15 |
| two | 16 | 17 | 18 | 19 | 20 |

引用其他文件中的表格,可使用冒号连接文件名与表名,例如: ‘:var table=other-file.org:example-table’ 。

list

简单的命名列表。

#+NAME: example-list
- simple
  - not
  - nested
- list

#+BEGIN_SRC emacs-lisp :var x=example-list
  (print x)
#+END_SRC

#+RESULTS:
| simple | list |

注意仅顶层列表项会被传递,嵌套列表项会被忽略。

无参数代码块

由 ‘NAME’ 关键字命名的代码块,后可接空括号。

#+BEGIN_SRC emacs-lisp :var length=table-length()
  (* 2 length)
#+END_SRC

#+RESULTS:
: 8
带参数代码块

由 ‘NAME’ 关键字指定的代码块名称,后接括号,并可在括号内传入可选参数。 执行该代码块时,光标会定位在其所在位置。

#+NAME: double
#+BEGIN_SRC emacs-lisp :var input=8
  (* 2 input)
#+END_SRC

#+RESULTS: double
: 16

#+NAME: squared
#+BEGIN_SRC emacs-lisp :var input=double(input=1)
  (* input input)
#+END_SRC

#+RESULTS: squared
: 4
字面示例或代码块内容

使用 ‘NAME’ 关键字命名的代码块或字面示例块,后接方括号(示例块可省略)。

#+NAME: literal-example
#+BEGIN_EXAMPLE
  A literal example
  on two lines
#+END_EXAMPLE

#+NAME: read-literal-example
#+BEGIN_SRC emacs-lisp :var x=literal-example[]
  (concatenate #'string x " for you.")
#+END_SRC

#+RESULTS: read-literal-example
: A literal example
: on two lines for you.

通过索引可引用变量的部分内容。索引从 0 开始,负数表示从末尾倒数。逗号分隔的索引对应后续维度。注意索引操作在 ‘hlines’ 、 ‘colnames’ 、 ‘rownames’ 等表格相关参数生效 之前 执行。下面示例将表格 ‘example-table’ 首行最后一个单元格赋值给变量 ‘data’ :

#+NAME: example-table
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |

#+BEGIN_SRC emacs-lisp :var data=example-table[0,-1]
  data
#+END_SRC

#+RESULTS:
: a

两个整数以冒号分隔表示取值范围,包含起止位置。下面示例将 ‘example-table’ 的中间三行赋值给 ‘data’ :

#+NAME: example-table
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | 3 |

#+BEGIN_SRC emacs-lisp :var data=example-table[1:3]
  data
#+END_SRC

#+RESULTS:
| 2 | b |
| 3 | c |
| 4 | d |

使用空索引或单个 ‘*’ 表示选取全部范围, ‘0:-1’ 效果相同。下面示例仅引用第一列:

#+NAME: example-table
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |

#+BEGIN_SRC emacs-lisp :var data=example-table[,0]
  data
#+END_SRC

#+RESULTS:
| 1 | 2 | 3 | 4 |

索引引用适用于表格与代码块,支持任意维度,逗号分隔多维索引,示例如下:

#+NAME: 3D
#+BEGIN_SRC emacs-lisp
  '(((1  2  3)  (4  5  6)  (7  8  9))
    ((10 11 12) (13 14 15) (16 17 18))
    ((19 20 21) (22 23 24) (25 26 27)))
#+END_SRC

#+BEGIN_SRC emacs-lisp :var data=3D[1,,1]
  data
#+END_SRC

#+RESULTS:
| 11 | 14 | 17 |

注意行名与列名在索引前不会被移除,即使 ‘colnames’ 或 ‘rownames’ 参数后续会处理,索引时也需将其计入位置。

Emacs Lisp 代码也可直接为变量赋值。为区分普通值与 Lisp 代码,Org 会将以 ‘(’ 、 ‘[’ 、 ‘'’ 或 ‘`’ 开头的值当作 Emacs Lisp 代码执行,执行结果赋值给变量。下面示例展示如何可靠地获取当前 Org 缓冲区文件名并传递给代码块:

#+BEGIN_SRC sh :var filename=(buffer-file-name) :exports both
  wc -w $filename
#+END_SRC

注意从表格与列表中读取的值不会被误解析为 Emacs Lisp 代码,如下例所示:

#+NAME: table
| (a b c) |

#+HEADER: :var data=table[0,0]
#+BEGIN_SRC perl
  $data
#+END_SRC

#+RESULTS:
: (a b c)

Using sessions

两个代码块可共享同一运行环境。 ‘session’ 头部参数用于让多个源代码块在同一会话中运行,同名会话的代码块会在同一个解释器进程中执行。

none

默认值。每个代码块启动独立解释器进程,执行完毕后进程终止。

STRING

除 ‘none’ 外的任意字符串作为会话名称。例如 ‘:session STRING’ 会将会话命名为 ‘STRING’ 。若 ‘session’ 未设值,会话名由源代码语言标识符生成。后续同语言代码块复用该会话。根据语言不同,状态变量、其他块代码与整体解释环境可能共享。部分解释型语言支持通过修改会话名创建并发会话。

仅支持交互式执行的语言可使用会话功能,C、ditaa 等语言不支持。即使是 Python、Haskell 这类支持交互的语言,也对可交互式运行的语法结构有限制,Org 会话中的代码块会继承这些限制。

Choosing a working directory

dir’ 头部参数指定代码块执行时的工作目录。未设置时使用当前缓冲区所在目录。即 ‘:dir DIRECTORY’ 的效果等价于临时执行 M-x cd RET DIRECTORY。底层实现中, ‘dir’ 仅设置 Emacs 变量 default-directory 。将 ‘mkdirp’ 设为非 nil 值可在需要时自动创建目录。

将 ‘dir’ 设为符号 attach 或字符串 "'attach" ,会自动将目录 ‘dir’ 设为 (org-attach-dir) 返回路径,并开启 ‘:mkdirp yes=;使用 =:results file’ 生成的文件路径会以 ‘attachment:’ 链接形式插入,而非普通 ‘file:’ 链接;位于附件目录外的路径仍使用 ‘file:’ 链接。

例如将绘图文件保存至主目录 ‘Work/’ 文件夹(波浪号会自动展开):

#+BEGIN_SRC R :file myplot.png :dir ~/Work
  matplot(matrix(rnorm(100), 10), type="l")
#+END_SRC

如需在远程机器执行代码块,可使用 Tramp 格式指定远程目录,示例:

#+BEGIN_SRC R :file plot.png :dir /scp:[email protected]:
  plot(1:10, main=system("hostname", intern=TRUE))
#+END_SRC

Org 会先正常捕获文本结果插入 Org 文件,再借助 Emacs Tramp 插入远程文件链接,路径由 ‘dir’ 与 default-directory 组合生成:

[[file:/scp:[email protected]:/home/dand/plot.png][plot.png]]

当 ‘dir’ 与 ‘session’ 同时使用时,仅对新会话设置初始目录,不会修改已存在会话的工作目录。

请勿将 ‘dir’ 与 ‘:exports results’ 或 ‘:exports both’ 共用,避免 Org 生成错误的远程文件链接,原因是 Org 不会展开 default-directory 以规避底层兼容性问题。

Inserting headers and footers

prologue’ 头部参数用于在代码块执行前追加内容,常用于执行重置指令。例如可在 Gnuplot 代码块中使用 ‘:prologue "reset"’ ,或全局配置:

(add-to-list 'org-babel-default-header-args:gnuplot
             '((:prologue . "reset")))

同理, ‘epilogue’ 头部参数的值会在代码块执行末尾追加执行。


16.5 Evaluating Code Blocks

安全提示:执行代码存在安全风险。Org 提供保护机制,执行任何代码前都会请求用户授权。自定义或关闭该保护机制见 Code Evaluation and Security Issues

How to evaluate source code

Org 会捕获代码块执行结果,并插入到 Org 文件中代码块的后方,位置在换行与 ‘RESULTS’ 关键字之后。若不存在 ‘RESULTS’ 关键字则自动创建。详细说明见 Results of Evaluation

默认仅启用 Emacs Lisp 代码块执行,启用其他语言见 Languages

Org 提供多种执行代码块的方式。将光标定位在代码块上按下 C-c C-cC-c C-v e 155 会调用 org-babel-execute-src-block 函数,执行代码、收集结果并插入缓冲区。

可在 Org 缓冲区或表格中调用命名代码块156,支持调用当前文件或「Babel 库」(见 Library of Babel)中的命名块。

CALL’ 关键字语法:

#+CALL: <name>(<arguments>)
#+CALL: <name>[<inside header arguments>](<arguments>) <end header arguments>

行内命名代码块语法:

... call_<name>(<arguments>) ...
... call_<name>[<inside header arguments>](<arguments>)[<end header arguments>] ...

使用行内语法时,结果会根据变量 org-babel-inline-result-wrap 包装,默认值为 "=%s=" ,生成适合标记的原样文本。

<name>

待执行的当前文档内代码块名称(见 Structure of Code Blocks)。若块位于其他文件, ‘<name>’ 以文件名加冒号开头。例如执行 ‘file.org’ 中名为 ‘clear-data’ 的块:

#+CALL: file.org:clear-data()
<arguments>

Org 使用标准函数调用语法向代码块传递参数。例如,在 ‘#+CALL:’ 行中将 ‘4’ 传递给名为 ‘double’ 、且声明了头部参数 ‘:var n=2’ 的代码块,写法如下:

#+CALL: double(n=4)

注意该函数调用语法与头部参数语法的区别。

<inside header arguments>

Org 使用头部参数语法向已命名的代码块传递内部头部参数。内部头部参数作用于代码块的执行过程。例如, ‘[:results output]’ 会收集该代码块执行期间输出到标准输出的结果。注意该头部参数语法与函数调用语法的区别。

<end header arguments>

尾部头部参数会影响代码块返回的结果。例如, ‘:results html’ 会在将结果插入到 Org 缓冲区之前,把结果包裹在 ‘#+BEGIN_EXPORT html’ 块中。

Limit code block evaluation

eval’ 头部参数可限制特定代码块与 ‘CALL’ 关键字的执行,用于防范不受信任代码,可设置为执行前确认。

yes

Org 执行源代码,是否询问权限由 org-confirm-babel-evaluate 决定。

never’ or ‘no

永不执行源代码。

query

每次执行前均询问用户权限。

never-export’ 或 ‘no-export

导出时不执行,但用户可交互式执行。

query-export

导出时询问用户是否执行。

若未设置 ‘eval’ ,是否执行由 org-confirm-babel-evaluate 变量决定(见 Code Evaluation and Security Issues)。

Cache results of evaluation

cache’ 头部参数用于缓存代码块执行结果,避免重复执行未修改的代码块。使用缓存需满足:缓冲区中已有结果,且头部参数(含 ‘var’ 引用值)与代码块内容自上次计算后未变更。该功能可大幅减少耗时计算,但部分极端场景下缓存结果可能不可靠。

缓存功能最适合纯函数代码块:相同输入始终返回相同结果(见 Environment of a Code Block)、无副作用、不依赖输入以外的外部变量。依赖计时器、文件系统、随机数的函数不适合缓存。

警告:在会话中使用 ‘cache’ 可能产生意外结果。

缓存机制检测代码变更时,不会展开 noweb 引用(见 Noweb Reference Syntax)。

cache’ 可取 ‘yes’ 或 ‘no’ :

no

默认值。不缓存结果,每次均重新执行。

yes

是否运行代码或返回缓存结果,取决于对代码块整体及其传入参数组合后的 SHA1 哈希值进行比对。该哈希值会在之前执行后记录在 ‘#+RESULTS:’ 行中。当哈希值匹配时,Org 不会执行该代码块;当哈希值不匹配时,Org 会执行代码块、插入结果、重新计算哈希值并更新 ‘#+RESULTS:’ 行。

在本示例中,两个函数均会被缓存。但只有 ‘random’ 的结果与上次运行相比发生变化时,=caller= 才会执行。

#+NAME: random
#+BEGIN_SRC R :cache yes
  runif(+1)
#+END_SRC

#+RESULTS[a2a72cd647ad44515fab62e144796432793d68e1]: random
0.4659510825295

#+NAME: caller
#+BEGIN_SRC emacs-lisp :var x=random :cache yes
  x
#+END_SRC

#+RESULTS[bec9c8724e397d5df3b696502df3ed7892fc4f5f]: caller
0.254227238707244

16.6 Results of Evaluation

Org 对代码块执行结果的处理方式取决于多个共同作用的头部参数。不过,最主要的决定因素是 ‘results’ 头部参数。它支持四类选项,每个代码块在每类中只能选用一个:

Collection

用于指定如何从代码块中收集结果;

Type

用于指定代码块返回的结果类型;影响 Org 处理结果并将其插入 Org 缓冲区的方式;

Format

用于指定结果格式;影响 Org 处理结果的方式;

Handling

用于在结果完成格式化后执行插入操作。

Collection

收集选项用于指定结果,各选项互斥,只能选择其一。

value

大多数 Babel 库的默认行为157。函数式模式。Org 会将代码包裹在源块对应语言的函数定义中以获取返回值。这也是使用 ‘:results value’ 时,代码应像函数一样执行并返回值的原因。对于 Python 等语言,使用 ‘:results value’ 时必须显式使用 return 语句。结果为代码块中最后一条语句的返回值。

在会话中执行代码块时(参见 Environment of a Code Block),Org 将代码传递给以 Emacs 交互式子进程运行的解释器,并从源代码解释器的最后一条语句输出中获取值。Org 需要使用语言特定的方法获取该值,例如 Ruby 中的变量 _ ,以及 R 中的 .Last.value

output

脚本模式。Org 将代码传递给运行解释器的外部进程,并将标准输出流的内容以文本形式返回。

在会话模式下,Org 将代码传递给以 Emacs 交互式子进程运行的解释器,拼接解释器输出的所有文本并作为结果返回。

Type

类型用于指定代码块执行后预期的结果类型,各选项互斥,只能选择其一。

默认行为为自动判断结果类型。结果类型的检测依赖于代码块所用语言,具体可参考各语言的单独文档,参见 Languages

table’, ‘vector

将结果解析为 Org 表格。若结果为单个值,则创建一行一列的表格。使用示例: ‘:results value table’ 。

有时结果会在表格行之间或表头下方包含水平线(即 “hlines”)。默认值为 ‘no’ 的 ‘hlines’ 参数会从输入表格中移除此类线条。对于大多数代码而言这是合理的,否则这些 ‘hline’ 符号会引发未绑定变量错误。设置为 ‘yes’ 则保留这些线条,如下例所示。

#+NAME: many-cols
| a | b | c |
|---+---+---|
| d | e | f |
|---+---+---|
| g | h | i |

#+NAME: no-hline
#+BEGIN_SRC python :var tab=many-cols :hlines no
return tab
#+END_SRC

#+RESULTS: no-hline
| a | b | c |
| d | e | f |
| g | h | i |

#+NAME: hlines
#+BEGIN_SRC python :var tab=many-cols :hlines yes
return tab
#+END_SRC

#+RESULTS: hlines
| a | b | c |
|---+---+---|
| d | e | f |
|---+---+---|
| g | h | i |
list

将结果解析为 Org 列表。若结果为单个值,则创建只含一个元素的列表。

scalar’, ‘verbatim

按字面解析并以引用文本形式插入,不创建表格。使用示例:=:results value verbatim= 。

file

将结果解析为文件名。将代码块的执行结果保存到该文件,然后插入指向该文件的链接。可同时控制文件名和链接附带的描述。

Org 首先尝试根据 ‘file’ 头部参数的值以及 ‘output-dir’ 头部参数指定的目录生成文件名。若未指定 ‘output-dir’ ,则默认为当前目录。

#+BEGIN_SRC asymptote :results value file :file circle.pdf :output-dir img/
  size(2cm);
  draw(unitcircle);
#+END_SRC

若缺少 ‘file’ 头部参数,Org 会根据代码块名称生成输出文件的基本名,并根据 ‘file-ext’ 头部参数指定扩展名。这种情况下,名称和扩展名均为必填项。

结果也可被解析为文件路径,参见 ‘:results link’ 。

#+name: circle
#+BEGIN_SRC asymptote :results value file :file-ext pdf
  size(2cm);
  draw(unitcircle);
#+END_SRC

file-desc’ 头部参数用于定义链接的描述(参见 Link Format)。若存在 ‘file-desc’ 但未赋值,则使用 ‘file’ 的值作为链接描述;若未指定该参数,则不显示描述。若需要指定 ‘file-desc’ 但不设置描述,可传入空向量(即 :file-desc [])。

默认情况下,Org 认为写入文件的表格为制表符分隔输出。可通过 ‘sep’ 头部参数指定其他分隔符。

file-mode’ 头部参数用于设置文件权限。若要设为可执行,可使用 ‘:file-mode (identity #o755)’ 。

#+BEGIN_SRC shell :results file :file script.sh :file-mode (identity #o755)
  echo "#!/bin/bash"
  echo "echo Hello World"
#+END_SRC

Format

格式与代码块返回的结果类型相关,各选项互斥,只能选择其一。默认值由上述指定的类型决定。

raw

按原始 Org 模式解析,直接插入缓冲区。若为表格则自动对齐。使用示例: ‘:results value raw’ 。

code

将结果包裹在代码块中,便于解析。使用示例: ‘:results value code’ 。

drawer

结果与 ‘raw’ 一样直接添加到 Org 文件中,但会被包裹在 ‘RESULTS’ 抽屉或结果宏(用于行内代码块)中,方便后续脚本与自动化处理。使用示例: ‘:results value drawer’ 。

html

将结果包裹在 ‘BEGIN_EXPORT html’ 块中。使用示例: ‘:results value html’ 。

latex

将结果包裹在 ‘BEGIN_EXPORT latex’ 块中。使用示例: ‘:results value latex’ 。

link’, ‘graphics

与 ‘file’ 类型一同使用时,结果为指向 ‘:file’ 头部参数指定文件的链接。但与普通 ‘file’ 类型不同,代码块输出不会写入磁盘,代码块仅通过副作用生成该文件,如下例所示:

#+begin_src shell :results file link :file "org-mode-unicorn.svg"
  wget -c "https://orgmode.org/resources/img/org-mode-unicorn.svg"
#+end_src

#+RESULTS:
[[file:org-mode-unicorn.svg]]

若省略 ‘:file’ 头部参数,则将源块结果解析为文件路径。

org

将结果包裹在 ‘BEGIN_SRC org’ 块中。如需逗号转义,可在块内使用 TAB 或导出文件。使用示例: ‘:results value org’ 。

pp

将结果转换为美化打印的源代码并包裹在代码块中。支持的语言:Emacs Lisp、Python、Ruby。使用示例: ‘:results value pp’ 。

wrap’ 头部参数会无条件地通过向 ‘#+BEGIN_’ 和 ‘#+END_’ 追加字符串来标记结果块(值为 ‘nil’ 或 ‘no’ 时除外)。若未指定字符串,Org 会将结果包裹在 ‘#+BEGIN_results’ … ‘#+END_results’ 块中。该参数优先级高于上述 ‘results’ 取值。例如:

#+BEGIN_SRC emacs-lisp :results html :wrap EXPORT markdown
"<blink>Welcome back to the 90's</blink>"
#+END_SRC

#+RESULTS:
#+BEGIN_EXPORT markdown
<blink>Welcome back to the 90's</blink>
#+END_EXPORT

Handling

结果收集后的处理选项,各选项互斥,只能选择其一。

replace

默认行为。将结果插入 Org 缓冲区并覆盖之前的结果。使用示例: ‘:results output replace’ 。

silent

不将结果插入 Org 缓冲区,但在迷你缓冲区中回显。使用示例: ‘:results output silent’ 。

none

计算结果但不做任何处理,既不插入 Org 缓冲区也不在迷你缓冲区回显。该结果仍可被其他代码块引用使用。使用示例: ‘:results none’ 。

discard

完全忽略结果。该选项与 ‘none’ 类似,但不对返回值执行任何处理。以编程方式调用代码块(参见 How to evaluate source code)或通过引用调用(参见 Passing argumentsNoweb Reference Syntax)时始终返回 nil

append

将结果追加到 Org 缓冲区,最新结果在底部,不覆盖原有结果。使用示例: ‘:results output append’ 。

prepend

将结果前置到 Org 缓冲区,最新结果在顶部,不覆盖原有结果。使用示例: ‘:results output prepend’ 。

Post-processing

post’ 头部参数用于对代码块执行结果进行后处理。当 ‘post’ 被赋值时,Org 会将结果绑定到 *this* 变量,方便传递给 ‘var’ 头部参数(参见 Environment of a Code Block),从而使结果可被其他代码块使用,甚至可直接执行 Emacs Lisp 代码。

下面两个示例展示了 ‘post’ 头部参数的用法。第一个示例展示如何通过 ‘post’ 添加 ‘ATTR_LATEX’ 关键字。

#+NAME: attr_wrap
#+BEGIN_SRC sh :var data="" :var width="\\textwidth" :results output
  echo "#+ATTR_LATEX: :width $width"
  echo "$data"
#+END_SRC

#+HEADER: :file /tmp/it.png
#+BEGIN_SRC dot :post attr_wrap(width="5cm", data=*this*) :results drawer
  digraph{
          a -> b;
          b -> c;
          c -> a;
  }
#+end_src

#+RESULTS:
:RESULTS:
#+ATTR_LATEX :width 5cm
[[file:/tmp/it.png]]
:END:

第二个示例展示在 ‘post’ 中使用 ‘colnames’ 头部参数在代码块间传递数据。

#+NAME: round-tbl
#+BEGIN_SRC emacs-lisp :var tbl="" fmt="%.3f"
  (mapcar (lambda (row)
            (mapcar (lambda (cell)
                      (if (numberp cell)
                          (format fmt cell)
                        cell))
                    row))
          tbl)
#+end_src

#+BEGIN_SRC R :colnames yes :post round-tbl[:colnames yes](*this*)
  set.seed(42)
  data.frame(foo=rnorm(1))
#+END_SRC

#+RESULTS:
|   foo |
|-------|
| 1.371 |

16.7 Exporting Code Blocks

可以选择只导出代码块的 代码 、代码块的执行 结果 、同时导出代码与结果,或都 导出。Org 对大多数语言默认导出 代码 ,对行内代码块默认导出 结果 。对于 ditaa 等部分语言,无论普通源块还是行内源块均默认导出 结果 。若仅导出代码块主体,参见 Literal Examples;若要选择性导出 Org 文档的子树,参见 Exporting

exports’ 头部参数用于指定该部分 Org 内容是否导出为 HTML、LaTeX 等格式。

code

默认值。将代码主体加入导出文件。示例: ‘:exports code’ 。

results

将代码执行结果加入导出文件。示例: ‘:exports results’ 。

both

将代码与执行结果同时加入导出文件。示例: ‘:exports both’ 。

none

代码与执行结果均不加入导出文件。代码是否执行取决于其他选项。示例: ‘:exports none’ 。

若源块通过 ‘NAME’ 关键字命名,其执行结果也会继承该名称。这样,指向使用 ‘:exports results’ 导出的命名源块的模糊链接依然有效,并指向执行结果。

命名代码块的执行结果也可通过单独的 ‘NAME’ 关键字显式命名,该名称优先级高于父源块。

#+NAME: code name
#+BEGIN_SRC emacs-lisp :exports both value
(+ 1 2)
#+END_SRC

#+NAME: results name
#+RESULTS: code name
3

This [[code name][link]] will point to the code block.
Another [[results name][link]] will point to the results.

当命名代码块使用 ‘:exports both’ 导出时,显式设置结果名称可能是必要的。若结果没有独立名称,指向该块的链接可能随机指向代码块或其结果。

注意:所有指向使用 ‘:exports none’ 导出的源块的链接都会失效,这会导致导出过程失败,除非导出时允许失效链接(参见 Export Settings)。

出于速度或安全考虑,可禁止 Org 执行代码块:

  • 加快导出速度,使用头部参数 ‘:eval never-export’ (参见 Evaluating Code Blocks)。
  • 提升安全性,将 org-export-use-babel 变量设为 nil ,但需注意此时头部参数将失效。

若执行结果未标记为导出( ‘:exports code’ 或 ‘:exports none’ ),即使设置 ‘:eval yes’ ,Org 也不会执行代码。唯一例外是使用 ‘:session’ 的代码块,这类块会根据 ‘:eval’ 头部参数执行。

关闭执行在批处理时十分有用。例如,Wiki 标记语言存在较高的不可信代码风险。停止代码块执行也会停止该块所有头部参数的求值,某些场景下这可能不符合预期。因此在导出时,若只允许头部参数量化而不执行源块中的代码,可设置 ‘:eval never-export’ (参见 Evaluating Code Blocks)。

Org 在导出时不会执行注释子树中的代码块(参见 Comment Lines);但会执行导出排除子树中的代码块(参见 Export Settings)。


16.8 Extracting Source Code

从代码块中提取源代码是文学编程的基础任务,Org 提供了便捷的实现方式。在文学编程术语中,文档在创作时将代码与文档 编织(woven) 在一起,导出时则将代码 缠绕(tangled) 分离以供计算机执行。Org 支持编织与缠绕操作,便于创建、维护、共享与导出文学编程文档,并提供丰富的自定义选项用于提取源代码。

Org 在缠绕代码块时会对其展开、合并与转换,再根据选项配置重新组合为一个或多个独立文件。在此缠绕过程中,Org 会展开源代码中的变量,并解析所有 noweb 风格引用(参见 Noweb Reference Syntax)。

Header arguments

tangle’ 头参数用于指定是否将代码块导出到源码文件。

yes

将代码块导出到源码文件。源码文件名由当前 Org 文件名派生,文件扩展名由代码语言标识符决定。 示例: ‘:tangle yes’ 。

no

默认值。不将代码提取到源码文件中。 示例: ‘:tangle no’ 。

FILENAME

将代码块导出到文件名由 ‘tangle’ 头参数值指定的源码文件。文件名路径相对于当前 Org 文件所在目录解析,若指定了 ‘tangle-directory’ ,则相对于该目录。

FILENAME 支持以下几种形式:

单个文件名(字符串)

示例: ‘:tangle script.py’ 。

文件名列表

将代码块导出到多个文件。示例: ‘:tangle '("src/main.py" "src/utils.py")’ 。

变量或函数调用

求值后得到目标文件名。示例: ‘:tangle 'tangle-targets’ 或 ‘:tangle (get-tangle-targets)’ 。

当同时指定 ‘:tangle-directory’ 和多个 ‘:tangle’ 文件时,代码块会导出到所有目录与文件的组合路径。

Example:

#+begin_src emacs-lisp :tangle '("config.el" "backup.el") :tangle-directory '("~/.config" "/backup")
(message "Tangling to multiple targets specified by :tangle and :tangle-directory")
#+end_src

该代码块会导出到四个文件:

  • ~/.config/config.el
  • ~/.config/backup.el
  • /backup/config.el
  • /backup/backup.el

tangle-directory’ 头参数用于指定一个或多个基础目录,作为 tangle 相对路径的根目录。用法与 ‘tangle’ 类似,支持相同类型的值。

此外,位于注释子树内的代码块(见 Comment Lines)永远不会被导出。

mkdirp’ 头参数用于在导出文件时自动创建不存在的父目录。 ‘yes’ 表示启用创建, ‘no’ 表示禁用。

comments’ 头参数用于控制在导出文件中插入额外注释,这些注释独立于代码块本身已有的注释。

no

默认值。导出时不插入任何额外注释。

link

用注释包裹代码块,并添加指向 Org 文件中对应代码位置的链接。

注意 Org 会使用 org-store-linkHandling Links)生成指向代码块的链接。如果父标题重复或在导出后被修改,该链接可能不唯一。建议将 org-id-link-to-org-use-id 设为 t,确保链接指向正确标题。

yes

为兼容旧版本保留,效果与 ‘link’ 相同。

org

将 Org 文件中最近的标题文本作为注释插入,具体文本取自代码块所在的上层上下文。

both

同时启用 ‘link’ 和 ‘org’ 两种注释。

noweb

启用 ‘link’ 功能,展开 noweb 引用(见 Noweb Reference Syntax),并在代码块内部用链接注释包裹展开内容。

padline’ 头参数用于控制是否在导出文件中为代码块前后添加空行。

yes

默认值。在导出文件中每个代码块前后各插入一个空行。

no

不为导出的代码块添加空行。

shebang’ 头参数可将导出结果转为可执行脚本文件。将其设为字符串,例如 ‘:shebang "#!/bin/bash"’ ,Org 会将该字符串作为导出文件的第一行,并自动为文件添加可执行权限。

tangle-mode’ 头参数通过 set-file-modes 指定导出文件的权限。权限使用八进制值表示,可通过对 Elisp 八进制值调用 identity 函数传入。例如,创建只读文件可写为 ‘:tangle-mode (identity #o444)’ 。为简化写法,支持八进制简写 ‘oXXX’ (o 代表 octal),因此只读示例可简写为 ‘:tangle-mode o444’ 。省略 ‘o’ 前缀会将数值当作整数解析,可能导致意外结果( ‘444’ 等价于 ‘o674’ )。 另外还支持两种简写格式:类似 ls 的权限字符串 ‘rw-r--r--’ ,以及类似 chmod 的权限写法 ‘g+w’ 。 注意 chmod 风格权限基于 org-babel-tangle-default-file-mode ,其默认值为 ‘#o644’ 。

当同时指定 ‘:tangle-mode’ 和 ‘:shebang’ 时, ‘:tangle-mode’ 指定的权限会覆盖 ‘:shebang’ 带来的权限。若多个代码块导出到同一文件且 ‘:tangle-mode’ 冲突,Org 的行为未定义。

默认情况下 Org 在导出时会展开代码块。 ‘no-expand’ 头参数可关闭该展开行为。注意 org-babel-expand-src-block 的展开副作用之一是会为变量赋值(见 Environment of a Code Block),展开也会替换 noweb 引用为目标内容(见 Noweb Reference Syntax)。部分展开可能导致提前赋值,因此提供该选项。该选项仅对导出生效,对导出无影响,因为执行用的代码块必须展开。

Functions

org-babel-tangle

导出当前文件。快捷键绑定为 C-c C-v t

带前缀参数时仅导出当前代码块。

org-babel-tangle-file

选择一个文件进行导出。快捷键绑定为 C-c C-v f

Tangle hooks

org-babel-pre-tangle-hook

该钩子在导出流程开始前运行,当前缓冲区即为待导出的缓冲区。

org-babel-tangle-body-hook

该钩子在临时缓冲区中运行,缓冲区内容为每个已展开的代码块。钩子可按需修改展开后的代码,修改后的内容将作为最终代码使用。

org-babel-post-tangle-hook

该钩子在由 org-babel-tangle 导出的代码文件内部运行,适用于对导出文件进行后处理、编译或执行。

org-babel-tangle-finished-hook

该钩子在 post-tangle 钩子之后运行,环境为原始 Org 缓冲区。

Jumping between code and Org

调试器通常会将错误信息关联到源码文件。但对导出文件,我们希望关联到 Org 文件而非导出后的源码文件。为实现这一跳转,Org 使用 org-babel-tangle-jump-to-org 函数,并依赖两个额外代码块头参数:

  1. 将 ‘padline’ 设为 true —这是默认设置。
  2. 将 ‘comments’ 设为 ‘link’ ,使 Org 插入指向 Org 文件的链接。

16.9 Languages

Org 支持数十种语言的代码块。可在 Worg 网站查看 各语言专属文档

默认仅启用 Emacs Lisp 执行功能。如需启用或禁用其他语言,可通过 Emacs 定制界面修改 org-babel-load-languages 变量,或在初始化文件中添加如下配置。

本示例禁用 Emacs Lisp 执行,启用 R 语言执行。

(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . nil)
   (R . t)))

注意这并非启用语言的唯一方式。通过 require 加载对应语言库也会启用该语言。例如,以下代码启用 Clojure 代码块执行:

(require 'ob-clojure)

16.10 Editing Source Code

使用 C-c ' 编辑当前代码块。该操作会打开一个对应语言主模式的新编辑缓冲区,加载代码块内容供编辑。再次按 C-c ' 可关闭缓冲区并返回 Org 缓冲区。

C-x C-s 保存编辑缓冲区并同步到 Org 缓冲区。设置 org-edit-src-auto-save-idle-delay 可在空闲一定时间后自动保存,设置 org-edit-src-turn-on-auto-save 可启用自动保存模式,将内容另存为独立文件。

在主模式下编辑代码时,Org Src 次要模式保持激活。该模式提供以下可配置变量,更多变量可在定制组 org-edit-structure 中查看。

org-src-lang-modes

若存在名为 <LANG>-mode 的 Emacs 主模式(其中 <LANG> 为代码块头行中的语言标识符),编辑缓冲区将使用该主模式。若对应主模式不存在或未指定语言标识符,则回退到 Fundamental 模式。可通过该变量自定义语言标识符到主模式的映射。

org-src-window-setup

用于指定新建编辑缓冲区时的窗口布局。

org-src-preserve-indentation

默认值为 nil ,代码会自动缩进。该缩进在导出或 tangle 时生效,可能会修改行首空格与制表符。设为非 nil 时,代码保持左对齐,导出或 tangle 时不修改任何行内容,对 Python 等对空白敏感的语言非常有用。

org-src-ask-before-returning-to-edit-buffer

设为 nil 时,Org 直接返回编辑缓冲区,不再提示确认。默认行为会弹出确认提示。

代码块语法高亮可在显示页面上直观区分文本与代码。将 org-src-fontify-natively 设为非 nil 可在 Org 缓冲区中启用原生代码高亮,高亮规则遵循编辑该代码块所用的主模式(见上文 org-src-lang-modes )。

如需针对特定语言进一步自定义 org-block 的外观,可配置 org-src-block-faces 。以下示例为普通代码块设置深色背景,并仅为 Python 和 Emacs Lisp 代码块设置专属背景色。

(require 'color)
(set-face-attribute 'org-block nil :background
                    (color-darken-name
                     (face-attribute 'default :background) 3))

(setq org-src-block-faces '(("emacs-lisp" (:background "#EEE2FF"))
                            ("python" (:background "#E5FFB8"))))

16.11 Noweb Reference Syntax

代码块可使用 noweb158 风格语法引用其他代码块:

<<CODE-BLOCK-ID>>

其中 CODE-BLOCK-ID 可以是单个代码块的 ‘NAME’ ,或是一组共享相同 ‘noweb-ref’ 头参数的代码块集合(见 Using Header Arguments)。Org 可将此类引用替换为被引用块的代码;若为具名 ‘NAME’ 的单个代码块,也可替换为该块的执行结果。

noweb’ 头参数控制 noweb 语法引用的展开行为,展开发生在代码块执行、导出或导出时。

no

默认值。在执行、导出、导出时均不展开代码中的 noweb 引用。

yes

在执行、导出、导出时均展开代码中的 noweb 引用。

tangle

仅在导出时展开 noweb 引用,执行和导出时不展开。

strip-tangle

在执行和导出时展开 noweb 引用,导出时移除引用。

no-export

在执行和导出时展开 noweb 引用,导出时不展开。

strip-export

在执行或导出前展开 noweb 引用,导出时移除引用。

eval

仅在执行前展开代码中的 noweb 引用。

最简单的用法是将单个代码块内容插入其他块中。如下例所示:

#+NAME: initialization
#+BEGIN_SRC emacs-lisp
  (setq sentence "Never a foot too far, even.")
#+END_SRC

#+BEGIN_SRC emacs-lisp :noweb yes
  <<initialization>>
  (reverse sentence)
#+END_SRC

第二个代码块展开后为:

#+BEGIN_SRC emacs-lisp :noweb yes
  (setq sentence "Never a foot too far, even.")
  (reverse sentence)
#+END_SRC

注意 noweb 展开不会自动继承 ‘:var’ 头参数159

也可以引用共享同一 ‘noweb-ref’ 头参数的多个代码块,该参数可在文件、子树或代码块层级设置。下例 Org 文件中,所有代码块内容会在导出时拼接为纯代码文件。

#+BEGIN_SRC sh :tangle yes :noweb yes :shebang #!/bin/sh
  <<fullest-disk>>
#+END_SRC
* the mount point of the fullest disk
  :PROPERTIES:
  :header-args: :noweb-ref fullest-disk
  :END:

** query all mounted disks
#+BEGIN_SRC sh
  df \
#+END_SRC

** strip the header row
#+BEGIN_SRC sh
  |sed '1d' \
#+END_SRC

** output mount point of fullest disk
#+BEGIN_SRC sh
  |awk '{if (u < +$5) {u = +$5; m = $6}} END {print m}'
#+END_SRC

默认情况下,换行符会分隔每个 noweb 引用的拼接内容。如需使用其他分隔符,可修改 ‘noweb-sep’ 头部参数。

此外,Org 可以插入单个代码块的执行结果,而非其代码体本身[160。当在代码块名称后附加括号(可包含参数)时,便会触发执行,如下所示。

<<NAME(optional arguments)>>

注意这种用法必须使用 ‘NAME’ 关键字指定的名称,使用 ‘noweb-ref’ 设置的引用无法触发执行。

下例展示带括号与不带括号的 noweb 引用在导出内容上的区别。给定:

#+NAME: some-code
#+BEGIN_SRC python :var num=0 :results output :exports none
print(num*10)
#+END_SRC

该代码块:

#+BEGIN_SRC text :noweb yes
  <<some-code>>
#+END_SRC

展开为:

print(num*10)

下面使用带括号的 noweb 引用,并将变量 ‘num’ 设为 10:

#+BEGIN_SRC text :noweb yes
  <<some-code(num=10)>>
#+END_SRC

展开结果为代码块 ‘some-code’ 的执行结果,而非代码本身:

100

noweb 插入会保留引用前的前缀字符。下例演示该行为:由于 ‘<<example>>’ 引用位于 SQL 注释符后,展开后的每一行都会被注释。给定:

#+NAME: example
#+BEGIN_SRC text
  this is the
  multi-line body of example
#+END_SRC

该代码块:

#+BEGIN_SRC sql :noweb yes
 ---<<example>>
#+END_SRC

展开为:

#+BEGIN_SRC sql :noweb yes
 ---this is the
 ---multi-line body of example
#+END_SRC

该行为不会影响不含换行的内联 noweb 引用,因此内联引用可以正常使用。

该特性也可用于管理导出代码片段的缩进。给定:

#+NAME: if-true
#+BEGIN_SRC python :exports none
print('do things when true')
#+end_src

#+name: if-false
#+begin_src python :exports none
print('do things when false')
#+end_src

该代码块:

#+begin_src python :noweb yes :results output
if true:
    <<if-true>>
else:
    <<if-false>>
#+end_src

展开为:

if true:
    print('do things when true')
else:
    print('do things when false')

在代码块中设置 ‘noweb-prefix’ 为 ‘no’ 可关闭此前缀行为,例如:

#+BEGIN_SRC elisp :noweb-prefix no
  (setq example-data "<<example>>")
#+END_SRC

展开为:

(setq example-data "this is the
multi-line body of example")

如不确定代码块展开后的结果,可使用以下命令预览

C-c C-v vC-c C-v C-v (org-babel-expand-src-block)

根据头参数展开当前代码块,并在预览缓冲区中显示结果。


16.12 Library of Babel

“Babel 库” 是一组代码块集合。与函数库类似,这些代码块可在其他 Org 文件中调用。Worg 网站提供了一批实用代码块库 Worg。远程代码块执行语法见 Evaluating Code Blocks

用户如需将代码加入库中,先将代码保存为 Org 文件中的普通代码块,再通过 org-babel-lob-ingest 加载该文件,其快捷键为 C-c C-v i


16.13 Key bindings and Useful Functions

许多常用 Org 快捷键会根据上下文重新绑定。

代码块内有效快捷键:

Key bindingFunction
C-c C-corg-babel-execute-src-block
C-c C-oorg-babel-open-src-block-result
M-UPorg-babel-load-in-session
M-DOWNorg-babel-pop-to-session

Org 缓冲区有效快捷键:

Key bindingFunction
C-c C-v p or C-c C-v C-porg-babel-previous-src-block
C-c C-v n or C-c C-v C-norg-babel-next-src-block
C-c C-v e or C-c C-v C-eorg-babel-execute-maybe
C-c C-v o or C-c C-v C-oorg-babel-open-src-block-result
C-c C-v v or C-c C-v C-vorg-babel-expand-src-block
C-c C-v u or C-c C-v C-uorg-babel-goto-src-block-head
C-c C-v g or C-c C-v C-gorg-babel-goto-named-src-block
C-c C-v r or C-c C-v C-rorg-babel-goto-named-result
C-c C-v b or C-c C-v C-borg-babel-execute-buffer
C-c C-v s or C-c C-v C-sorg-babel-execute-subtree
C-c C-v d or C-c C-v C-dorg-babel-demarcate-block
C-c C-v t or C-c C-v C-torg-babel-tangle
C-c C-v f or C-c C-v C-forg-babel-tangle-file
C-c C-v c or C-c C-v C-corg-babel-check-src-block
C-c C-v j or C-c C-v C-jorg-babel-insert-header-arg
C-c C-v l or C-c C-v C-lorg-babel-load-in-session
C-c C-v i or C-c C-v C-iorg-babel-lob-ingest
C-c C-v I or C-c C-v C-Iorg-babel-view-src-block-info
C-c C-v z or C-c C-v C-zorg-babel-switch-to-session-with-code
C-c C-v a or C-c C-v C-aorg-babel-sha1-hash
C-c C-v h or C-c C-v C-horg-babel-describe-bindings
C-c C-v x or C-c C-v C-xorg-babel-do-key-sequence-in-edit-buffer

16.14 Batch Execution

Org 模式的功能(包括代码块相关功能)可从命令行调用。这便于编写批处理脚本、执行自动化系统任务,扩展 Org 的用途。

以下示例脚本使用 org-babel-tangle 批量处理多个文件。

#!/bin/sh
# Tangle files with Org mode
#
emacs -Q --batch --eval "
    (progn
      (require 'ob-tangle)
      (dolist (file command-line-args-left)
        (with-current-buffer (find-file-noselect file)
          (org-babel-tangle))))
  " "$@"

17 Miscellaneous


17.1 Completion

Org 内置缓冲区补全功能。与适用于快速命令交互的小缓冲区补全不同,Org 的缓冲区补全更适合在 Org 文档中进行内容创作。输入一个或多个字母并触发快捷键,即可在当前位置补全文本。 根据上下文和按键不同,Org 会提供不同类型的补全,全程无需使用小缓冲区。这类针对特定模式的快捷键已成为 Emacs 的重要组成部分,Org 也提供了多项快捷操作。

M-TAB

补全光标处的单词。

  • 在空标题开头,补全 TODO 关键字。
  • 在 ‘\’ 之后,补全导出器支持的 TeX 符号。
  • 在标题中的 ‘:’ 之后,补全标签。Org 会从缓冲区的 ‘TAGS’ 选项(参见 Setting Tags)、变量 org-tag-alist 或当前缓冲区中使用过的所有标签中提取标签列表。
  • 在 ‘:’ 之后且不在标题中时,补全属性键。键列表由当前缓冲区中使用过的所有键动态构建。
  • 在 ‘[[’ 之后,补全链接缩写(参见 Link Abbreviations)。
  • 在 ‘[[*’ 之后,补全当前缓冲区中的标题,可用于形如 ‘[[*find this headline]]’ 的搜索链接。
  • 在 ‘#+’ 之后,补全 ‘TYP_TODO’ 或文件专属 ‘OPTIONS’ 等特殊关键字。关键字补全后,再次按下 M-TAB 会插入该关键字的示例设置。
  • 在 ‘STARTUP’ 关键字后,补全启动项。
  • 光标在其他位置时,通过 Ispell 补全词典单词。

17.2 Structure Templates

只需少量按键,即可插入空的结构块(如 ‘#+BEGIN_SRC’ … ‘#+END_SRC’ ),或将已有文本包裹在这类块中。

C-c C-, (org-insert-structure-template)

提示选择块结构类型,并在光标处插入对应块。若选中区域有效,则将该区域包裹在块内。首先提示用户输入按键,用于从下方变量中查找结构类型。若按键为 TABRETSPC,则提示输入块类型。

可用的结构类型在 org-structure-template-alist 中定义,添加或修改值可参考其文档字符串。

Org Tempo 可将代码片段展开为 org-structure-template-alistorg-tempo-keywords-alist 中定义的结构。例如,< s TAB 可创建代码块。通过自定义 org-modules 或在 Emacs 初始化文件中添加 ‘(require 'org-tempo)’ 即可启用161

a#+BEGIN_EXPORT ascii’ … ‘#+END_EXPORT
c#+BEGIN_CENTER’ … ‘#+END_CENTER
C#+BEGIN_COMMENT’ … ‘#+END_COMMENT
e#+BEGIN_EXAMPLE’ … ‘#+END_EXAMPLE
E#+BEGIN_EXPORT’ … ‘#+END_EXPORT
h#+BEGIN_EXPORT html’ … ‘#+END_EXPORT
l#+BEGIN_EXPORT latex’ … ‘#+END_EXPORT
q#+BEGIN_QUOTE’ … ‘#+END_QUOTE
s#+BEGIN_SRC’ … ‘#+END_SRC
v#+BEGIN_VERSE’ … ‘#+END_VERSE

17.3 Speed Keys

在 Org 文件中,当光标位于标题上时,单键即可执行自定义命令。无需额外使用 Meta 或修饰键,快捷按键可提升导航速度或执行自定义命令。除了加快导航外,快捷按键在没有完整键盘的小型移动设备上也很实用。在输入 Emacs 组合键存在问题的 TTY 设备上,快捷按键同样适用。

默认情况下,Org 禁用快捷按键。将变量 org-use-speed-commands 设置为非 nil 值即可启用。触发快捷按键时,光标必须位于 Org 标题开头,星号之前。

Org 内置预定义的快捷按键列表。添加或修改快捷按键可自定义选项 org-speed-commands ,详细说明参见变量文档字符串。启用快捷按键后,执行 M-x org-speed-command-help,或在 Org 标题开头按下 ?,即可显示当前生效的快捷按键(包括用户自定义按键)。


17.4 A Cleaner Outline View

Org 大纲带有星号且无缩进,在短文档中会显得杂乱。在类书籍的长文档中,这种效果则不明显。Org 提供了替代的星号与缩进方案,如下表右侧所示:仅显示一个星号,并将文本缩进与标题对齐。

* Top level headline             |    * Top level headline
** Second level                  |      * Second level
*** Third level                  |        * Third level
some text                        |          some text
*** Third level                  |        * Third level
more text                        |          more text
* Another top level headline     |    * Another top level headline

Org 可通过两种方式实现该效果:(1) 仅以此样式显示缓冲区而不修改内容;(2) 实际使用硬空格按所需缩进量缩进每一行并隐藏前导星号。


17.4.1 Org Indent Mode

通过执行 M-x org-indent-mode 启用 Org 缩进次要模式,即可按缩进视图显示缓冲区。非标题的文本行会添加虚拟空格,与标题文本垂直对齐162

为留出更多横向空间,标题会偏移两个字符。可通过配置 org-indent-indentation-per-level 变量调整偏移量。

默认情况下,Org 缩进模式会关闭 org-adapt-indentation~,并通过本地将 ~org-hide-leading-stars 设置为 t 来隐藏前导星号:每个标题仅显示一个星号,其余星号使用与背景相同的文本的视觉样式隐藏。如需自定义该默认行为,可参考 org-indent-mode-turns-on-hiding-starsorg-indent-mode-turns-off-org-adapt-indentation

要为所有文件全局启用 Org 缩进模式,请自定义变量 org-startup-indented 。 如需对单个文件进行控制,请按如下方式使用 ‘STARTUP’ 关键字:

#+STARTUP: indent
#+STARTUP: noindent

17.4.2 Hard indentation

若希望纯 ASCII 文件在 Emacs 外也呈现缩进效果,可使用硬空格实现缩进163。在 Org 支持下,需将所有行缩进至与大纲标题对齐,可使用以下设置164

(setq org-adapt-indentation t
      org-hide-leading-stars t
      org-odd-levels-only t)
标题下方文本缩进 (org-adapt-indentation)

第一项设置会修改段落填充、换行和结构编辑命令,以适当保留或适配缩进。

隐藏前导星号 (org-hide-leading-stars)

第二项设置通过对前导星号应用 org-hide 文本的视觉样式使其隐藏。针对单个文件,可使用以下 ‘STARTUP’ 选项:

#+STARTUP: hidestars
#+STARTUP: showstars
奇数层级 (org-odd-levels-only)

第三项设置使 Org 在大纲中仅使用奇数层级(1、3、5 …),以增加缩进量。单个文件可通过以下方式控制:

#+STARTUP: odd
#+STARTUP: oddeven

使用 M-x org-convert-to-odd-levelsM-x org-convert-to-oddeven-levels 可在文件的单星号与双星号布局间转换。


17.5 Execute commands in the active region

在 Org 缓冲区且选中区域有效时,部分命令会应用于选中区域内的所有子树。例如,选中区域包含多个标题时按下 C-c C-s,会依次提示设置新的计划日期和时间。将选项 org-loop-over-headlines-in-active-region 设置为非 t 可禁用该功能,此时选中区域后正常执行命令即可。

org-agenda-loop-over-headlines-in-active-region 是日程缓冲区的对应选项,在日程缓冲区中还可使用 批量编辑选中条目

并非所有命令都能在选中区域中循环执行,生效的子树或标题范围可进一步细化:更多细节参见这些选项的文档字符串。


17.6 Dynamic Headline Numbering

通过 M-x org-num-mode 切换 Org 编号次要模式,可在标题上方显示大纲编号,并在文档结构变更时自动更新。

默认情况下所有标题都会编号。可根据标题层级、标签、 ‘COMMENT’ 关键字或 ‘UNNUMBERED’ 属性限制编号范围,相应设置 org-num-max-levelorg-num-skip-tagsorg-num-skip-commentedorg-num-skip-unnumberedorg-num-skip-footnotes

org-num-skip-footnotes 为非 nil ,脚注章节(参见 Creating Footnotes)也不会编号。

通过设置 org-num-faceorg-num-format-function 可控制编号的显示样式。

将选项 org-startup-numerated 设置为 ‘t’ 可全局为所有 Org 文件启用该模式,单个文件可使用 ‘#+startup: num’ 本地启用。


17.7 The Very Busy C-c C-c Key

Org 中的 C-c C-c 按键根据上下文可执行多种功能,是 Org 中用途最多、功能最复杂的组合键。本手册各处均有详细说明,此处汇总列表方便查阅。

  • 若列视图(参见 Column View 已开启,退出列视图。
  • 若缓冲区中存在稀疏树创建或时钟显示产生的高亮,移除该高亮。
  • 若光标位于特殊 ‘KEYWORD’ 行,扫描缓冲区中此类行并更新信息,同时重置用于临时存储 ‘SETUPFILE’ 等关键字对应 URL 内容的 Org 文件缓存。
  • 若光标在表格内,重新对齐表格。
  • 若光标在 ‘TBLFM’ 关键字上,对整个表格重新应用公式。
  • 若当前缓冲区为捕获缓冲区,关闭笔记并归档。带前缀参数时,保存笔记后跳转到目标位置。
  • 若光标在 ‘<<<target>>>’ 上,更新缓冲区中的辐射目标及对应链接。
  • 若光标在属性行或属性抽屉开头/结尾,提供属性相关命令。
  • 若光标在脚注引用处,跳转到对应定义处,反之亦然。
  • 若光标在统计标记上,更新统计信息。
  • 若光标在带复选框的普通列表项上,切换复选框状态。
  • 若光标在普通列表的编号项上,重新为有序列表编号。
  • 若光标在动态块的 ‘#+BEGIN’ 行,更新该块。
  • 若光标在时间戳上,修正时间戳中的星期名称。

17.8 Summary of In-Buffer Settings

缓冲区设置以 ‘#+’ 开头,后接关键字、冒号、一个或多个空格,再为每个设置对应的单词。Org 支持同一行设置多个选项,也支持同一关键字使用多行。本手册各处均有相关说明,此处汇总如下。

C-c C-c 可使缓冲区设置的修改生效,在 Emacs 中关闭并重新打开 Org 文件也可生效。

#+ARCHIVE: %s_done::

设置日程文件的归档位置,对应变量为 org-archive-location

#+CATEGORY

设置日程文件的分类,应用于整个文档。

#+COLUMNS: %25ITEM ...

设置列视图的默认格式,该格式在无 ‘COLUMNS’ 属性的位置调用列视图时生效。

#+CONSTANTS: name1=value1 ...

为表格公式可用的常量设置文件本地值,该行设置本地变量 org-table-formula-constants-local ,全局版本为 org-table-formula-constants

#+FILETAGS: :tag1:tag2:tag3:

设置文件中所有条目(包括顶层条目)继承的标签。

#+LINK: linkword replace

每行定义一个链接缩写,多个缩写可使用多个 ‘LINK’ 关键字(参见 Link Abbreviations),对应变量为 org-link-abbrev-alist

#+PRIORITIES: highest lowest default

设置优先级的上下限与默认值,三者均为 A–Z 字母或 0–64 数字,最高优先级的 ASCII 码必须小于最低优先级。

#+PROPERTY: Property_Name Value

为当前缓冲区条目设置默认继承值,常用于指定属性的允许取值。

#+SETUPFILE: file

设置文件或对应 URL 用于额外的缓冲区设置。Org 打开主文件时会加载并解析该文件中的设置。若指定 URL,会下载内容并缓存至临时文件。在设置行执行 C-c C-c 可重新解析加载文件并重置临时文件缓存。

Org 正常导出时也会解析并加载设置文件中的缓冲区设置,如同其包含在当前 Org 缓冲区中,设置文件的其余内容会被忽略。

光标在设置文件名行时,按下 C-c ' 可打开设置文件(非 URL)。

#+STARTUP:

Org 首次打开文件时使用的启动选项。

第一组选项控制大纲树的初始可见性,全局默认设置对应变量为 org-startup-folded ,默认值为 showeverything

overview仅显示顶层标题。
content显示所有标题。
showall所有条目均不折叠。
show2levels显示 1–2 级标题。
show3levels显示 1–3 级标题。
show4levels显示 1–4 级标题。
show5levels显示 1–5 级标题。
showeverything显示抽屉内容。

动态虚拟缩进由变量 org-startup-indented 控制165

indent启动时开启 Org 缩进模式。
noindent启动时关闭 Org 缩进模式。

标题动态虚拟编号由变量 org-startup-numerated 控制。

num启动时开启 Org 编号模式。
nonum启动时关闭 Org 编号模式。

打开文件时统一对齐表格,对应变量为 org-startup-align-all-tables ,默认值为 nil

align对齐所有表格。
noalign启动时不对齐表格。

收缩带宽度标记的表格列,对应变量为 org-startup-shrink-all-tables ,默认值为 nil

打开文件时自动显示内嵌图片,对应变量为 org-startup-with-inline-images~,默认值为 ~nil 以避免打开文件时延迟。

inlineimages显示内嵌图片。
noinlineimages启动时不显示内嵌图片。

Org 缓冲区中的方括号链接默认隐藏路径与括号,例如 ‘[[https://orgmode.org][Org Website]]’ 仅显示 “Org Website”。也可完整显示链接,对应变量为 org-link-descriptive

descriptivelinks隐藏链接路径与括号。
literallinks完整显示链接。

可通过以下选项配置 TODO 事项关闭、重新打开及时钟区间的日志记录(参见变量 org-log-doneorg-log-note-clock-outorg-log-repeat )。

logdone事项标记为完成时记录时间戳。
lognotedone完成时记录时间戳与备注。
nologdone不记录事项完成状态。
logrepeat重置循环事项时记录时间。
lognoterepeat重置循环事项时记录备注。
nologrepeat不记录循环事项重置。
lognoteclock-out时钟退出时记录备注。
nolognoteclock-out时钟退出时不记录备注。
logreschedule计划时间变更时记录时间戳。
lognotereschedule计划时间变更时记录备注。
nologreschedule不记录计划时间变更。
logredeadline截止时间变更时记录时间戳。
lognoteredeadline截止时间变更时记录备注。
nologredeadline不记录截止时间变更。
logrefile重新归档时记录时间戳。
lognoterefile重新归档时记录备注。
nologrefile不记录重新归档操作。

以下选项用于隐藏大纲标题前导星号与设置大纲缩进,对应变量为 org-hide-leading-starsorg-odd-levels-only ,默认均为 nil (即 ‘showstars’ 和 ‘oddeven’ )。

hidestars标题仅显示一个星号,其余隐藏。
showstars显示标题所有前导星号。
indent按大纲层级虚拟缩进。
noindent不按大纲层级虚拟缩进。
odd仅使用奇数大纲层级(1、3…)。
oddeven使用所有大纲层级。

开启时间戳自定义格式覆盖(变量 org-display-custom-timesorg-timestamp-custom-formats )可使用:

customtime覆盖自定义时间格式。

以下选项影响表格电子表格(变量 constants-unit-system )。

constcgsconstants.el’ 使用厘米-克-秒单位制。
constSIconstants.el’ 使用国际单位制。

以下关键字用于设置脚注,对应变量为 org-footnote-define-inlineorg-footnote-auto-labelorg-footnote-auto-adjust

fninline行内定义脚注。
fnnoinline在独立章节定义脚注。
fnlocal在首次引用附近定义脚注,非行内。
fnprompt提示输入脚注标签。
fnauto自动创建 ‘[fn:1]’ 格式标签(默认)。
fnconfirm提供自动标签供编辑或确认。
fnadjust自动重编号并排序脚注。
nofnadjust不自动重编号排序脚注。
fnanon使用 ~org-footnote-new= 创建匿名脚注。

以下关键字用于启动时隐藏块或抽屉,对应变量为 org-hide-block-startuporg-hide-drawer-startup

hideblocks启动时隐藏所有起止块。
nohideblocks启动时不隐藏块。
hidedrawers启动时隐藏所有抽屉。
nohidedrawers启动时不隐藏抽屉。

实体以 UTF-8 字符显示由变量 org-pretty-entities 及以下关键字控制:

entitiespretty尽可能以 UTF-8 字符显示实体。
entitiesplain保持实体原始格式。
#+TAGS: TAG1(c1) TAG2(c2)

该行(支持多行)指定文件中有效的标签及(可选)对应的 快速标签选择 按键,对应变量为 org-tag-alist

#+TODO:’, ‘#+SEQ_TODO:’, ‘#+TYP_TODO:

设置当前文件中的 TODO 关键字及其解析规则,对应变量为 org-todo-keywords


17.9 Regular Expressions

Org 作为 Emacs 模式,使用 Elisp 正则表达式进行搜索、匹配和过滤。Elisp 正则表达式语法与部分通用标准略有差异,最明显的是或关系用 ‘\|’ 表示,匹配组用 ‘\(...\)’ 表示。例如字符串 ‘home\|work’ 可匹配 ‘home’ 或 ‘work’ 。

更多信息参见 Regular Expressions in Emacs


17.10 Org Syntax

由 Nicolas Goaziou 最初撰写的 Org 语法正式定义参考文档可在 Worg 草案 中查看。该文档定义了 Org 核心内部概念,如 “标题(headlines)”、“章节(sections)”、“附属关键字(affiliated keywords)”、“(高级)元素” 和 “对象(objects)”,Org 文档的每一部分均归属其中一类。

在缓冲区中执行以下命令可探索 Org 缓冲区的抽象结构:

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

该命令输出一个列表,以抽象结构表示缓冲区内容。导出引擎依赖该列表中的信息,大多数交互命令(如结构编辑)也依赖上下文的语法含义。

执行以下命令可检查文档语法:

M-x org-lint <RET>

该命令会执行多项检查以查找常见错误,在专用缓冲区中显示错误位置、描述及可信度(可能存在误报)。可通过以下按键操作检查结果:

C-j, TAB显示问题行
RET光标跳转到问题行
g重新检查文档
h隐藏同一检查器的所有结果
i后续检查不再显示此类结果
S按光标所在列排序结果

17.11 Context Dependent Documentation

在 Org 文件中按下 C-c C-x I,会根据光标处语法打开 Org 手册对应章节。例如在标题上使用该按键,会显示 “文档结构(Document Structure)” 章节。

按下 q 关闭 Info 框架。


17.12 Escape Character

有时需要编写形似 Org 语法但实际为纯文本的内容。Org 在部分场景使用特定转义字符:宏(参见 Macro Replacement)和链接(参见 Link Format)中的反斜杠,代码块与示例块(参见 Literal Examples)中的逗号。通用场景下建议使用零宽空格,可通过以下方式插入:

C-x 8 <RET> zero width space <RET>
C-x 8 <RET> 200B <RET>

例如,要在文档中原样显示 ‘[[1,2]]’ ,可输入:

[X[1,2]]

其中 ‘X’ 代表零宽空格字符。


17.13 Code Evaluation and Security Issues

与纯文本不同,运行代码存在风险,每个代码块的风险等同于可执行文件。因此 Org 默认添加多项确认提示,提醒普通用户避免意外运行不受信任的代码。

不常运行或编写代码块的用户,Org 默认设置已足够。部分用户可能希望调整提示以减少中断,以下是代码执行的相关风险说明。

Org 在以下场景执行代码:

源代码块

Org 导出时会执行 Org 文件中的源代码块,按下 C-c C-c 也可执行代码块。导出或运行代码块的用户仅应加载受信任来源的文件,谨慎自定义移除或修改默认安全措施的变量。

User Option: org-confirm-babel-evaluate

t 时,执行每个代码块前提示用户确认;为 nil 时,直接执行代码块不提示。若设置为自定义函数,Org 会以源代码语言和代码块内容为参数调用该函数,函数返回 tnil 决定是否提示,可通过该参数分别处理不同源代码语言。

以下示例实现不提示直接执行 ditaa 代码块:

(defun my-org-confirm-babel-evaluate (lang body)
  (not (string= lang "ditaa")))  ; 不提示 ditaa
(setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate)
执行 ‘shell’ 和 ‘elisp’ 链接

Org 有两种可直接执行代码的链接类型(参见 External Links)。由于代码不可见,这类链接存在潜在风险,因此 Org 遇到此类链接时会提示用户,相关自定义变量为:

执行 shell 链接前提示用户的函数。

执行 Emacs Lisp 链接前提示用户的函数。

表格公式

表格中的公式(参见 The Spreadsheet)由 Calc 解释器或 Emacs Lisp 解释器执行。


17.14 Interaction with Other Packages

本文档说明 Org 与其他 Emacs 包的兼容性及交互程度。


17.14.1 Packages that Org cooperates with

calc.el’ ,作者 Dave Gillespie

Org 使用 Calc 包在表格中实现电子表格功能(参见 The Spreadsheet)。Org 也使用 Calc 进行嵌入式计算。详见 GNU Emacs Calc Manual

constants.el’ ,作者 Carsten Dominik

Org 允许在表格公式中使用常量名称,也支持使用计算后缀表示单位,例如用 ‘M’ 表示兆(Mega)。如需使用标准常量集合,请安装 ‘constants’ 包。请安装该包的 2.0 版本,可从 https://github.com/cdominik/constants-for-Emacs 获取。Org 会检查函数 constants-get 是否已自动加载。安装说明位于 ‘constants.el’ 文件中。

cdlatex.el’ ,作者 Carsten Dominik

Org 模式可借助 CDLaTeX 包在 Org 文件中高效输入 LaTeX 片段。参见 Using CDLaTeX to enter math

imenu.el’ ,作者 Ake Stenhoff 与 Lars Lindberg

Imenu 基于文件中的条目索引创建动态菜单。Org 模式支持 Imenu 菜单,可通过模式钩子启用,示例如下:

(add-hook 'org-mode-hook
          (lambda () (imenu-add-to-menubar "Imenu")))

默认索引深度为两级,可通过选项 org-imenu-depth 修改该深度。

Org 仅在加载 Imenu 库之后打开的缓冲区中启用 Imenu 支持。如需在已打开的 Org 缓冲区中启用 Imenu,请重新加载 Org。

speedbar.el’ ,作者 Eric M. Ludla

Speedbar 包创建一个专用的 Emacs 框架,用于显示文件及文件中的索引项。Org 模式支持 Speedbar,用户可直接从 Speedbar 中深入浏览 Org 文件。在 Speedbar 框架中按下 <,可将日程相关命令作用于当前文件或指定子树。

table.el’ ,作者 Takaaki Ota

使用 Takaaki Ota 开发的 Emacs 表格包,可创建支持自动换行、跨列、跨行及对齐的复杂 ASCII 表格。Org 模式可识别此类表格并正确导出。按下 C-c ' 可在专用缓冲区中编辑这些表格,用法与 Org 代码块类似。由于与 Org 其他功能存在冲突,Takaaki Ota 格式的表格无法直接在 Org 缓冲区中编辑。

  • C-c '(~org-edit-special~)::

    编辑 ‘table.el’ 表格。光标位于 ‘table.el’ 表格内时生效。

  • C-c ~(~org-table-create-with-table.el~)::

    插入 ‘table.el’ 表格。若光标处已有表格,该命令会在 ‘table.el’ 格式与 Org 模式格式之间相互转换。相关转换限制请查阅命令 org-convert-table 的文档字符串。


17.14.2 Packages that conflict with Org mode

Emacs 中的 Shift 选择通过 Shift 键配合光标移动扩大选中区域,为默认设置。该功能与 Org 使用 S-<cursor> 修改时间戳、TODO 关键字、优先级、项目符号等冲突。由于 S-<cursor> 在特定上下文外无操作,Org 提供变量 org-support-shift-select 供自定义。Org 模式适配 Shift 选择的方式为:(i) 在特殊命令上下文外启用 Shift 选择;(ii) 即使光标跨越特殊上下文,也可扩展已有选中区域。

cua.el’ ,作者 Kim F. Storm

Org 快捷键绑定与 CUA 模式使用的 S-<cursor> 方向键存在冲突。若要让 Org 将这些按键让渡给 CUA 模式,可配置变量 org-replace-disputed-keys 。启用该配置后,Org 会在 Org 文件及日程缓冲区中重新映射下列按键,但日期选择过程中除外。

S-UPM-pS-DOWNM-n
S-LEFTM--S-RIGHTM-+
C-S-LEFTM-S--C-S-RIGHTM-S-+

遗憾的是,这些新按键更难记忆。若想使用其他替代按键,可查看变量 org-disputed-keys

ecomplete.el’ ,作者 Lars Magne Ingebrigtsen

Ecomplete 可在邮件缓冲区的地址标题行中提供 “智能(electric)” 地址补全功能。但 Orgtbl 模式会影响其正常工作:若邮件缓冲区中启用了 Orgtbl 模式,在地址标题行输入文本时将无法触发补全。如需使用 Ecomplete,请勿按照建议在邮件缓冲区中自动启用 Orgtbl 模式(参见 The Orgtbl Minor Mode),而应在填写完邮件标题后,根据需要在邮件正文手动开启 Orgtbl 模式。

filladapt.el’ ,作者 Kyle Jones

Org 模式在对段落、列表项及其他元素进行填充时会尝试执行合理处理。许多用户反馈同时使用 ‘filladapt.el’ 与 Org 模式时会出现问题,因此较为稳妥的做法是按如下方式禁用 filladapt:

(add-hook 'org-mode-hook 'turn-off-filladapt-mode)
viper.el’ ,作者 Michael Kifer

Viper 使用了 C-c / 按键,导致该按键无法触发 Org 模式对应的命令 org-sparse-tree 。你需要为该命令另行绑定按键,或通过以下配置在 viper-vi-global-user-map 中覆盖该按键:

(define-key viper-vi-global-user-map "C-c /" 'org-sparse-tree)
windmove.el’ ,作者 Hovav Shacham

该包同样使用 S-<cursor> 方向键,因此上文关于 CUA 模式的说明同样适用。若希望在 Org 模式未对 S-<cursor> 定义特殊功能的位置启用 windmove 功能,可在配置中添加如下代码:

;; 让 windmove 在 Org 模式下正常工作
(add-hook 'org-shiftup-final-hook 'windmove-up)
(add-hook 'org-shiftleft-final-hook 'windmove-left)
(add-hook 'org-shiftdown-final-hook 'windmove-down)
(add-hook 'org-shiftright-final-hook 'windmove-right)
yasnippet.el

Org 模式对 TAB 按键的绑定方式(绑定为 [tab] 而非 "\t" )会覆盖 YASnippet 对该按键的使用。下列代码可修复此问题:

(add-hook 'org-mode-hook
          (lambda ()
            (setq-local yas/trigger-key [tab])
            (define-key yas/keymap [tab] 'yas/next-field-or-maybe-expand)))

最新版本的 YASnippet 与 Org 模式兼容性不佳。若上述代码无法解决冲突,可先定义如下函数:

(defun yas/org-very-safe-expand ()
  (let ((yas/fallback-behavior 'return-nil)) (yas/expand)))

然后告知 Org 模式使用该函数:

(add-hook 'org-mode-hook
          (lambda ()
            (make-variable-buffer-local 'yas/trigger-key)
            (setq yas/trigger-key [tab])
            (add-to-list 'org-tab-first-hook 'yas/org-very-safe-expand)
            (define-key yas/keymap [tab] 'yas/next-field)))

17.15 Using Org on a TTY

Org 为无法对光标执行移动指令,以及无法使用带修饰键按键绑定的终端和现代移动设备,提供了备用按键绑定。其中部分替代方案可能会略显繁琐。用户可根据自身使用需求进一步自定义这些设置。例如,编辑时间戳常用的 S-<cursor>,改用组合键 C-c . 会更合适。

DefaultAlternative 1Speed keyAlternative 2
S-TABC-u TABC
M-LEFTC-c C-x llEsc LEFT
M-S-LEFTC-c C-x LL
M-RIGHTC-c C-x rrEsc RIGHT
M-S-RIGHTC-c C-x RR
M-UPC-c C-x uEsc UP
M-S-UPC-c C-x UU
M-DOWNC-c C-x dEsc DOWN
M-S-DOWNC-c C-x DD
S-RETC-c C-x c
M-RETC-c C-x mEsc RET
M-S-RETC-c C-x M
S-LEFTC-c LEFT
S-RIGHTC-c RIGHT
S-UPC-c UP
S-DOWNC-c DOWN
C-S-LEFTC-c C-x LEFT
C-S-RIGHTC-c C-x RIGHT
C-c C-,C-c C-x s

17.16 Protocols for External Access

Org 协议是一款用于从外部应用触发 Emacs 内自定义操作的工具。任何支持以 URL 为参数调用外部程序的应用,均可使用该功能。例如,你可以在网页浏览器中配置书签,将当前页面链接发送至 Org,并通过快速捕获功能创建笔记(见 Capture)。你也可以创建书签,让 Emacs 打开正在浏览的远程网站对应的本地源文件。

要在应用中使用 Org 协议,需要将 ‘org-protocol://’ 注册为合法的协议处理器。外部调用会通过 ‘emacsclient’ 命令传递给 Emacs,因此还需确保 Emacs 服务端正在运行。更具体地说,当应用执行调用:

emacsclient "org-protocol://PROTOCOL?key1=val1&key2=val2"

Emacs 会调用与 PROTOCOL 关联的处理器,并传入参数 ‘(:key1 val1 :key2 val2)’ 。

Org 协议内置三种预定义协议,详情见后续章节。可配置 org-protocol-protocol-alist 定义自定义协议。


17.16.2 The capture protocol

激活 “capture” 处理器会在 Emacs 中弹出 ‘Capture’ 缓冲区,并使用捕获模板。

emacsclient "org-protocol://capture?template=X&url=URL&title=TITLE&body=BODY"

要使用该功能,新建名称任意的书签,例如 ‘Org: capture’ ,并在 ‘Location’ 中输入:

javascript:location.href='org-protocol://capture?' +
      new URLSearchParams({
            template: 'x', url: window.location.href,
            title: document.title, body: window.getSelection()});
      void(0);

你可能见过另一种写法:

javascript:location.href='org-protocol://capture?template=x'+
      '&url='+encodeURIComponent(window.location.href)+
      '&title='+encodeURIComponent(document.title)+
      '&body='+encodeURIComponent(window.getSelection());void(0);

该写法比前一种稍显繁琐,但兼容 9.0–9.4 版本的旧版 Org。这些版本的 URI 解码器不支持将空格编码为 “+”。

要使用的捕获模板可在书签中指定(如上例中的 =X=)。若未指定,模板键由变量 org-protocol-default-template-key 设置。可用的模板占位符如下:

%:link          链接 URL
%:description   网页标题
%:annotation    等价于 [[%:link][%:description]]
%i              选中的文本

17.16.3 The open-source protocol

open-source 处理器用于在阅读文档时方便编辑本地源文件。为此,可创建一个地址如下的书签:

javascript:location.href='org-protocol://open-source?url='+
      encodeURIComponent(location.href);void(0)

变量 org-protocol-project-alist 用于将 URL 映射为本地文件名,具体方式为剔除 URL 末尾参数,将 :base-url 替换为 :working-directory ,并将 :online-suffix 替换为 :working-suffix 。例如,假设你在 ‘/home/user/worg’ 目录存有 ‘https://orgmode.org/worg/’ 内容的本地副本,可将 org-protocol-project-alist 设置如下:

(setq org-protocol-project-alist
      '(("Worg"
         :base-url "https://orgmode.org/worg/"
         :working-directory "/home/user/worg/"
         :online-suffix ".html"
         :working-suffix ".org")))

此时若你正在浏览 ‘https://orgmode.org/worg/org-contrib/org-protocol.html’ ,发现笔误或有改进文档的想法,只需点击该书签即可开始编辑。

但这类映射并非总能得到预期结果。假设你运营一个位于 ‘https://example.com/’ 的在线商店,本地源文件存放在 ‘/home/user/example/’ 。常见做法是让服务器通过单个文件处理所有商品,并对不匹配服务器现有文件的 URL 进行重写。这样一来,对 ‘https://example.com/print/posters.html’ 的请求,可能会在服务器上被重写为 ‘https://example.com/shop/products.php/posters.html.php’ 。 open-source 处理器通常无法找到 ‘/home/user/example/print/posters.html.php’ 文件,从而执行失败。

org-protocol-project-alist 中的条目可额外添加 :rewrites 属性。该属性为一个点对列表,每一项将一个正则表达式映射为相对于 :working-directory 的路径。

现在通过添加 :rewrites 规则,将 URL 映射到路径 ‘/home/user/example/products.php’ :

(setq org-protocol-project-alist
      '(("example.com"
         :base-url "https://example.com/"
         :working-directory "/home/user/example/"
         :online-suffix ".php"
         :working-suffix ".php"
         :rewrites (("example.com/print/" . "products.php")
                    ("example.com/$" . "index.php")))))

由于 ‘example.com/$’ 作为正则表达式使用,它会将 ‘https://example.com/’ 、 ‘https://www.example.com/’ 等地址映射到 ‘/home/user/example/index.php’ 。

:rewrites 规则仅在未匹配到任何现有文件名时,才会作为最后方案进行查找。

有两个函数可帮助你为 org-protocol-project-alist 填充有效内容: org-protocol-createorg-protocol-create-for-org 。后者适用于你正在编辑属于发布项目的 Org 文件时。


17.17 Org Crypt

Org Crypt 会加密条目的正文内容,但不会加密标题或属性。其底层使用 Emacs EasyPG 库 进行文件加解密,而 EasyPG 需要正确配置 GnuPG

带有 ‘crypt’ 标签的标题下方文本,在文件保存时会自动加密。如需使用其他标签,可自定义 org-crypt-tag-matcher 设置。

以下是在 Emacs 初始化文件中推荐的 Org Crypt 设置:

(require 'org-crypt)
(org-crypt-use-before-save-magic)
(setq org-tags-exclude-from-inheritance '("crypt"))

(setq org-crypt-key nil)
;; 用于加密的 GPG 密钥。
;; nil 表示无条件使用对称加密。
;; "" 表示除非标题设置 CRYPTKEY 属性,否则使用对称加密。

(setq auto-save-default nil)
;; 自动保存与 org-crypt.el 不兼容:因此如果你打算频繁使用 org-crypt.el,
;; 需要将其关闭。否则每次启动 Org 时都会出现烦人的提示。

;; 若仅在本地关闭,可插入如下内容:
;;
;; # -*- buffer-auto-save-file-name: nil; -*-

可以通过为不同标题指定 ‘CRYPTKEY’ 属性,使用不同密钥,例如:

* Totally secret :crypt:
  :PROPERTIES:
  :CRYPTKEY: 0x0123456789012345678901234567890123456789
  :END:

注意 ‘CRYPTKEY’ 属性仅在 org-crypt-keynil 时生效。若 org-crypt-keynil ,Org 会无条件使用对称加密。

将 ‘crypt’ 标签排除在继承之外,可避免已加密文本被重复加密。


17.18 Org Mobile

Org Mobile 是用于在 Emacs 与其他应用(如移动设备应用)之间同步 Org 文件的协议。它让依托于 “实体(real)” 计算机的 Org 系统支持离线查看与内容捕获。外部应用还可记录对已有条目的修改。

本附录介绍 Org 对兼容 Org Mobile 的日程视图格式的支持,同时说明如何在移动应用与计算机之间同步笔记等修改内容。

要在移动应用中修改标签和 TODO 状态,首先需要自定义变量 org-todo-keywordsorg-tag-alistorg-tag-persistent-alist 。这些变量应包含所有重要的标签和 TODO 关键字,即使 Org 文件中仅使用其中一部分。尽管移动应用应支持缓冲区内设置,但仅要求其理解这些变量中设置的 TODO 状态 集合 (见 Setting up keywords for individual files)和互斥标签(见 Setting Tags)。


17.18.1 Setting up the staging area

移动应用需要访问服务器166上的一个文件目录才能与 Emacs 交互。通过 org-mobile-directory 变量指定该目录位置。如果可以将该目录挂载到本地,直接将变量指向该目录即可:

(setq org-mobile-directory "~/orgmobile/")

此外,通过使用 TRAMP(见 TRAMP 用户手册), org-mobile-directory 可指向通过 SSH、SCP 或 DAVS 等方式访问的远程目录:

(setq org-mobile-directory "/davs:[email protected]:/org/webdav/")

若使用公共服务器,建议对文件进行加密。Org 还要求本地计算机安装 OpenSSL。开启加密功能时,需在移动应用和 Emacs 中设置相同密码。通过变量 org-mobile-use-encryption 设置密码167。注意即使移动应用已加密文件内容,文件名在本地计算机、服务器和移动设备的文件系统中仍可见。


17.18.2 Pushing to the mobile application

命令 org-mobile-push 会将 org-mobile-files 中列出的文件复制到中转目录。文件包含日程文件(见 org-agenda-files 列表)。可自定义 org-mobile-files 添加其他文件。文件名会以相对于 org-directory 的路径保存,因此所有文件应位于该目录内168

推送操作会创建一个特殊的 Org 文件 ‘agendas.org’ ,包含用户定义的自定义日程视图169

最后,Org 会写入文件 ‘index.org’ ,其中包含指向其他文件的链接。移动应用会首先从服务器读取该文件,确定需要下载哪些日程相关文件。为加快下载速度,应用通常只会读取校验和170发生变化的文件。


17.18.3 Pulling from the mobile application

命令 org-mobile-pull 会与服务器同步修改。具体来说,它首先拉取 Org 文件用于查看,随后将捕获的条目、标记或修改条目的指针追加到服务器上的 ‘mobileorg.org’ 文件。Org 最终会通过以下步骤将数据整合为收件箱文件格式:

  1. Org 将 ‘mobileorg.org171 中的所有条目移动并追加到 org-mobile-inbox-for-pull 变量指向的文件。该文件不应位于中转目录或服务器上。每条捕获条目和编辑事件都会成为收件箱文件中的顶层条目。
  2. 移动条目后,Org 会处理共享文件的修改。部分修改会直接应用,无需用户干预,例如标签、TODO 状态、标题和正文的修改。需要进一步处理的条目会被标记为 ‘FLAGGED’ 。Org 会在收件箱中为存在问题的条目添加错误提示,这些问题需要手动解决。
  3. Org 会为标记条目生成日程视图,供用户手动整理。对于标记条目中存储的笔记,当光标位于对应日程项上时,Org 会在回显区显示笔记内容。
    ?

    按下 ? 会在另一个框架中显示完整的标记笔记,并将其写入剪切板。如需将标记笔记保存为普通笔记,可使用 ? z C-y C-c C-c。连续按两次 ? 会执行三项操作:移除 ‘FLAGGED’ 标签;从属性栏中删除标记笔记;标记该条目的手动编辑完成。

在日程调度器中,? 会返回视图以完成标记条目的处理。注意这些条目可能不是最新状态,因为移动应用搜索的是上次拉取的文件。如需获取包含上次拉取后修改的更新日程视图,请再次执行拉取操作。


17.19 Drag and Drop & yank-media

Org 模式支持文件拖放(DnD)操作。默认情况下,Org 会询问用户如何处理拖入的文件:附加为附件、插入 ‘file:’ 链接或打开文件。可自定义 org-yank-dnd-method 设置默认拖放行为。

当拖放方式设为 “attach” 时,Org 会首先读取拖放元数据以决定附件处理方式。例如,从文件管理器拖入单个或多个文件时,Org 可通过复制或移动方式附加。

若 Org 无法从元数据判断附件处理方式,会使用 org-yank-dnd-default-attach-method 的设置172

从 Emacs 29 开始,Org 模式支持 yank-media 命令,可粘贴剪切板中的图片、文件管理器中的文件,以及从 LibreOffice Calc 复制的表格。

粘贴剪切板中的图片时,Org 会将图片保存到磁盘,并在 Org 缓冲区中插入图片链接。图片可保存为标题附件(默认)、全局指定目录,或函数返回的目录。保存位置由 org-yank-image-save-method 控制。

粘贴的图片会使用自动生成的名称保存。你可以自定义 org-yank-image-file-name-function ,让 Org 询问图片名称或修改命名规则。

粘贴从文件管理器复制的文件时,Org 遵循 org-yank-dnd-method 的设置。以此方式粘贴的图片文件,在执行 附加(attach) 操作时也遵循 org-yank-image-save-method 的设置。

从 LibreOffice Calc 复制的表格会粘贴为 Org 表格。


17.20 Repeating commands

开启 repeat-mode 后,只需按单个键即可重复执行标题移动、链接和块导航命令。例如,无需反复输入 C-c C-n,只需输入 C-c C-n n n n p u … 即可在不同标题间移动。按下不在映射中的按键时,会退出 repeat-mode 并执行对应按键的命令(更多细节见 Emacs 用户手册)。

默认情况下,以下命令在独立的按键映射中支持重复执行。

org-navigation-repeat-map

CommandKey bindingRepeat key
org-next-visible-headingC-c C-nn
org-previous-visible-headingC-c C-pp
org-forward-heading-same-levelC-c C-ff
org-backward-heading-same-levelC-c C-bb
org-up-headingC-c C-uu

org-block-navigation-repeat-map:

CommandKey bindingRepeat key
org-next-blockC-c M-ff
org-previous-blockC-c M-bb

org-link-navigation-repeat-map:

CommandKey bindingRepeat key
org-next-linkC-c C-x C-nn
org-previous-linkC-c C-x C-pp

Appendix A Hacking

本附录介绍用户可以用来扩展 Org 功能的一些方法。


A.1 Hooks

Org 提供大量钩子变量用于添加功能。Worg 项目维护了一份带文档的完整钩子列表,地址为 https://orgmode.org/worg/doc.html#hooks


A.2 Add-on Packages

多位开发者为 Org 编写了大量扩展包。其中部分包曾属于 ‘org-mode’ 代码仓库,现在托管在独立的 ‘org-contrib’ 仓库 此处。包含更多信息的 Worg 页面地址为:https://orgmode.org/worg/org-contrib/


A.5 Adding Export Backends

Org 的导出引擎便于编写新的后端。构建该引擎所依托的框架,让从现有后端派生新后端变得简单易行。

导出引擎的两个主要入口为: org-export-define-backendorg-export-define-derived-backend 。想要理解这些函数,可参考 ‘ox-latex.el’ (从零定义新后端的示例)和 ‘ox-beamer.el’ (从现有引擎派生的示例)。

从零创建新后端时,首先将其名称以符号形式存入由元素与导出函数组成的关联表;要让后端在导出调度器中可见,设置 :menu-entry 关键字;针对该后端的导出选项,设置 :options-alist

从现有后端创建新后端时,将 :translate-alist 设置为导出函数的关联表,该表会替换父后端的对应函数。

完整文档见 Worg 上的 Org 导出参考


A.6 Tables in Arbitrary Syntax

凭借 Orgtbl 在表格处理上的出色表现,用户经常提出在 LaTeX 等其他模式中使用 Org 表格功能的需求。若以通用方式实现,极易陷入复杂的自定义困境,还会背离 Orgtbl 所秉持的简洁初衷。不过可以通过另一种方案达到相同效果。

该方案实现一个自定义转换函数,对原生 Org 源表格进行处理,生成其他格式的表格。这种方式能保持运行良好的 Orgtbl 简洁性,将可能的复杂逻辑隔离在转换函数中。要支持更多外部表格格式,只需添加更多转换函数。同时,为新表格格式开发自定义转换函数的工作,也可交由最熟悉对应格式的人员完成。


A.6.1 Radio tables

无线表格是转换后表格的目标位置,与源表格不相邻。Org 会查找目标位置并插入转换后的表格。

定位目标位置的关键是标记 ‘BEGIN/END RECEIVE ORGTBL’ ,它们需以当前模式下注释的形式出现。若为 C 语言模式,则写法如下:

/* BEGIN RECEIVE ORGTBL table_name */
/* END RECEIVE ORGTBL table_name */

在源表格位置,Org 需要一行特殊指令,告知 Orgtbl 进行转换并查找插入转换后表格的目标位置,例如:

#+ORGTBL: SEND table_name translation_function arguments ...

table_name’ 为表格引用名称,与接收端标记中的名称一致; ‘translation_function’ 为执行转换的 Lisp 函数。该行末尾还可包含键值对参数,转换函数会以属性列表形式接收这些值。部分标准参数会在调用转换函数前被识别并处理:

:skip N

跳过表格前 N 行,水平线同样计入行数,需要跳过则包含在内。

:skipcols (n1 n2 ...)

需要跳过的列编号列表。Org 会先自动丢弃带计算标记的列,再将表格发送给转换函数,由函数按 ‘skipcols’ 设置跳过指定列。

为避免源表格在源文件编译或编辑时被改动,可采用以下策略:

  • 将表格放在块注释中,例如在 C 模式下用 ‘/*’ 和 ‘*/’ 包裹表格。
  • 将表格放在结束语句之后,例如 TeX 中的 \bye 或 LaTeX 中的 \end{document} 之后。
  • 编辑时对表格每行进行注释与取消注释操作,命令 M-x orgtbl-toggle-comment 可方便切换注释状态。

A.6.2 A LaTeX example of radio tables

要在 LaTeX 中包裹源表格,使用 ‘comment.sty173 提供的 ‘comment’ 环境,在文档头部添加 \usepackage{comment} 启用。Orgtbl 模式可通过命令 M-x orgtbl-insert-radio-table 插入无线表格框架174,该命令会提示输入表格名称。例如名称为 ‘salesfigures’ 时,模板会插入:

% BEGIN RECEIVE ORGTBL salesfigures
% END RECEIVE ORGTBL salesfigures
\begin{comment}
#+ORGTBL: SEND salesfigures orgtbl-to-latex
| | |
\end{comment}

行 ‘#+ORGTBL: SEND’ 告知 Orgtbl 模式使用函数 orgtbl-to-latex 将表格转为 LaTeX 格式,并插入到名为 ‘salesfigures’ 的目标(接收)位置。此时表格即可录入数据,还可使用电子表格功能175

% BEGIN RECEIVE ORGTBL salesfigures
% END RECEIVE ORGTBL salesfigures
\begin{comment}
#+ORGTBL: SEND salesfigures orgtbl-to-latex
| Month | Days | Nr sold | per day |
|-------+------+---------+---------|
| Jan   |   23 |      55 |     2.4 |
| Feb   |   21 |      16 |     0.8 |
| March |   22 |     278 |    12.6 |
#+TBLFM: $4=$3/$2;%.1f
% $ (可选额外美元符号,让字体高亮正常显示,见脚注)
\end{comment}

编辑完成后,C-c C-c 会将转换后的表格插入到目标位置的两个标记行之间。

对于手动编写的自定义表格,转换函数需要跳过源表格前两行,同时命令需拼接输出目标表格主体,不含表头与表尾。

\begin{tabular}{lrrr}
Month & \multicolumn{1}{c}{Days} & Nr.\ sold & per day\\
% BEGIN RECEIVE ORGTBL salesfigures
% END RECEIVE ORGTBL salesfigures
\end{tabular}
%
\begin{comment}
#+ORGTBL: SEND salesfigures orgtbl-to-latex :splice t :skip 2
| Month | Days | Nr sold | per day |
|-------+------+---------+---------|
| Jan   |   23 |      55 |     2.4 |
| Feb   |   21 |      16 |     0.8 |
| March |   22 |     278 |    12.6 |
#+TBLFM: $4=$3/$2;%.1f
\end{comment}

LaTeX 转换函数 orgtbl-to-latex 已内置在 Orgtbl 模式中,使用 ‘tabular’ 环境排版表格,并用 \hline 标记水平线。控制输出的额外参数见 Translator functions

:splice BOOLEAN

当 {{{var(BOOLEAN}}} 非 nil 时,仅返回表格主体行,不包裹在 ‘tabular’ 环境中,默认为 nil

:fmt FMT

包裹每个字段的格式字符串,需包含 ‘%s’ 表示原始字段值。例如用 ‘:fmt "$%s$"’ 为每个字段值包裹美元符号。格式也可使用带列号与格式的属性列表,例如 ‘:fmt (2 "$%s$" 4 "%s\\%%")’ 。也可使用单参数函数替代字符串,函数需返回格式化后的字符串。

:efmt EFMT

将数字以指数形式格式化,规范需包含两个 ‘%s’ 分别插入尾数与指数,例如 ‘"%s\\times10^{%s}"’ 。也可使用带列号与格式的属性列表,例如 ‘:efmt (2 "$%s\\times10^{%s}$" 4 "$%s\\cdot10^{%s}$")’ 。对值应用 EFMT 后,还会继续应用 FMT。可使用双参数函数替代字符串,默认不应用特殊格式。


A.6.3 Translator functions

Orgtbl 模式内置多种转换函数: orgtbl-to-csv (逗号分隔值)、 orgtbl-to-tsv (制表符分隔值)、 orgtbl-to-latexorgtbl-to-htmlorgtbl-to-texinfoorgtbl-to-unicodeorgtbl-to-orgtbl 。它们均基于通用转换函数 orgtbl-to-generic ,该函数将转换工作委托给各类导出后端。

通过 ‘ORGTBL SEND’ 行传递给函数的属性,优先级高于函数内部定义的属性。例如下面的语句将默认 LaTeX 行尾符 \\ 替换为 \\[2mm]

#+ORGTBL: SEND test orgtbl-to-latex :lend " \\\\[2mm]"

若要为新语言编写转换器,可定义转换函数,也可使用通用函数,如下例所示:用 ‘!BTBL!’ 和 ‘!ETBL!’ 标记表格起止,=!BL!= 和 ‘!EL!’ 标记行起止,使用制表符分隔字段:

(defun orgtbl-to-language (table params)
  "将 Orgtbl 模式的 TABLE 转换为指定语言格式。"
  (orgtbl-to-generic
   table
   (org-combine-plists
    '(:tstart "!BTBL!" :tend "!ETBL!" :lstart "!BL!" :lend "!EL!" :sep "\t")
    params)))

orgtbl-to-generic 函数的文档中列出了完整参数列表,这些参数均可传递给 orgtbl-to-latexorgtbl-to-texinfo 及其他使用该通用函数的工具。

对于复杂转换,可使用自定义转换函数替代通用转换函数。自定义函数必须接收两个参数并返回单个字符串,包含格式化后的表格:第一个参数为表格(每行是字段列表或符号 hline ),第二个参数为 ‘#+ORGTBL: SEND’ 行指定的参数构成的属性列表。欢迎将你的转换函数分享至 Org 用户邮件列表:


A.7 Dynamic Blocks

Org 支持在 Org 文档中使用 动态区块(dynamic blocks) 。它们和普通代码块一样使用起始和结束标记插入,但其内容会由用户自定义函数自动更新。

你可以使用 org-dynamic-block-insert-dblock 插入动态区块,该函数默认绑定到 C-c C-x x。例如,C-c C-x x c l o c k t a b l e RET 会插入一个自动更新工作时长的表格(见 Clocking Work Time)。

动态区块可以拥有名称和函数参数,语法与源代码块声明类似:

#+BEGIN: myblock :parameter1 value1 :parameter2 value2 ...
  ...
#+END:

以下命令用于更新动态区块:

C-c C-x C-u (org-dblock-update)

更新光标所在位置的动态区块。

C-u C-c C-x C-u

更新当前文件中的所有动态区块。

在更新动态区块前,Org 会先清除 ‘BEGIN’ 和 ‘END’ 标记之间的内容。随后 Org 读取 ‘BEGIN’ 行上的参数,并以属性列表形式传递给写入函数。动态区块原先的内容会从缓冲区中移除,并追加到属性列表的 :content 键下。

命名为 ‘myblock’ 的动态区块对应的写入函数命名规则为: org-dblock-write:myblock

下面是一个动态区块及其写入函数的示例,该函数会更新自身最后一次运行的时间:

#+BEGIN: block-update-time :format "on %m/%d/%Y at %H:%M"
  ...
#+END:

该动态区块的写入函数:

(defun org-dblock-write:block-update-time (params)
  (let ((fmt (or (plist-get params :format) "%d. %m. %Y")))
    (insert "Last block update at: "
            (format-time-string fmt))))

若要让 Org 文件中的动态区块始终保持最新,可将 org-update-all-dblocks 函数加入钩子,比如 before-save-hook 。如果文件未处于 Org 模式,该函数不会运行。

动态区块与其他区块一样,可通过 org-narrow-to-block 进行收缩显示。


A.8 Special Agenda Views

Org 提供专用钩子,用于进一步限制日程视图中的条目: agendaagenda*176todoalltodotagstags-todotags-tree 。 你可以指定一个自定义函数,对视图中每个匹配到的条目进行筛选判断。该函数也可以按需跳过任意数量的条目。

如需设置适用于所有日程视图的全局条件,可使用变量 org-agenda-skip-function-global 。Org 会将该全局条件与 org-agenda-skip-function 配合使用,实现自定义检索。

下面的示例定义了一个函数,用于创建只显示状态为 ‘waiting’ 的 TODO 条目的自定义视图。手动实现这一需求需要多步检索,而通过自定义视图可实现自动化:

该自定义函数会在子树中检索 ‘waiting’ 标签,匹配成功则返回 nil ;否则返回子树末尾位置,让检索从该处继续。

(defun my-skip-unless-waiting ()
  "Skip trees that are not waiting"
  (let ((subtree-end (save-excursion (org-end-of-subtree t))))
    (if (re-search-forward ":waiting:" subtree-end t)
        nil          ; 找到标签,不跳过
      subtree-end))) ; 未找到标签,从子树末尾继续检索

在自定义日程命令中使用该函数的方式如下:

(org-add-agenda-custom-command
 '("b" todo "PROJECT"
   ((org-agenda-skip-function 'my-skip-unless-waiting)
    (org-agenda-overriding-header "Projects waiting for something: "))))

注意,该配置同时将 org-agenda-overriding-header 绑定为更贴合该日程视图的描述性标题。

自定义检索时可对条目层级设置限制。这是 Org 中创建自定义检索的通用方式。若要包含所有层级,可使用 ‘LEVEL>0177。 随后可通过 org-agenda-skip-function 筛选匹配条目,该函数也支持直接使用 Lisp 表达式,例如 org-agenda-skip-entry-iforg-agenda-skip-subtree-if 。示例如下:

(org-agenda-skip-entry-if 'scheduled)

若当前条目已设置计划,则跳过。

(org-agenda-skip-entry-if 'notscheduled)

若当前条目未设置计划,则跳过。

(org-agenda-skip-entry-if 'deadline)

若当前条目设有截止日期,则跳过。

(org-agenda-skip-entry-if 'scheduled 'deadline)

若当前条目设有截止日期或已设置计划,则跳过。

(org-agenda-skip-entry-if 'todo '("TODO" "WAITING"))

若当前条目的 TODO 关键字为 TODO 或 WAITING,则跳过。

(org-agenda-skip-entry-if 'todo 'done)

若当前条目的 TODO 关键字为 DONE 状态,则跳过。

(org-agenda-skip-entry-if 'timestamp)

若当前条目包含任意时间戳(可能是截止日期或计划时间),则跳过。

(org-agenda-skip-entry-if 'regexp "regular expression")

若正则表达式在当前条目中匹配成功,则跳过。

(org-agenda-skip-entry-if 'notregexp "regular expression")

除非正则表达式在当前条目中匹配成功,否则跳过。

(org-agenda-skip-subtree-if 'regexp "regular expression")

功能同上,但会检查并跳过整个子树。

以下是不使用自定义函数、直接检索 ‘waiting’ 标签的示例:

(org-add-agenda-custom-command
 '("b" todo "PROJECT"
   ((org-agenda-skip-function '(org-agenda-skip-subtree-if
                                'regexp ":waiting:"))
    (org-agenda-overriding-header "Projects waiting for something: "))))

A.9 Speeding Up Your Agendas

当 Org 文件数量增多或体积变大时,部分日程命令运行速度会变慢。以下是提速技巧:

  • 减少 Org 日程文件数量,避免硬盘访问带来的性能损耗。
  • 减少已完成和已归档标题的数量,让日程中跳过这些内容的操作更快完成。
  • 关闭阻塞任务的暗淡显示效果:
    (setq org-agenda-dim-blocked-tasks nil)
    
  • 禁止启动时预加载日程缓冲区:
    (setq org-agenda-inhibit-startup t)
    
  • 关闭日程视图中的标签继承:
    (setq org-agenda-use-tag-inheritance nil)
    
  • 禁用部分属性的解析:
    (setq org-agenda-ignore-properties '(stats))
    

    该设置会关闭统计计数的解析与更新。

这些选项可单独应用于指定的日程视图。如需了解日程视图生成的更多细节,可查阅相关变量的文档字符串,以及 Worg 上专门介绍日程优化的页面 dedicated Worg page


A.10 Extracting Agenda Information

Org 提供可在 Emacs 批处理模式下调用的命令,用于获取日程内容。通过该命令行接口,可自动化生成日程并进行后续处理或打印。

org-batch-agenda 会以 ASCII 格式生成日程视图并输出到标准输出。该命令接受一个字符串参数。若参数为单个字符,Org 会将其作为 org-agenda-custom-commands 的按键,与日程调度器中可用的命令一致(见 The Agenda Dispatcher)。

以下命令行示例可直接将 TODO 列表发送至打印机:

emacs -batch -l ~/.emacs -eval '(org-batch-agenda "t")' | lpr

若字符串参数长度大于等于 2,Org 会将其作为标签/TODO 匹配条件。例如,以下命令行打印带有 ‘shop’ 标签、但不含 ‘NewYork’ 标签的条目:

emacs -batch -l ~/.emacs                                      \
      -eval '(org-batch-agenda "+shop-NewYork")' | lpr

动态修改参数的示例:

emacs -batch -l ~/.emacs                                      \
   -eval '(org-batch-agenda "a"                               \
           org-agenda-span (quote month)                      \
           org-agenda-include-diary nil                       \
           org-agenda-files (quote ("~/org/project.org")))'   \
   | lpr

该命令仅从 ‘~/org/projects.org’ 文件生成未来 30 天的日程。

如需结构化处理日程输出,可使用 org-batch-agenda-csv ,输出字段如下:

category

条目分类

head

标题,不含 TODO 关键字、标签和优先级

type

日程条目类型,可选值:

todo通过 TODO 匹配选中
tagsmatch通过标签匹配选中
diary从日记导入
deadline截止日期
scheduled计划时间
timestamp由时间戳选中的约会
closed在指定日期关闭的条目
upcoming-deadline截止日期临近提醒
past-scheduled顺延的计划条目
block包含对应日期块的条目
todo

TODO 关键字(如有)

tags

所有标签(含继承标签),以冒号分隔

date

相关日期,格式如 ‘2007-2-14

time

时间,格式如 ‘15:00-16:50

extra

包含额外计划信息的字符串

priority-l

优先级字母(如有)

priority-n

计算得出的数字优先级

如果议程项的筛选是基于时间戳(包括带有 ‘DEADLINE’ 和 ‘SCHEDULED’ 关键字的条目),那么 Org 会在输出中包含日期和时间。

如果议程项的筛选是基于时间戳(或截止日期 / 计划日期),那么 Org 会在输出中包含日期和时间。

以下是一个用 Perl 编写的后处理脚本示例。它读取 Emacs 输出的 CSV 内容,并以带复选框的形式打印出来:

#!/usr/bin/perl

# 定义要运行的 Emacs 命令
$cmd = "emacs -batch -l ~/.emacs -eval '(org-batch-agenda-csv \"t\")'";

# 执行命令并捕获输出
$agenda = qx{$cmd 2>/dev/null};

# 遍历所有行
foreach $line (split(/\n/,$agenda)) {
    # 拆分字段
    ($category,$head,$type,$todo,$tags,$date,$time,$extra,
     $priority_l,$priority_n) = split(/,/,$line);
    # 处理并打印
    print "[ ] $head\n";
}

A.11 Using the Property API

以下是用于操作属性的相关函数说明。

Function: org-entry-properties &optional pom which

获取光标或标记 POM 处条目的所有属性。包括 TODO 关键字、标签、截止日期与计划时间的时间字符串、计时信息,以及条目内定义的其他属性。返回值为关联列表。若属性键被多次使用,键名可重复出现。POM 可为 nil ,此时使用当前条目。若 WHICHnilall ,获取全部属性;若为 specialstandard ,仅获取对应子类属性。

Function: org-entry-get pom property &optional inherit

获取光标或标记 POM 处条目 PROPERTY 属性的值。默认仅检查条目本地定义的属性。若 INHERITnil 且条目无该属性,则向上层级查找。若 INHERIT 为符号 selective ,则仅当 org-use-property-inheritance 允许该属性 PROPERTY 继承时,才执行继承查找。

Function: org-entry-delete pom property

删除光标或标记 POM 处条目的 PROPERTY 属性。

Function: org-entry-put pom property value

Set PROPERTY to VALUES for entry at point-or-marker POM.

Function: org-buffer-property-keys &optional include-specials

获取当前缓冲区中的所有属性键。

Function: org-insert-property-drawer

为当前条目插入属性抽屉。

Function: org-entry-put-multivalued-property pom property &rest values

将光标或标记 POM 处的 PROPERTY 属性设为 VALUESVALUES 应为字符串列表,以空格分隔拼接。

Function: org-entry-get-multivalued-property pom property

PROPERTY 属性的值视为空白分隔的值列表,并以字符串列表形式返回。

Function: org-entry-add-to-multivalued-property pom property value

PROPERTY 属性的值视为空白分隔的值列表,确保 VALUE 存在于列表中。

Function: org-entry-remove-from-multivalued-property pom property value

PROPERTY 属性的值视为空白分隔的值列表,确保 VALUE 不在列表中。

Function: org-entry-member-in-multivalued-property pom property value

PROPERTY 属性的值视为空白分隔的值列表,检查 VALUE 是否在列表中。

User Option: org-property-allowed-value-functions

为特定属性提供可选值的函数钩子。函数接收属性名作为参数,返回可选值列表。若值包含 ‘:ETC’ ,则该列表仅用作补全提示,允许输入其他值。若函数不处理该属性,返回 nil


A.12 Using the Mapping API

Org 具备强大的映射遍历能力,可查找满足指定条件的所有条目。该功能内部用于生成日程视图,同时也提供 API,可对每个或筛选后的条目执行任意函数。该 API 的主入口为:

Function: org-map-entries func &optional match scope &rest skip

SCOPE 范围内,对 MATCH 选中的每个标题调用 FUNC

FUNC 为函数或 Lisp 表达式。光标会定位在标题开头,无参数调用该函数。Org 返回所有函数调用的返回值列表。

为不保留光标位置,Org 会在 save-excursion 中执行 FUNC。执行后光标移至刚处理行的行尾,检索从该位置继续。在部分场景下(如当前子树已被归档删除),该行为可能不符合预期,极少数情况下会错误跳过下一条目。如需避免此类问题,可让 FUNC 将变量 org-map-continue-from 设置为指定缓冲区位置。

MATCH 为标签/属性/TODO 匹配条件。Org 仅遍历匹配的标题;若为 nilt ,则遍历所有标题。

SCOPE 决定命令作用范围,可选值:

nil

当前缓冲区,遵循现有限制(如有)。

tree

以光标处条目为起点的子树。

region

活动区域内的条目(如有)。

file

当前缓冲区,无任何限制。

file-with-archives

当前缓冲区及其关联归档文件。

agenda

所有日程文件。

agenda-with-archives

所有日程文件及其关联归档文件。

文件名列表

若为文件名列表,则遍历列表中所有文件。

其余参数用作扫描器的跳过规则,有效参数:

archive

跳过带有 ‘ARCHIVE’ 标签的子树。

comment

跳过带有 COMMENT 关键字的子树。

函数 或 Lisp 形式

作为 org-agenda-skip-function 的值,当函数返回 t 时,对该条目执行 FUNC,并从函数停留位置继续检索。

映射遍历可调用任意函数,包括修改元数据或调用属性 API 的函数(见 Using the Property API)。常用函数如下:

Function: org-todo &optional arg

修改条目的 TODO 状态。参数 ARG 可用值较多,详见函数文档。

Function: org-priority &optional action

修改条目的优先级。ACTION 可用值详见函数文档。

Function: org-toggle-tag tag &optional onoff

切换当前条目的 TAG 标签。将 ONOFF 设为 onoff 不会切换,而是直接开启或关闭标签。

Function: org-promote

提升当前条目层级。

Function: org-demote

降低当前条目层级。

下面示例将所有带有 ‘TOMORROW’ 标签的条目设为 TODO 关键字 ‘UPCOMING’ ,并忽略注释子树和归档子树。

(org-map-entries '(org-todo "UPCOMING")
                 "+TOMORROW" 'file 'archive 'comment)

以下示例统计所有日程文件中 TODO 关键字为 ‘WAITING’ 的条目数量。

(length (org-map-entries t "/+WAITING" 'agenda))

Appendix B History and Acknowledgments

B.1 From Carsten

Org 诞生于 2003 年,源于我对 Emacs 大纲模式界面的不满。当时我想要整理笔记和项目,使用 Emacs 本是顺理成章的选择。但仅仅为了折叠和展开大纲树的部分内容,就要记住十一个不同的命令,每个命令还要两三个按键,这在我看来完全无法接受。 此外,用大纲记笔记时,我总希望能随时重构结构,让大纲与我的思路和计划同步。 可见性循环结构编辑 最初实现在 ‘outline-magic.el’ 包中,很快就迁移到更通用的 ‘org.el’ 中。 随着这套环境逐渐适合项目规划,我又陆续加入了 TODO 条目 、基础 时间戳表格支持 。这些方向也确立了 Org 至今仍在坚持的两大目标:打造一款基于大纲的纯文本新模式,拥有创新且易用的编辑功能;同时将项目规划能力直接整合到笔记文件中。

自首次发布以来,成千上万封发送给我或邮件列表 的邮件,源源不断地提供了漏洞反馈、使用建议、新功能思路,还有不少补丁与扩展代码。 衷心感谢所有帮助改进这款工具的人。我在此尽量列出对 Org 的一个或多个方面有重要影响的贡献者名单。名单或许并不完整,如果我遗漏了谁,敬请谅解并告知我。

在列出完整名单前,有几位需要特别致谢:

Bastien Guerry

Bastien 为 Org 编写了大量扩展(多数现已并入核心),包括 LaTeX 导出器和纯列表解析器。他在早期的支持对项目成功至关重要。他还创立了 Worg,协助搭建 Org 的官方网站,并承担 orgmode.org 的服务器费用。2011 至 2013 年,在我急需休整时,Bastien 接手担任了 Org 维护者。

Eric Schulte 和 Dan Davison

Eric 与 Dan 共同开发了 Org Babel 系统,让 Org 成为支持多语言代码执行、文学编程和可复现研究的环境。这已成为 Org 最具标志性的核心功能之一。

John Wiegley

John 直接为 Org 贡献了大量优秀思路与补丁,包括附件系统 (‘org-attach.el’)、与 Apple Mail 的集成 (‘org-mac-message.el’)、TODO 条目层级依赖、习惯追踪 (‘org-habits.el’) 和加密功能 (‘org-crypt.el’)。此外,捕获系统很大程度上扩展自他出色的 ‘remember.el’ 。

Sebastian Rose

没有 Sebastian,Org 的 HTML/XHTML 发布功能只会是业余水平的简陋实现。Sebastian 将这部分功能提升到了极高水准。他还编写了 ‘org-info.js’ ,一个用于展示 Org 衍生网页的 JavaScript 工具,提供类 Info 或折叠式界面与单键导航。

完整贡献者名单见下文!再次恳请告知我遗漏的内容!

B.2 From Bastien

我从 2011 年 1 月开始维护 Org,并于 2024 年 12 月正式卸任,由 Ihor Radchenko 接任成为新任维护者。最初几年我积极参与开发,之后随着新核心贡献者的加入,参与度逐渐降低,在此向他们致谢。

Eric Schulte

Eric 一直负责维护 Org 的 Babel 模块。他高效的响应让我无需担心该模块的漏洞问题,得以专注其他部分。

Nicolas Goaziou

Nicolas 负责维护 Org 底层核心的一致性。他在 ‘org-element.el’ 和 ‘ox.el’ 上的工作极为出色,为大量新功能与新思路打开了空间。他重写了旧版导出器,并协助完成相关文档。更重要的是,在 Org 8.0 的整个开发过程中,他始终可靠稳定。

Achim Gratz

Achim 重写了 Org 的构建流程,将一批临时脚本改造为稳定的构建系统。他耐心处理了这一变更给用户带来的诸多问题。

Nick Dokos

没有 Nick,Org 模式邮件列表不会如此友好。他无数次耐心帮助用户解决问题,这份贡献再怎么强调也不为过,也正是他让邮件列表保持活跃。

Kyle Meyer

Kyle 维护着 list.orgmode.org,并负责将 GNU Emacs 上游的改动反向移植到 Org 代码库。他还在邮件列表和私下交流中提供大量帮助,耐心解答问题、专业给出建议与解决方案。

Ihor Radchenko

Ihor 于 2024 年 12 月成为 Org 维护者,我非常感谢他愿意承担这份工作。他在邮件列表中响应迅速,致力于提升 Org 核心格式与工具生态,对需要实施的战略方向思路清晰,是社区的宝贵财富。

我得到了无数用户的支持,难以公平地一一列举,但上述几位是 Org 发展历程中不可或缺的人物。

当然,我也衷心感谢 Carsten 信任我,将 Org 维护工作交付于我。他始终如一的支持,让我在社区和代码开发中逐渐建立信心。

B.3 List of Contributions

Russell Adams 提出了抽屉的设计构想。

  • Thomas Baumann 编写了 ‘ol-bbdb.el’ 和 ‘ol-mhe.el’ 。
  • Christophe Bataillon 设计了 Org 官网使用的经典独角兽标志。
  • Alex Bochannek 提供了时间戳取整补丁。
  • Jan Böcker 编写了 ‘ol-docview.el’ 。
  • Brad Bozarth 实现了将 RSS 源数据导入 Org 文件的方法。
  • Tom Breton 编写了 ‘org-choose.el’ 。
  • Charles Cave 的建议推动了 Remember 模板的实现,该模板后来成为捕获模板。
  • Timothy E Chapman 在 2020 年全面改版 orgmode.org 网站,并协助修复多个漏洞。
  • Pavel Chalmoviansky 优化了日程对带精确时间条目的处理逻辑。
  • Gregory Chernov 为表格计算添加 Lisp 表达式支持,并改进 XEmacs 兼容性,尤其是移植了 ‘nouline.el’ 。
  • Sacha Chua 建议从 Planner 借鉴部分链接相关代码。
  • Baoqiu Cui 贡献了 DocBook 导出器。
  • Eddward DeVilla 提出并测试了复选框统计功能,还提出了属性系统及对应 API 的构想。
  • Nick Dokos 定位并修复了多个严重漏洞。
  • Kees Dullemond 曾直接用 HTML 编辑项目列表,启发了早期 HTML 导出功能,并提出表格宽列收缩需求。
  • Thomas S. Dye 贡献了 Worg 文档,并协助将 Babel 文档整合到手册。
  • Christian Egli 将文档转为 Texinfo 格式,设计了早期日程,为 HTML 导出添加 CSS 支持,并编写 ‘org-taskjuggler.el’ 。
  • David Emery 提供了 HTML 日程自定义 CSS 补丁。
  • Nic Ferrier 贡献了 mailcap 和 XOXO 支持。
  • Miguel A. Figueroa-Villanueva 实现了层级复选框。
  • John Foerch 实现了隐藏大纲中增量搜索的上下文显示。
  • Raimar Finken 编写了 ‘org-git-line.el’ 。
  • Mikael Fornius 担任邮件列表管理员。
  • Austin Frank 担任邮件列表管理员。
  • Eric Fraga 通过需求与测试推动 Beamer 导出功能开发。
  • Barry Gidden 为 Network Theory Ltd 出版的 Org 手册校对文字。
  • Niels Giesen 提出自动归档已完成子树的想法。
  • Nicolas Goaziou 重写了大部分纯列表相关代码。
  • Kai Grossjohann 指出与其他包的按键冲突问题。
  • Brian Gough(Network Theory Ltd)出版发行 Org 手册纸质版。
  • Bernt Hansen 推动循环任务、状态日志和时间表功能开发,并清晰讲解 Git 迁移相关内容。
  • Manuel Hermenegildo 提供多项功能建议、小修复与补丁。
  • Phil Jackson 编写了 ‘ol-irc.el’ 。
  • Scott Jaderholm 提出脚注、折叠间距控制和属性列视图。
  • Matt Jones 开发 MobileOrg Android 版。
  • Tokuya Kameshima 编写了 ‘org-wl.el’ 和 ‘org-mew.el’ 。
  • Shidai Liu (“Leo”) 提出内嵌 LaTeX 并参与测试,持续提供反馈与补丁。
  • Matt Lundin 提出表格公式末行引用与命名锚点,并长期维护 FAQ。
  • David Maus 编写 ‘org-atom.el’ ,维护 Org 问题清单,并在邮件列表提供大量专业回复。
  • Jason F. McBrayer 建议日程导出 CSV 格式。
  • Kyle Meyer 搭建 Org mailing listpublic-inbox 归档并修复大量漏洞。
  • Max Mikhanosha 提出归文件(refiling)功能构想。
  • Dmitri Minaev 提供按文件设置优先级上限的补丁。
  • Stefan Monnier 提供补丁修复 Emacs Lisp 编译警告。
  • Richard Moreland 开发 iPhone 版 MobileOrg。
  • Rick Moynihan 提出单文件多 TODO 序列和子树日程限制功能。
  • Todd Neal 提供 Info 文件和 Elisp 链接补丁。
  • Greg Newman 优化完善独角兽标志。
  • Tim O’Callaghan 提出文件内链接、文件链接搜索和标签功能。
  • Osamu Okano 编写 ‘orgcard2ref.pl’ 生成参考卡片文本。
  • Takeshi Okano 将手册和教程译为日语。
  • Oliver Oppitz 提出多状态 TODO 条目。
  • Scott Otterson 推动链接描述文本等功能实现。
  • Pete Phillips 参与标签功能开发并持续反馈。
  • Martin Pohlack 提供字符插入批量撤销优化代码。
  • Ihor Radchenko 协助漏洞修复与性能优化。
  • T. V. Raman 反馈漏洞并提出改进建议。
  • Matthias Rempe (Oelde) 提供需求、Windows 适配与质量测试。
  • Paul Rivier 实现命名脚注基础功能,并曾任邮件列表管理员。
  • Kevin Rogers 贡献远程 VM 文件访问代码。
  • Frank Ruell 修复 ‘keymapp nil’ 漏洞及与 ‘allout.el’ 冲突。
  • Jason Riedy 通用化 Orgtbl 表格收发机制。
  • Philip Rooke 制作 Org 参考卡片,提供大量反馈并规范文档。
  • Christian Schlauer 建议使用角括号包裹链接。
  • Paul Sexton 编写 ‘org-ctags.el’ 。
  • Tom Shannon 的 ‘organizer-mode.el’ 启发 VM/BBDB/Gnus 链接设计。
  • Ilya Shlyakhter 提出同级归档、示例行号和引用代码远程高亮。
  • Stathis Sideris 编写了 ‘ditaa.jar’ 这一 ASCII 转 PNG 转换工具。该工具在部分操作系统中以软件包形式提供,也可从 https://github.com/stathissideris/ditaa 下载。
  • Daniel Sinder 提出锁定子树实现内部归档的想法。
  • Dale Smith 提出链接缩写功能。
  • James TD Smith 贡献大量实用优化补丁。
  • Adam Spiers 提出全局链接命令、链接扩展系统和映射 API。
  • Ulf Stegemann 制作特殊符号多格式转换表。
  • Andy Stewart 为 ‘ol-w3m.el’ 贡献 HTML 转 Org 链接代码。
  • David O’Toole 编写 ‘org-publish.el’ 并起草发布章节。
  • Jambunathan K. 贡献 ODT 导出器。
  • Sebastien Vauban 反馈 LaTeX/Beamer 导出问题并启用 Gnus 代码高亮。
  • Stefan Vollmar 组织学术讲座并启发 HTML 概念索引功能。
  • Jürgen Vollmer 贡献 HTML 目录生成代码。
  • Samuel Wales 提供重要反馈与漏洞报告。
  • Chris Wallace 提供 ‘QUOTE’ 区块实现补丁。
  • David Wainberg 提出归档与链接系统改进建议。
  • Carsten Wimmer 提出修改建议并修复 Gnus 链接漏洞。
  • Roland Winkler 要求新增 TTY 环境按键绑定。
  • Piotr Zielinski 编写 ‘org-mouse.el’ ,提出日程区块并贡献代码。
  • Marco Wahl 编写 ‘ol-eww.el’ 。

Appendix C GNU Free Documentation License

Version 1.3, 3 November 2008
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
https://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See https://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

C.1 ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright (C)  YEAR  YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts.  A copy of the license is included in the section entitled ``GNU
Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:

with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


D Main Index

Jump to:   _   *   +  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z  

_
_ALL’ suffix, in propertiesProperty Syntax

*
*this*’, in ‘post’ header argumentResults of Evaluation

+
+’ suffix, in propertiesProperty Syntax

A
abbreviation, linksLink Abbreviations
abstract, in LaTeX exportSpecial blocks in LaTeX export
action, for publishingPublishing action
activationActivation
active regionStructure Editing
add-on packagesAdd-on Packages
agendaWeekly/daily agenda
agenda dispatcherAgenda Dispatcher
agenda filesAgenda Files
agenda files, removing buffersAgenda Commands
agenda filteringFiltering/limiting agenda items
agenda viewsAgenda Views
agenda views, customCustom Agenda Views
agenda views, exportingExporting Agenda Views
agenda views, exportingExporting Agenda Views
agenda views, main exampleStoring searches
agenda views, optimizationSpeeding Up Your Agendas
agenda views, user-definedSpecial Agenda Views
agenda, as an agenda viewsStoring searches
agenda, column viewAgenda Column View
agenda, pipeExtracting Agenda Information
agenda, with block viewsBlock agenda
agenda*, as an agenda viewsStoring searches
alignment in tablesColumn Width and Alignment
ALLTAGS’, special propertySpecial Properties
ALT_TITLE’, propertyTable of Contents
ALT_TITLE’, propertyHeadings and sectioning structure
angle bracket linksLink Format
angular brackets, around linksExternal Links
anniversaries, from BBDBWeekly/daily agenda
API, for mappingUsing the Mapping API
API, for propertiesUsing the Property API
APPENDIX’, propertyHeadings and sectioning structure
appointmentTimestamps
appointmentWeekly/daily agenda
appointment remindersWeekly/daily agenda
APPT_WARNTIME, keywordWeekly/daily agenda
appt.elWeekly/daily agenda
archive locationsMoving subtrees
ARCHIVE’, keywordMoving subtrees
ARCHIVE’, keywordIn-buffer Settings
ARCHIVE’, propertyProperty Inheritance
ARCHIVE, propertyMoving subtrees
ARCHIVE’, tagInternal archiving
archived entries, in agenda viewsAgenda Views
archivingRefiling and Archiving
archivingArchiving
arguments, in code blocksEnvironment of a Code Block
ASCII exportASCII/Latin-1/UTF-8 export
ASCII’, keywordASCII/Latin-1/UTF-8 export
Atom feedsCapture and Attachments
Atom feedsRSS Feeds
attach from DiredAttach from Dired
attachment linksExternal Links
attachment links, searchingSearch Options
attachmentsCapture and Attachments
attachmentsAttachments
ATTR_ASCII’, keywordASCII/Latin-1/UTF-8 export
ATTR_BEAMER’, keywordBeamer specific syntax
ATTR_HTML’, keywordLinks in HTML export
ATTR_HTML’, keywordTables in HTML export
ATTR_HTML’, keywordImages in HTML export
ATTR_LATEX’, keywordImages in LaTeX export
ATTR_LATEX’, keywordPlain lists in LaTeX export
ATTR_LATEX’, keywordSource blocks in LaTeX export
ATTR_LATEX’, keywordExample blocks in LaTeX export
ATTR_LATEX’, keywordSpecial blocks in LaTeX export
ATTR_LATEX’, keywordHorizontal rules in LaTeX export
ATTR_LATEX’, keywordVerse blocks in LaTeX export
ATTR_LATEX’, keywordQuote blocks in LaTeX export
ATTR_ODT’, keywordTables in ODT export
ATTR_ODT’, keywordImages in ODT export
ATTR_ODT’, keywordImages in ODT export
ATTR_ODT’, keywordAdvanced topics in ODT export
ATTR_TEXINFO’, keywordPlain lists in Texinfo export
ATTR_TEXINFO’, keywordTables in Texinfo export
ATTR_TEXINFO’, keywordImages in Texinfo export
ATTR_TEXINFO’, keywordQuotations in Texinfo export
ATTR_TEXINFO’, keywordSpecial blocks in Texinfo export
authorFeedback
AUTHOR’, keywordExport Settings
author’, macroMacro Replacement
auto clocking out after idle timeResolving idle time
auto-save, in code block editingEditing Source Code
autoloadActivation

B
babel, languagesLanguages
babel, library ofLibrary of Babel
backslashes, in linksLink Format
backtrace of an errorFeedback
BBDB linksExternal Links
BBDB, anniversariesWeekly/daily agenda
Beamer exportBeamer Export
BEAMER_ACT’, propertyFrames and Blocks in Beamer
BEAMER_COL’, propertyFrames and Blocks in Beamer
BEAMER_ENV’, propertyFrames and Blocks in Beamer
BEAMER_FONT_THEME’, keywordBeamer specific export settings
BEAMER_HEADER’, keywordBeamer specific export settings
BEAMER_INNER_THEME’, keywordBeamer specific export settings
BEAMER_OPT’, propertyFrames and Blocks in Beamer
BEAMER_OUTER_THEME’, keywordBeamer specific export settings
BEAMER_REF’, propertyFrames and Blocks in Beamer
BEAMER_SUBTITLE’, propertyFrames and Blocks in Beamer
BEAMER_THEME’, keywordBeamer specific export settings
BEAMER’, keywordBeamer specific syntax
BEGIN clocktableThe clock table
BEGIN columnviewCapturing column view
BEGIN_CENTERParagraphs
BEGIN_COMMENTComment Lines
BEGIN_EXAMPLELiteral Examples
BEGIN_EXPORT asciiASCII/Latin-1/UTF-8 export
BEGIN_EXPORT beamerBeamer specific syntax
BEGIN_EXPORT htmlQuoting HTML tags
BEGIN_EXPORT latexQuoting LaTeX code
BEGIN_EXPORT texinfoQuoting Texinfo code
BEGIN_JUSTIFYLEFTASCII/Latin-1/UTF-8 export
BEGIN_JUSTIFYRIGHTASCII/Latin-1/UTF-8 export
BEGIN_QUOTEParagraphs
BEGIN_SRCLiteral Examples
BEGIN_SRCStructure of Code Blocks
BEGIN_VERSEParagraphs
bibliographyCitations
BIBLIOGRAPHY’, keywordCitations
BIND’, keywordExport Settings
block agendaBlock agenda
BLOCKED’, special propertySpecial Properties
blocking, of checkboxesCheckboxes
blocks, foldingBlocks
bold text, markup rulesEmphasis and Monospace
boolean logic, for agenda searchesMatching tags and properties
bracket linksLink Format
bug reportsFeedback

C
C-c C-c, overviewThe Very Busy C-c C-c Key
cache results of code evaluationEvaluating Code Blocks
cache’, header argumentEvaluating Code Blocks
Calc packageThe Spreadsheet
calc.elCooperation
calculations, in tablesBuilt-in Table Editor
calculations, in tablesThe Spreadsheet
calendar commands, from agendaAgenda Commands
calendar integrationWeekly/daily agenda
calendar, for selecting dateThe date/time prompt
CALL’, keywordEvaluating Code Blocks
CAPTION’, keywordCaptions
CAPTION’, keywordTables in HTML export
CAPTION’, keywordImages in HTML export
captions, markup rulesCaptions
captureCapture and Attachments
captureCapture
capture protocolThe capture protocol
capturing, from agendaAgenda Commands
categoryCategories
category filtering, in agendaFiltering/limiting agenda items
category, for tags/property matchMatching tags and properties
CATEGORY’, keywordCategories
CATEGORY’, keywordIn-buffer Settings
CATEGORY’, propertyProperty Inheritance
CATEGORY’, propertyCategories
CDLaTeXCDLaTeX mode
cdlatex.elCooperation
center blocksParagraphs
center image in LaTeX exportImages in LaTeX export
change agenda displayAgenda Commands
checkbox blockingCheckboxes
checkbox statisticsCheckboxes
checkboxesCheckboxes
checkboxes and TODO dependenciesTODO dependencies
children, subtree visibility stateGlobal and local cycling
CINDEX’, keywordIndices
citationCitation handling
citation processorCitation handling
CITE_EXPORT’, keywordCitation export processors
CLASS’, propertyiCalendar Export
clean outline viewClean View
CLOCK_MODELINE_TOTAL’, propertyClocking commands
clocking timeClocking Work Time
CLOCKSUM_T’, special propertySpecial Properties
CLOCKSUM_T’, special propertyAgenda Column View
CLOCKSUM’, special propertySpecial Properties
CLOCKSUM’, special propertyAgenda Column View
clocktable, dynamic blockThe clock table
CLOSED’, special propertySpecial Properties
code block, batch executionBatch Execution
code block, editingEditing Source Code
code block, evaluatingEvaluating Code Blocks
code block, exportingExporting Code Blocks
code block, extracting source codeExtracting Source Code
code block, key bindingsKey bindings and Useful Functions
code block, languagesLanguages
code block, libraryLibrary of Babel
code block, noweb referenceNoweb Reference Syntax
code block, results of evaluationResults of Evaluation
code block, structureStructure of Code Blocks
code line references, markup rulesLiteral Examples
code text, markup rulesEmphasis and Monospace
colnames’, header argumentEnvironment of a Code Block
column formulaColumn formulas
column view, for propertiesDefining columns
column view, in agendaAgenda Column View
column, of field coordinatesReferences
COLUMNS’, keywordScope of column definitions
COLUMNS’, propertyProperty Inheritance
COLUMNS’, propertyIn-buffer Settings
comma escape, in literal examplesLiteral Examples
commands, in agenda bufferAgenda Commands
comment blockComment Lines
comment linesComment Lines
comment treesComment Lines
comment treesExtracting Source Code
commented entries, in agenda viewsAgenda Views
comments’, header argumentExtracting Source Code
completion, of dictionary wordsCompletion
completion, of file namesHandling Links
completion, of link abbreviationsCompletion
completion, of linksHandling Links
completion, of option keywordsPer-file keywords
completion, of option keywordsCompletion
completion, of property keysCompletion
completion, of tagsSetting Tags
completion, of tagsCompletion
completion, of TeX symbolsCompletion
completion, of TODO keywordsWorkflow states
completion, of TODO keywordsCompletion
concept index, in Texinfo exportIndices
constants, in calculationsReferences
CONSTANTS’, keywordReferences
CONSTANTS’, keywordIn-buffer Settings
constants.elCooperation
contactFeedback
contents, global visibility stateGlobal and local cycling
continuous clockingResolving idle time
control code block evaluationEvaluating Code Blocks
convertAdvanced topics in ODT export
converterAdvanced topics in ODT export
COOKIE_DATA’, propertyBreaking Down Tasks
COOKIE_DATA’, propertyCheckboxes
coordinates, of fieldReferences
copying notesRefiling and Archiving
copying notesRefile and Copy
copying, of subtreesStructure Editing
COPYING’, propertyTexinfo title and copyright page
countdown timerTimers
counter, macroMacro Replacement
CREATOR’, keywordExport Settings
CSS, for HTML exportCSS support
cua.elConflicts
custom agenda viewsCustom Agenda Views
custom date/time formatCustom time format
custom search stringsCustom Searches
CUSTOM_ID’, propertyInternal Links
CUSTOM_ID’, propertyHandling Links
cutting, of subtreesStructure Editing
cycling, in plain listsPlain Lists
cycling, of agenda filesAgenda Files
cycling, of TODO statesTODO Basics
cycling, visibilityVisibility Cycling

D
daily agendaWeekly/daily agenda
dash, special symbolSpecial Symbols
data type index, in Texinfo exportIndices
date format, customCustom time format
date rangeTimestamps
date stampDates and Times
date stampsTimestamps
date treeTemplate elements
DATE’, keywordExport Settings
date’, macroMacro Replacement
date, reading in minibufferThe date/time prompt
datesDates and Times
DEADLINE’ markerDeadlines and Scheduling
DEADLINE’, special propertySpecial Properties
deadlinesTimestamps
debugging, of table formulasEditing and debugging formulas
default header arguments per languageUsing Header Arguments
defining new protocolsProtocols
demotion, of subtreesStructure Editing
dependencies, of TODO statesTODO dependencies
DESCRIPTION’, keywordBeamer specific export settings
DESCRIPTION’, keywordHTML specific export settings
DESCRIPTION’, keywordLaTeX specific export settings
DESCRIPTION’, keywordODT specific export settings
DESCRIPTION’, propertyHeadings and sectioning structure
DESCRIPTION’, propertyiCalendar Export
diary entries, creating from agendaAgenda Commands
diary integrationWeekly/daily agenda
diary style timestampsTimestamps
dictionary word completionCompletion
dir’ file, in Texinfo exportInfo directory file
dir’, header argumentEnvironment of a Code Block
DIR’, propertyAttachment defaults and dispatcher
DIR’, propertyAttachment defaults and dispatcher
directories, for publishingSources and destinations
dispatcher, for export commandsThe Export Dispatcher
dispatching agenda commandsAgenda Dispatcher
display changing, in agendaAgenda Commands
dndDrag and Drop & yank-media
doc, docx, rtfAdvanced topics in ODT export
document structureDocument Structure
document titleExport Settings
documentationDocumentation Access
DONE, final TODO keywordPer-file keywords
drag and dropDrag and Drop & yank-media
dragging filesDrag and Drop & yank-media
drawer, for propertiesProperty Syntax
drawer, for state change recordingTracking TODO state changes
drawersDrawers
dropping filesDrag and Drop & yank-media
duration, computingDurations and time values
dvipngMath formatting in HTML export
dvipngLaTeX math snippets
dvisvgmMath formatting in HTML export
dvisvgmLaTeX math snippets
dynamic blocksDynamic Blocks
dynamic indentationClean View

E
ecomplete.elConflicts
editing tablesTables
editing, of table formulasEditing and debugging formulas
edits, catching invisibleCatching invisible edits
effort estimatesEffort Estimates
effort filtering, in agendaFiltering/limiting agenda items
EFFORT’, propertyEffort Estimates
Elisp linksExternal Links
ellipsis, special symbolSpecial Symbols
ELPAActivation
EMAIL’, keywordExport Settings
email’, macroMacro Replacement
embedding images in ODTImages in ODT export
entitiesSpecial Symbols
enum, Texinfo attributePlain lists in Texinfo export
epilogue’, header argumentEnvironment of a Code Block
escape characterEscape Character
escape syntax, for linksLink Format
eval’, header argumentEvaluating Code Blocks
evaluate time rangeCreating Timestamps
example blockLiteral Examples
example blocks, in LaTeX exportExample blocks in LaTeX export
EXCLUDE_TAGS’, keywordExport Settings
excluding entries from table of contentsTable of Contents
export back-endExporting
export backendExporting
EXPORT_FILE_NAME’, keywordExport Settings
EXPORT_FILE_NAME’, propertyODT export commands
EXPORT_LATEX_CLASS_OPTIONS’, propertyLaTeX header and sectioning
EXPORT_LATEX_CLASS’, propertyLaTeX header and sectioning
export, dispatcherThe Export Dispatcher
export, include filesInclude Files
export, OpenDocumentOpenDocument Text Export
Export, settingsExport Settings
Export, writing backendsAdding Export Backends
exportingExporting
exporting agenda viewsExporting Agenda Views
exporting, notComment Lines
exports’, header argumentExporting Code Blocks
extended TODO keywordsTODO Extensions
external archivingMoving subtrees
external linksExternal Links
external links, in HTML exportLinks in HTML export

F
faces, for TODO keywordsFaces for TODO keywords
FAQSummary
feature requestsFeedback
feedbackFeedback
field coordinatesReferences
field formulaField and range formulas
field referencesReferences
file linksExternal Links
file links, searchingSearch Options
file name completionHandling Links
file-desc’, header argumentResults of Evaluation
file-ext’, header argumentResults of Evaluation
file-mode’, header argumentResults of Evaluation
file’, header argumentResults of Evaluation
FILE’, special propertySpecial Properties
files for agendaAgenda Files
files, adding to agenda listAgenda Files
files, selecting for publishingSelecting files
FILETAGS’, keywordTag Inheritance
FILETAGS’, keywordIn-buffer Settings
filladapt.elConflicts
filtering entries, in agendaFiltering/limiting agenda items
Filters, exportingAdvanced Export Configuration
FINDEX’, keywordIndices
FLAGGED’, tagPulling from the mobile application
folded, subtree visibility stateGlobal and local cycling
folding, sparse treesSparse Trees
following linksHandling Links
footers, in code blocksEnvironment of a Code Block
footnotesCreating Footnotes
format specifier, in spreadsheetFormula syntax for Calc
format, of linksLink Format
formatter’, dynamic block parameterCapturing column view
formatting source code, markup rulesLiteral Examples
formula debuggingEditing and debugging formulas
formula editingEditing and debugging formulas
formula syntax, CalcFormula syntax for Calc
formula, for individual table fieldField and range formulas
formula, for range of fieldsField and range formulas
formula, for table columnColumn formulas
formula, in tablesBuilt-in Table Editor
function index, in Texinfo exportIndices

G
global cyclingGlobal and local cycling
global key bindingsActivation
global TODO listGlobal TODO list
global visibility statesGlobal and local cycling
Gnus linksExternal Links
graph, in tablesOrg Plot
group tagsTag Hierarchy
group tags, as regular expressionsMatching tags and properties
grouping columns in tablesColumn Groups

H
habitsTracking your habits
hackingHacking
header arguments per languageUsing Header Arguments
header arguments, in code blocksStructure of Code Blocks
header lines, in tablesBuilt-in Table Editor
header, for LaTeX filesLaTeX header and sectioning
HEADER’, keywordUsing Header Arguments
headers, in code blocksEnvironment of a Code Block
headline navigationMotion
headline taggingTags
headline, promotion and demotionStructure Editing
headlinesHeadlines
headlines, in HTML exportHeadlines in HTML export
Help linksExternal Links
hide textVisibility Cycling
hiding leading starsClean View
hlines’, header argumentResults of Evaluation
hooksHooks
horizontal rule, in tablesBuilt-in Table Editor
horizontal rules, in ASCII exportASCII/Latin-1/UTF-8 export
horizontal rules, in LaTeX exportHorizontal rules in LaTeX export
horizontal rules, markup rulesHorizontal Rules
HTML exportHTML Export
HTML export, CSSCSS support
HTML_CONTAINER_CLASS’, propertyCSS support
HTML_CONTAINER’, keywordHTML specific export settings
HTML_DOCTYPE’, keywordHTML specific export settings
HTML_HEAD_EXTRA’, keywordHTML specific export settings
HTML_HEAD_EXTRA’, keywordCSS support
HTML_HEAD’, keywordHTML specific export settings
HTML_HEAD’, keywordCSS support
HTML_HEADLINE_CLASS’, propertyCSS support
HTML_INCLUDE_STYLE’, keywordCSS support
HTML_LINK_HOME’, keywordHTML specific export settings
HTML_LINK_UP’, keywordHTML specific export settings
HTML_MATHJAX’, keywordHTML specific export settings
html-style’, ‘OPTIONS’ itemCSS support
HTML, and Orgtbl modeTranslator functions
HTML’, keywordQuoting HTML tags
HTML5’, export new elementsHTML doctypes
hyperlinksHyperlinks
hyperlinks, adding new typesAdding Hyperlink Types
hyperlinks, adding preview behaviorAdding Hyperlink preview

I
ICAL-TTL’, keywordiCalendar Export
iCalendar exportiCalendar Export
id links, searchingSearch Options
ID’, propertyHandling Links
ID’, propertyCapturing column view
ID’, propertyiCalendar Export
ideasFeedback
identify, ImageMagickImages in ODT export
idle, resolve, danglingResolving idle time
image, centering in LaTeX exportImages in LaTeX export
ImageMagickMath formatting in HTML export
ImageMagickLaTeX math snippets
images, embedding in ODTImages in ODT export
images, inline in HTMLImages in HTML export
images, inline in LaTeXImages in LaTeX export
images, markup rulesImages
imenu.elCooperation
in-buffer settingsIn-buffer Settings
inactive timestampTimestamps
include files, during exportInclude Files
INCLUDE’, keywordInclude Files
Indent modeOrg Indent Mode
indentation, in code blocksEditing Source Code
indentation, in source blocksLiteral Examples
index, in a publishing projectGenerating an index
INDEX’, keywordGenerating an index
INDEX’, propertyIndices
indic, Texinfo attributePlain lists in Texinfo export
InfoDocumentation Access
Info directory file, in Texinfo exportInfo directory file
Info linksExternal Links
INFOJS_OPT’, keywordJavaScript support
inheritance, of propertiesProperty Inheritance
inheritance, of tagsTag Inheritance
inline, in LaTeX exportQuoting LaTeX code
inlining imagesImages
inlining images in HTMLImages in HTML export
inlining images in LaTeXImages in LaTeX export
input-file’, macroMacro Replacement
inserting linksHandling Links
insertion, of templatesStructure Templates
insertion, of templatesStructure Templates
install-info, in Texinfo exportInfo directory file
installationInstallation
Installing Org protocolProtocols
internal linksInternal Links
internal links, in HTML exportLinks in HTML export
introductionIntroduction
IRC linksExternal Links
italic text, markup rulesEmphasis and Monospace
ITEM’, special propertySpecial Properties

J
jumping, to headlinesMotion

K
key bindings, globalActivation
keystroke index, in Texinfo exportIndices
keyword optionsPer-file keywords
keyword’, macroMacro Replacement
KEYWORDS’, keywordBeamer specific export settings
KEYWORDS’, keywordHTML specific export settings
KEYWORDS’, keywordLaTeX specific export settings
KEYWORDS’, keywordODT specific export settings
KINDEX’, keywordIndices

L
laggyFeedback
language-specific default header argumentsUsing Header Arguments
language-specific header arguments propertiesUsing Header Arguments
language, in code blocksStructure of Code Blocks
LANGUAGE’, keywordExport Settings
LANGUAGE’, keywordLaTeX specific export settings
LANGUAGE’, keywordLaTeX header and sectioning
LAST_REPEAT’, propertyClocking commands
LaTeX classLaTeX header and sectioning
LaTeX exportLaTeX Export
LaTeX fragmentsLaTeX fragments
LaTeX fragments, previewPreviewing LaTeX fragments
LaTeX headerLaTeX header and sectioning
LaTeX interpretationEmbedded LaTeX
LaTeX sectioning structureLaTeX header and sectioning
LaTeX ToC exportControlling the way the table of contents is generated
LaTeX ToC export a la ~org~Controlling the way the table of contents is generated
LATEX_CLASS_OPTIONS’, keywordLaTeX specific export settings
LATEX_CLASS_OPTIONS’, keywordLaTeX header and sectioning
LATEX_CLASS_PRE’, keywordLaTeX specific export settings
LATEX_CLASS_PRE’, keywordLaTeX header and sectioning
LATEX_CLASS’, keywordLaTeX specific export settings
LATEX_CLASS’, keywordLaTeX header and sectioning
LATEX_COMPILER’, keywordLaTeX/PDF export commands
LATEX_COMPILER’, keywordLaTeX specific export settings
LATEX_HEADER_EXTRA’, keywordLaTeX specific export settings
LATEX_HEADER_EXTRA’, keywordLaTeX header and sectioning
LATEX_HEADER’, keywordHTML specific export settings
LATEX_HEADER’, keywordLaTeX specific export settings
LATEX_HEADER’, keywordLaTeX header and sectioning
LaTeX, and Orgtbl modeA LaTeX example
LATEX’, keywordQuoting LaTeX code
Latin-1 exportASCII/Latin-1/UTF-8 export
lettered lists, in Texinfo exportPlain lists in Texinfo export
level, for tags/property matchMatching tags and properties
LibreOfficeOpenDocument Text Export
limits, in agendaFiltering/limiting agenda items
line breaks, markup rulesParagraphs
lines’, includeInclude Files
link abbreviationsLink Abbreviations
link abbreviations, completion ofCompletion
link completionHandling Links
link formatLink Format
LINK’, keywordLink Abbreviations
LINK’, keywordIn-buffer Settings
links, externalExternal Links
links, finding next/previousHandling Links
links, handlingHandling Links
links, in HTML exportLinks in HTML export
links, in ODT exportLinks in ODT export
links, internalInternal Links
links, publishingPublishing links
links, radio targetsRadio Targets
links, returning toHandling Links
linterOrg Syntax
Lisp forms, as table formulasFormula syntax for Lisp
list of listingsTable of Contents
list of tablesTable of Contents
lists, in other modesTables in Arbitrary Syntax
lists, orderedPlain Lists
lists, plainPlain Lists
literal examples, markup rulesLiteral Examples
LOCATION’, propertyiCalendar Export
LOG_INTO_DRAWER’, propertyTracking TODO state changes
LOG_INTO_DRAWER’, propertyClocking commands
logging, of progressProgress Logging
LOGGING’, propertyTracking TODO state changes
LOGGING’, propertyProperty Inheritance
lookup functions in tablesLookup functions
lualatexLaTeX/PDF export commands

M
macro replacement, during exportMacro Replacement
MACRO’, keywordMacro Replacement
maintainerFeedback
mapping entries, APIUsing the Mapping API
mappings in open-source protocolThe open-source protocol
mark ringHandling Links
Markdown exportMarkdown Export
marking characters, tablesAdvanced features
match viewMatching tags and properties
matching, of propertiesMatching tags and properties
matching, of tagsMatching tags and properties
matching, tagsTags
math symbolsSpecial Symbols
MathJaxMath formatting in HTML export
MathMLLaTeX math snippets
MH-E linksExternal Links
minlevel’, includeInclude Files
minor mode for tablesOrgtbl Mode
mkdirp’, header argumentEnvironment of a Code Block
mkdirp’, header argumentExtracting Source Code
mode, for CalcFormula syntax for Calc
modification-time’, macroMacro Replacement
motion commands in agendaAgenda Commands
motion, between headlinesMotion
multiple formula linesEditing and debugging formulas
multiple items in Texinfo listsPlain lists in Texinfo export

N
n’, macroMacro Replacement
NAME’ keyword, in source blocksStructure of Code Blocks
NAME’, keywordReferences
NAME’, keywordInternal Links
name, of column or fieldReferences
name, of column or fieldReferences
named referencesReferences
names as TODO keywordsTODO types
narrow columns in tablesColumn Width and Alignment
no-expand’, header argumentExtracting Source Code
NOBLOCKING’, propertyTODO dependencies
not responsiveFeedback
noweb-ref’, header argumentNoweb Reference Syntax
noweb-sep’, header argumentNoweb Reference Syntax
noweb’, header argumentNoweb Reference Syntax
number headlinesDynamic Headline Numbering

O
occur-treeStoring searches
occur, commandSparse Trees
odd-levels-only outlinesClean View
ODTOpenDocument Text Export
ODT_STYLES_FILE’, keywordODT specific export settings
ODT_STYLES_FILE’, keywordApplying custom styles
ODT’, keywordAdvanced topics in ODT export
only-contents’, includeInclude Files
open-source protocolThe open-source protocol
OpenDocumentOpenDocument Text Export
operator, for property searchMatching tags and properties
option keyword completionCompletion
options, for custom agenda viewsSetting options
options, for exportExport Settings
options, for publishingPublishing options
OPTIONS’, keywordExport Settings
ordered listsPlain Lists
ORDERED’, propertyTODO dependencies
ORDERED’, propertyCheckboxes
Org exportOrg Export
Org mode, turning onActivation
Org Num modeDynamic Headline Numbering
Org protocol, set-upProtocols
org-agenda, commandWeekly/daily agenda
ORG-IMAGE-ACTUAL-WIDTH’, propertyImages
org-latex-default-quote-environmentQuote blocks in LaTeX export
org-latex-toc-include-unnumberedControlling the way the table of contents is generated
Orgtbl modeOrgtbl Mode
Orgtbl modeTables in Arbitrary Syntax
ORGTBL’, keywordRadio tables
outline treeHeadlines
output-dir’, header argumentResults of Evaluation
overview, global visibility stateGlobal and local cycling

P
packages, interaction with otherInteraction
padline’, header argumentExtracting Source Code
paragraphs, markup rulesParagraphs
passing arguments to code blocksEnvironment of a Code Block
pasting files, images from clipboardDrag and Drop & yank-media
pasting, of subtreesStructure Editing
PDF exportLaTeX Export
pdflatexLaTeX/PDF export commands
per-file keywordsPer-file keywords
performanceFeedback
PINDEX’, keywordIndices
plain linksLink Format
plain listsPlain Lists
plain lists, in LaTeX exportPlain lists in LaTeX export
plain text external linksExternal Links
plot tables using GnuplotOrg Plot
PLOT’, keywordOrg Plot
post’, header argumentResults of Evaluation
presentation, of agenda itemsPresentation and Sorting
print editionSummary
PRINT_BIBLIOGRAPHY’, keywordBibliography printing
printing sparse treesSparse Trees
prioritiesPriorities
PRIORITIES’, keywordPriorities
PRIORITIES’, keywordIn-buffer Settings
priorities, of agenda itemsSorting of agenda items
priority cookiePriorities
PRIORITY’, special propertySpecial Properties
profileFeedback
profilerFeedback
program index, in Texinfo exportIndices
progress loggingProgress Logging
projects, for publishingProject alist
prologue’, header argumentEnvironment of a Code Block
promotion, of subtreesStructure Editing
proof, in LaTeX exportSpecial blocks in LaTeX export
propertiesProperties and Columns
properties, APIUsing the Property API
properties, column viewDefining columns
properties, inheritanceProperty Inheritance
properties, searchingProperty Searches
properties, specialSpecial Properties
property syntaxProperty Syntax
PROPERTY’, keywordProperty Syntax
PROPERTY’, keywordIn-buffer Settings
property’, macroMacro Replacement
protocol, captureThe capture protocol
protocol, new protocolProtocols
protocol, open-sourceThe open-source protocol
protocol, open-source rewritten URLThe open-source protocol
protocol, open-source, set-up mappingThe open-source protocol
protocol, store-linkThe store-link protocol
protocols, for external accessCapture and Attachments
protocols, for external accessProtocols
publishingPublishing
publishing optionsPublishing options

Q
query editing, in agendaFiltering/limiting agenda items
quote blocksParagraphs
quote blocks, in LaTeX exportQuote blocks in LaTeX export

R
radio button, checkbox asCheckboxes
radio tablesRadio tables
radio targetsRadio Targets
range formulaField and range formulas
range referencesReferences
ranges, timeTimestamps
recomputing table fieldsUpdating the table
referencesReferences
references, namedReferences
references, remoteReferences
references, to a different tableReferences
references, to fieldsReferences
references, to rangesReferences
refiling notesRefiling and Archiving
refiling notesRefile and Copy
refresh set-upIn-buffer Settings
region, activeStructure Editing
regular expressions syntaxRegular Expressions
regular expressions, in searchesRegular Expressions
regular expressions, with tags searchMatching tags and properties
relative timerTimers
remindersWeekly/daily agenda
remote editing, bulk, from agendaAgenda Commands
remote editing, from agendaAgenda Commands
remote editing, undoAgenda Commands
remote referencesReferences
repeat-mode, org-modeRepeating commands
repeated tasksRepeated tasks
repeating navigation commandsRepeating commands
report, of clocked timeThe clock table
reporting a bugFeedback
request a featureFeedback
resolve idle timeResolving idle time
results’, header argumentResults of Evaluation
RESULTS’, keywordEvaluating Code Blocks
results’, macroMacro Replacement
revealing contextGlobal and local cycling
rewritten URL in open-source protocolThe open-source protocol
Rmail linksExternal Links
row separator, in tablesBuilt-in Table Editor
row, of field coordinatesReferences
rownames’, header argumentEnvironment of a Code Block
RSS feedsCapture and Attachments
RSS feedsRSS Feeds
rsyncUploading Files

S
SCHEDULED’ markerDeadlines and Scheduling
SCHEDULED’, special propertySpecial Properties
schedulingTimestamps
scripts, for agenda processingExtracting Agenda Information
search option in file linksSearch Options
search option in id linksSearch Options
search strings, customCustom Searches
search viewSearch view
searching for tagsTag Searches
searching, for textSearch view
searching, of propertiesProperty Searches
sectioning structure, for LaTeX exportLaTeX header and sectioning
SELECT_TAGS’, keywordExport Settings
sep’, header argumentResults of Evaluation
sep, Texinfo attributePlain lists in Texinfo export
SEQ_TODO’, keywordPer-file keywords
SEQ_TODO’, keywordIn-buffer Settings
session’, header argumentEnvironment of a Code Block
setting tagsSetting Tags
SETUPFILE’, keywordExport Settings
SETUPFILE’, keywordIn-buffer Settings
sexp timestampsTimestamps
shebang’, header argumentExtracting Source Code
shell linksExternal Links
shift-selectionConflicts
shift-selection-modePlain Lists
show all, commandGlobal and local cycling
show all, global visibility stateGlobal and local cycling
show branches, commandGlobal and local cycling
show children, commandGlobal and local cycling
show hidden textVisibility Cycling
shy hyphen, special symbolSpecial Symbols
sitemap, of published pagesSite map
slowFeedback
slowdownFeedback
smartphoneOrg Mobile
sorting, of agenda itemsSorting of agenda items
sorting, of plain listPlain Lists
sorting, of subtreesStructure Editing
source blockLiteral Examples
source blocks, in LaTeX exportSource blocks in LaTeX export
source code, batch executionBatch Execution
source code, block structureStructure of Code Blocks
source code, editingEditing Source Code
source code, evaluatingEvaluating Code Blocks
source code, exportingExporting Code Blocks
source code, extractingExtracting Source Code
source code, inlineStructure of Code Blocks
source code, languagesLanguages
source code, libraryLibrary of Babel
source code, noweb referenceNoweb Reference Syntax
source code, results of evaluationResults of Evaluation
source code, working withWorking with Source Code
sparse tree, for deadlinesInserting deadline/schedule
sparse tree, for TODOTODO Basics
sparse tree, tag basedTags
sparse treesSparse Trees
special blocks, in ASCII exportASCII/Latin-1/UTF-8 export
special blocks, in LaTeX exportSpecial blocks in LaTeX export
special keywordsIn-buffer Settings
special symbolsSpecial Symbols
special symbols, in-buffer displaySpecial Symbols
speed keysSpeed Keys
speedbar.elCooperation
spreadsheet capabilitiesThe Spreadsheet
square brackets, around linksExternal Links
startup visibilityGlobal and local cycling
STARTUP’, keywordInitial visibility
STARTUP, keywordBlocks
STARTUP’, keywordIn-buffer Settings
statistics, for checkboxesCheckboxes
statistics, for TODO itemsBreaking Down Tasks
store-link protocolThe store-link protocol
storing link, in a source code bufferLiteral Examples
storing linksHandling Links
strike-through text, markup rulesEmphasis and Monospace
structure editingStructure Editing
structure of documentDocument Structure
STYLE’, propertyTracking your habits
styles, customApplying custom styles
styles, customAdvanced topics in ODT export
SUBAUTHOR’, keywordTexinfo specific export settings
SUBAUTHOR’, keywordTexinfo title and copyright page
sublevels, inclusion into tags matchTag Inheritance
sublevels, inclusion into TODO listGlobal TODO list
subscriptSubscripts and Superscripts
SUBTITLE’, keywordASCII/Latin-1/UTF-8 export
SUBTITLE’, keywordBeamer specific export settings
SUBTITLE’, keywordHTML specific export settings
SUBTITLE’, keywordLaTeX specific export settings
SUBTITLE’, keywordODT specific export settings
SUBTITLE’, keywordTexinfo specific export settings
subtree cyclingGlobal and local cycling
subtree visibility statesGlobal and local cycling
subtree, cut and pasteStructure Editing
subtree, subtree visibility stateGlobal and local cycling
subtrees, cut and pasteStructure Editing
summarySummary
SUMMARY’, propertyiCalendar Export
superscriptSubscripts and Superscripts
switches, in code blocksStructure of Code Blocks
syntax checkerOrg Syntax
syntax, nowebNoweb Reference Syntax
syntax, of formulasFormula syntax for Calc

T
table editor, built-inBuilt-in Table Editor
table editor, table.elCooperation
table indirectionReferences
table lookup functionsLookup functions
table of contentsTable of Contents
table of contents, exclude entriesTable of Contents
table syntaxBuilt-in Table Editor
table-type, Texinfo attributePlain lists in Texinfo export
table.elCooperation
tablesTables
tables, in HTMLTables in HTML export
tables, in LaTeX exportTables in LaTeX export
tables, in ODT exportTables in ODT export
tables, in ODT exportAdvanced topics in ODT export
tables, in other modesTables in Arbitrary Syntax
tag completionCompletion
tag filtering, in agendaFiltering/limiting agenda items
tag inheritanceTag Inheritance
tag searchesTag Searches
tagsTags
tags hierarchyTag Hierarchy
tags viewMatching tags and properties
tags-todoStoring searches
tags-treeStoring searches
tags, as an agenda viewStoring searches
tags, groupsTag Hierarchy
TAGS’, keywordSetting Tags
TAGS’, keywordIn-buffer Settings
tags, settingSetting Tags
TAGS’, special propertySpecial Properties
tangle-directory’, header argumentExtracting Source Code
tangle-mode’, header argumentExtracting Source Code
tangle’, header argumentExtracting Source Code
tanglingExtracting Source Code
targets, for linksInternal Links
targets, radioRadio Targets
tasks, breaking downBreaking Down Tasks
tasks, repeatedRepeated tasks
TBLFM’ keywords, multipleEditing and debugging formulas
TBLFM’, keywordField and range formulas
TBLFM’, switchingEditing and debugging formulas
template expansionStructure Templates
template insertionStructure Templates
template, customApplying custom styles
template, customAdvanced topics in ODT export
templates, for CaptureCapture templates
TempoStructure Templates
TeX interpretationEmbedded LaTeX
TeX symbol completionCompletion
TEXINFO_CLASS’, keywordTexinfo specific export settings
TEXINFO_CLASS’, keywordTexinfo file header
TEXINFO_CLASS’, keywordHeadings and sectioning structure
TEXINFO_DIR_CATEGORY’, keywordTexinfo specific export settings
TEXINFO_DIR_CATEGORY’, keywordInfo directory file
TEXINFO_DIR_DESC’, keywordTexinfo specific export settings
TEXINFO_DIR_DESC’, keywordInfo directory file
TEXINFO_DIR_NAME’, keywordTexinfo specific export settings
TEXINFO_DIR_NAME’, keywordInfo directory file
TEXINFO_FILENAME’, keywordTexinfo specific export settings
TEXINFO_FILENAME’, keywordTexinfo file header
TEXINFO_HEADER’, keywordTexinfo specific export settings
TEXINFO_HEADER’, keywordTexinfo file header
TEXINFO_POST_HEADER’, keywordTexinfo specific export settings
TEXINFO_PRINTED_TITLE’, keywordTexinfo specific export settings
TEXINFO_PRINTED_TITLE’, keywordTexinfo title and copyright page
TEXINFO’, keywordQuoting Texinfo code
text areas, in HTMLText areas in HTML export
text searchSearch view
time clockingClocking Work Time
time format, customCustom time format
time gridTime-of-day specifications
time rangeTimestamps
time rangeTimestamps
time-of-day specificationTime-of-day specifications
time, computingDurations and time values
time’, macroMacro Replacement
time, reading in minibufferThe date/time prompt
timerangeTimestamps
timesDates and Times
timestampDates and Times
timestampTimestamps
TIMESTAMP_IA’, special propertySpecial Properties
timestamp, inactiveTimestamps
TIMESTAMP’, special propertySpecial Properties
timestamp, with repeater intervalTimestamps
timestampsTimestamps
TIMEZONE’, propertyiCalendar Export
TINDEX’, keywordIndices
TITLE’, keywordExport Settings
title’, macroMacro Replacement
toc’, in ‘OPTIONS’ keywordTable of Contents
TOC’, keywordTable of Contents
TODO dependenciesTODO dependencies
TODO dependencies, ‘NOBLOCKINGTODO dependencies
TODO itemsTODO Items
TODO keyword matchingGlobal TODO list
TODO keyword matching, with tags searchMatching tags and properties
TODO keyword setsMultiple sets in one file
TODO keywords completionCompletion
TODO list, globalGlobal TODO list
TODO typesTODO types
TODO workflowWorkflow states
todo-treeStoring searches
todo, as an agenda viewStoring searches
TODO’, keywordPer-file keywords
TODO’, keywordIn-buffer Settings
TODO’, special propertySpecial Properties
top headline filtering, in agendaFiltering/limiting agenda items
Top node, in Texinfo exportHeadings and sectioning structure
transient mark modeStructure Editing
translator functionTranslator functions
trees, sparseSparse Trees
trees, visibilityVisibility Cycling
tty key bindingsTTY Keys
two-column tables, in Texinfo exportPlain lists in Texinfo export
TYP_TODO’, keywordPer-file keywords
TYP_TODO’, keywordIn-buffer Settings
types as TODO keywordsTODO types

U
underlined text, markup rulesEmphasis and Monospace
undoing remote-editing eventsAgenda Commands
unisonUploading Files
UNNUMBERED’, propertyExport Settings
unoconvExtending ODT export
updating, tableUpdating the table
URL linksExternal Links
Usenet linksExternal Links
using sessions in code blocksEnvironment of a Code Block
UTF-8 exportASCII/Latin-1/UTF-8 export

V
var’, header argumentEnvironment of a Code Block
variable index, in Texinfo exportIndices
vectors, in table calculationsFormula syntax for Calc
verbatim blocks, in LaTeX exportExample blocks in LaTeX export
verbatim text, markup rulesEmphasis and Monospace
verse blocksParagraphs
verse blocks, in LaTeX exportVerse blocks in LaTeX export
view file commands in agendaAgenda Commands
VINDEX’, keywordIndices
viper.elConflicts
visibility cyclingVisibility Cycling
visibility cycling, drawersDrawers
VISIBILITY’, propertyInitial visibility
visible text, printingSparse Trees
VM linksExternal Links

W
Wanderlust linksExternal Links
weekly agendaWeekly/daily agenda
windmove.elConflicts
workflow states as TODO keywordsWorkflow states
working directory, in a code blockEnvironment of a Code Block
wrap’, header argumentResults of Evaluation

X
xelatexLaTeX/PDF export commands

Y
yasnippet.elConflicts

Z
zero width spaceEscape Character
zipPre-requisites for ODT export


E Key Index

Jump to:   _   -   ,   :   !   ?   .   '   [   *   /   #   %   `   ^   +   <   >   $   1  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Z  

_
_CDLaTeX mode

-
-Agenda Commands

,
,Agenda Commands

:
:Agenda Commands

!
!Setting Tags
! (Agenda dispatcher)Stuck projects

?
? (Agenda dispatcher)Pulling from the mobile application

.
.The date/time prompt
.Agenda Commands

'
'CDLaTeX mode

[
[Agenda Commands

*
*Agenda Commands
* (Agenda dispatcher)Agenda Dispatcher

/
/ (Agenda dispatcher)Agenda Dispatcher

#
# (Agenda dispatcher)Stuck projects

%
%Agenda Commands

`
`CDLaTeX mode

^
^CDLaTeX mode

+
+Agenda Commands

<
<Using column view
<The date/time prompt
< (Agenda dispatcher)Agenda Dispatcher
< < (Agenda dispatcher)Agenda Dispatcher

>
>Using column view
>The date/time prompt
>Agenda Commands

$
$Agenda Commands

1
1..9,0Using column view

A
aUsing column view
AAgenda Commands
aAgenda Commands
a (Agenda dispatcher)Weekly/daily agenda

B
bAgenda Commands
BAgenda Commands

C
CResolving idle time
cAgenda Commands
cAgenda Commands
CAgenda Commands
C (Agenda dispatcher)Storing searches
C (Capture menuCapture templates
C-_Agenda Commands
C-,Agenda Files
C-.The date/time prompt
C-'Agenda Files
C-#Advanced features
C-0 C-c C-wRefile and Copy
C-2 C-c C-wRefile and Copy
C-3 C-c C-wRefile and Copy
C-c -Plain Lists
C-c -Built-in Table Editor
C-c ,Priorities
C-c ;Comment Lines
C-c !Creating Timestamps
C-c ?Editing and debugging formulas
C-c .Creating Timestamps
C-c 'Editing and debugging formulas
C-c 'Literal Examples
C-c 'Include Files
C-c 'Editing Source Code
C-c 'Cooperation
C-c [Agenda Files
C-c ]Agenda Files
C-c {Editing and debugging formulas
C-c {CDLaTeX mode
C-c }Editing and debugging formulas
C-c }Editing and debugging formulas
C-c @Structure Editing
C-c *Structure Editing
C-c *Plain Lists
C-c *Updating the table
C-c /Sparse Trees
C-c /Conflicts
C-c / /Sparse Trees
C-c / aInserting deadline/schedule
C-c / bInserting deadline/schedule
C-c / dInserting deadline/schedule
C-c / mTag Searches
C-c / mProperty Searches
C-c / pProperty Searches
C-c / rSparse Trees
C-c / tTODO Basics
C-c \Tag Searches
C-c \Property Searches
C-c &Handling Links
C-c #Checkboxes
C-c %Handling Links
C-c `Built-in Table Editor
C-c ^Structure Editing
C-c ^Plain Lists
C-c ^Built-in Table Editor
C-c +Built-in Table Editor
C-c <Creating Timestamps
C-c =Column formulas
C-c =Editing and debugging formulas
C-c >Creating Timestamps
C-c |Built-in Table Editor
C-c |Built-in Table Editor
C-c ~Cooperation
C-c $Moving subtrees
C-c C-,Structure Templates
C-c C-*Plain Lists
C-c C-aAttachment defaults and dispatcher
C-c C-aAgenda Commands
C-c C-a aAttachment defaults and dispatcher
C-c C-a bAttachment defaults and dispatcher
C-c C-a cAttachment defaults and dispatcher
C-c C-a dAttachment defaults and dispatcher
C-c C-a DAttachment defaults and dispatcher
C-c C-a fAttachment defaults and dispatcher
C-c C-a FAttachment defaults and dispatcher
C-c C-a lAttachment defaults and dispatcher
C-c C-a mAttachment defaults and dispatcher
C-c C-a nAttachment defaults and dispatcher
C-c C-a oAttachment defaults and dispatcher
C-c C-a OAttachment defaults and dispatcher
C-c C-a sAttachment defaults and dispatcher
C-c C-a SAttachment defaults and dispatcher
C-c C-a zAttachment defaults and dispatcher
C-c C-bMotion
C-c C-bEditing support
C-c C-cPlain Lists
C-c C-cBuilt-in Table Editor
C-c C-cColumn Width and Alignment
C-c C-cEditing and debugging formulas
C-c C-cEditing and debugging formulas
C-c C-cEditing and debugging formulas
C-c C-cCheckboxes
C-c C-cSetting Tags
C-c C-cSetting Tags
C-c C-cProperty Syntax
C-c C-cUsing column view
C-c C-cUsing column view
C-c C-cCapturing column view
C-c C-cCreating Timestamps
C-c C-cClocking commands
C-c C-cThe clock table
C-c C-cCreating Footnotes
C-c C-cEvaluating Code Blocks
C-c C-cKey bindings and Useful Functions
C-c C-cThe Very Busy C-c C-c Key
C-c C-c (Capture buffer)Using capture
C-c C-c cProperty Syntax
C-c C-c dProperty Syntax
C-c C-c DProperty Syntax
C-c C-c m mMarkdown Export
C-c C-c m MMarkdown Export
C-c C-c sProperty Syntax
C-c C-dInserting deadline/schedule
C-c C-dAgenda Commands
C-c C-eThe Export Dispatcher
C-c C-e c aiCalendar Export
C-c C-e c ciCalendar Export
C-c C-e c fiCalendar Export
C-c C-e C-aThe Export Dispatcher
C-c C-e C-bThe Export Dispatcher
C-c C-e C-fThe Export Dispatcher
C-c C-e C-sThe Export Dispatcher
C-c C-e C-vSparse Trees
C-c C-e C-vThe Export Dispatcher
C-c C-e h hHTML export commands
C-c C-e h HHTML export commands
C-c C-e h oHTML export commands
C-c C-e i iTexinfo export commands
C-c C-e i tTexinfo export commands
C-c C-e l bBeamer export commands
C-c C-e l BBeamer export commands
C-c C-e l lLaTeX/PDF export commands
C-c C-e l LLaTeX/PDF export commands
C-c C-e l OBeamer export commands
C-c C-e l oLaTeX/PDF export commands
C-c C-e l PBeamer export commands
C-c C-e l pLaTeX/PDF export commands
C-c C-e m oMarkdown Export
C-c C-e o oODT export commands
C-c C-e o OODT export commands
C-c C-e O oOrg Export
C-c C-e O vOrg Export
C-c C-e P aTriggering Publication
C-c C-e P fTriggering Publication
C-c C-e P pTriggering Publication
C-c C-e P xTriggering Publication
C-c C-e t aASCII/Latin-1/UTF-8 export
C-c C-e t AASCII/Latin-1/UTF-8 export
C-c C-e t lASCII/Latin-1/UTF-8 export
C-c C-e t LASCII/Latin-1/UTF-8 export
C-c C-e t uASCII/Latin-1/UTF-8 export
C-c C-e t UASCII/Latin-1/UTF-8 export
C-c C-fMotion
C-c C-jMotion
C-c C-kGlobal and local cycling
C-c C-k (Capture buffer)Using capture
C-c C-lHandling Links
C-c C-M-wRefile and Copy
C-c C-nMotion
C-c C-oHandling Links
C-c C-oCreating Timestamps
C-c C-oAgenda Commands
C-c C-oCreating Footnotes
C-c C-oKey bindings and Useful Functions
C-c C-pMotion
C-c C-qEditing and debugging formulas
C-c C-qSetting Tags
C-c C-rGlobal and local cycling
C-c C-rEditing and debugging formulas
C-c C-sInserting deadline/schedule
C-c C-sAgenda Commands
C-c C-tTODO Basics
C-c C-tClocking commands
C-c C-TABInternal archiving
C-c C-uMotion
C-c C-v aKey bindings and Useful Functions
C-c C-v bKey bindings and Useful Functions
C-c C-v cKey bindings and Useful Functions
C-c C-v C-aKey bindings and Useful Functions
C-c C-v C-bKey bindings and Useful Functions
C-c C-v C-cKey bindings and Useful Functions
C-c C-v C-dKey bindings and Useful Functions
C-c C-v C-eKey bindings and Useful Functions
C-c C-v C-fKey bindings and Useful Functions
C-c C-v C-gKey bindings and Useful Functions
C-c C-v C-hKey bindings and Useful Functions
C-c C-v C-iKey bindings and Useful Functions
C-c C-v C-IKey bindings and Useful Functions
C-c C-v C-jKey bindings and Useful Functions
C-c C-v C-lKey bindings and Useful Functions
C-c C-v C-nKey bindings and Useful Functions
C-c C-v C-oKey bindings and Useful Functions
C-c C-v C-pKey bindings and Useful Functions
C-c C-v C-rKey bindings and Useful Functions
C-c C-v C-sKey bindings and Useful Functions
C-c C-v C-tKey bindings and Useful Functions
C-c C-v C-uKey bindings and Useful Functions
C-c C-v C-vNoweb Reference Syntax
C-c C-v C-vKey bindings and Useful Functions
C-c C-v C-xKey bindings and Useful Functions
C-c C-v C-zKey bindings and Useful Functions
C-c C-v dKey bindings and Useful Functions
C-c C-v eEvaluating Code Blocks
C-c C-v eKey bindings and Useful Functions
C-c C-v fExtracting Source Code
C-c C-v fKey bindings and Useful Functions
C-c C-v gKey bindings and Useful Functions
C-c C-v hKey bindings and Useful Functions
C-c C-v iLibrary of Babel
C-c C-v iKey bindings and Useful Functions
C-c C-v IKey bindings and Useful Functions
C-c C-v jKey bindings and Useful Functions
C-c C-v lKey bindings and Useful Functions
C-c C-v nKey bindings and Useful Functions
C-c C-v oKey bindings and Useful Functions
C-c C-v pKey bindings and Useful Functions
C-c C-v rKey bindings and Useful Functions
C-c C-v sKey bindings and Useful Functions
C-c C-v tExtracting Source Code
C-c C-v tKey bindings and Useful Functions
C-c C-v uKey bindings and Useful Functions
C-c C-v vNoweb Reference Syntax
C-c C-v vKey bindings and Useful Functions
C-c C-v xKey bindings and Useful Functions
C-c C-v zKey bindings and Useful Functions
C-c C-wStructure Editing
C-c C-wRefile and Copy
C-c C-wAgenda Commands
C-c C-w (Capture buffer)Using capture
C-c C-x _Timers
C-c C-x -Timers
C-c C-x ,Timers
C-c C-x ;Timers
C-c C-x .Timers
C-c C-x @Citations
C-c C-x \Subscripts and Superscripts
C-c C-x \Special Symbols
C-c C-x <Agenda Files
C-c C-x >Agenda Files
C-c C-x >Agenda Commands
C-c C-x 0Timers
C-c C-x aInternal archiving
C-c C-x AInternal archiving
C-c C-x aAgenda Commands
C-c C-x AAgenda Commands
C-c C-x bGlobal and local cycling
C-c C-x bAgenda Commands
C-c C-x cStructure Editing
C-c C-x C-aArchiving
C-c C-x C-aAgenda Commands
C-c C-x C-bCheckboxes
C-c C-x C-cUsing column view
C-c C-x C-cAgenda Commands
C-c C-x C-cAgenda Column View
C-c C-x C-dClocking commands
C-c C-x C-eClocking commands
C-c C-x C-eEffort Estimates
C-c C-x C-fEmphasis and Monospace
C-c C-x C-iClocking commands
C-c C-x C-jClocking commands
C-c C-x C-lPreviewing LaTeX fragments
C-c C-x C-M-vImages and link previews
C-c C-x C-M-vImages and link previews
C-c C-x C-nHandling Links
C-c C-x C-oClocking commands
C-c C-x C-pHandling Links
C-c C-x C-qClocking commands
C-c C-x C-rCheckboxes
C-c C-x C-sMoving subtrees
C-c C-x C-sAgenda Commands
C-c C-x C-tCustom time format
C-c C-x C-uCapturing column view
C-c C-x C-uThe clock table
C-c C-x C-uDynamic Blocks
C-c C-x C-vImages and link previews
C-c C-x C-wStructure Editing
C-c C-x C-wBuilt-in Table Editor
C-c C-x C-xClocking commands
C-c C-x C-yStructure Editing
C-c C-x C-yBuilt-in Table Editor
C-c C-x dDrawers
C-c C-x eEffort Estimates
C-c C-x eAgenda Commands
C-c C-x fCreating Footnotes
C-c C-x gRSS Feeds
C-c C-x GRSS Feeds
C-c C-x IDocumentation Access
C-c C-x M-wStructure Editing
C-c C-x M-wBuilt-in Table Editor
C-c C-x oTODO dependencies
C-c C-x oCheckboxes
C-c C-x pProperty Syntax
C-c C-x pUsing Header Arguments
C-c C-x qTag Hierarchy
C-c C-x vGlobal and local cycling
C-c C-x xCapturing column view
C-c C-x xThe clock table
C-c C-x xDynamic Blocks
C-c C-yCreating Timestamps
C-c C-yClocking commands
C-c C-zDrawers
C-c C-zAgenda Commands
C-c M-wRefile and Copy
C-c RETBuilt-in Table Editor
C-c TABGlobal and local cycling
C-c TABColumn Width and Alignment
C-gSetting Tags
C-kAgenda Commands
C-RETStructure Editing
C-S-DOWNClocking commands
C-S-LEFTMultiple sets in one file
C-S-LEFTAgenda Commands
C-S-RETStructure Editing
C-S-RIGHTMultiple sets in one file
C-S-RIGHTAgenda Commands
C-S-UPClocking commands
C-u C-c !Creating Timestamps
C-u C-c .Creating Timestamps
C-u C-c *Updating the table
C-u C-c =Field and range formulas
C-u C-c =Editing and debugging formulas
C-u C-c C-cUpdating the table
C-u C-c C-lHandling Links
C-u C-c C-tProgress Logging
C-u C-c C-wRefile and Copy
C-u C-c C-x aInternal archiving
C-u C-c C-x C-sMoving subtrees
C-u C-c C-x C-uCapturing column view
C-u C-c C-x C-uThe clock table
C-u C-c C-x C-uDynamic Blocks
C-u C-c TABColumn Width and Alignment
C-u C-u C-c !Creating Timestamps
C-u C-u C-c .Creating Timestamps
C-u C-u C-c *Updating the table
C-u C-u C-c =Editing and debugging formulas
C-u C-u C-c C-cUpdating the table
C-u C-u C-c C-tMultiple sets in one file
C-u C-u C-c C-wRefile and Copy
C-u C-u C-c C-x C-sMoving subtrees
C-u C-u C-c TABColumn Width and Alignment
C-u C-u C-u C-c C-wRefile and Copy
C-u C-u C-u C-u C-c C-tTODO dependencies
C-u C-u C-u TABGlobal and local cycling
C-u C-u TABGlobal and local cycling
C-u C-u TABInitial visibility
C-u TABGlobal and local cycling
C-vThe date/time prompt
C-x C-sEditing and debugging formulas
C-x C-sAgenda Commands
C-x C-sEditing Source Code
C-x C-wExporting Agenda Views
C-x n bStructure Editing
C-x n sStructure Editing
C-x n wStructure Editing
C-yStructure Editing

D
dAgenda Commands
DAgenda Commands

E
eUsing column view
EAgenda Commands
eAgenda Commands
e (Agenda dispatcher)Exporting Agenda Views

F
FAgenda Commands
fAgenda Commands

G
gUsing column view
GAgenda Commands
gAgenda Commands

H
HAgenda Commands

I
IAgenda Commands
iAgenda Commands

J
jAgenda Commands
JAgenda Commands
JAgenda Commands

K
kResolving idle time
KResolving idle time
kAgenda Commands
k c (Agenda)Using capture

L
lAgenda Commands

M
mAgenda Commands
MAgenda Commands
m (Agenda dispatcher)Tag Searches
M (Agenda dispatcher)Tag Searches
m (Agenda dispatcher)Property Searches
M (Agenda dispatcher)Property Searches
m (Agenda dispatcher)Matching tags and properties
M (Agenda dispatcher)Matching tags and properties
M-*Agenda Commands
M-aBuilt-in Table Editor
M-DOWNStructure Editing
M-DOWNPlain Lists
M-DOWNBuilt-in Table Editor
M-DOWNEditing and debugging formulas
M-DOWNUsing column view
M-DOWNAgenda Commands
M-DOWNKey bindings and Useful Functions
M-eBuilt-in Table Editor
M-g M-nSparse Trees
M-g M-pSparse Trees
M-g nSparse Trees
M-g pSparse Trees
M-LEFTStructure Editing
M-LEFTPlain Lists
M-LEFTBuilt-in Table Editor
M-LEFTUsing column view
M-mAgenda Commands
M-RETStructure Editing
M-RETPlain Lists
M-RETBuilt-in Table Editor
M-RETTimers
M-RIGHTStructure Editing
M-RIGHTPlain Lists
M-RIGHTBuilt-in Table Editor
M-RIGHTUsing column view
M-S-DOWNBuilt-in Table Editor
M-S-DOWNEditing and debugging formulas
M-S-LEFTStructure Editing
M-S-LEFTPlain Lists
M-S-LEFTBuilt-in Table Editor
M-S-LEFTThe date/time prompt
M-S-RETStructure Editing
M-S-RETPlain Lists
M-S-RETCheckboxes
M-S-RIGHTStructure Editing
M-S-RIGHTPlain Lists
M-S-RIGHTBuilt-in Table Editor
M-S-RIGHTThe date/time prompt
M-S-UPBuilt-in Table Editor
M-S-UPEditing and debugging formulas
M-TABEditing and debugging formulas
M-TABPer-file keywords
M-TABSetting Tags
M-TABProperty Syntax
M-TABCompletion
M-UPStructure Editing
M-UPPlain Lists
M-UPBuilt-in Table Editor
M-UPEditing and debugging formulas
M-UPUsing column view
M-UPAgenda Commands
M-UPKey bindings and Useful Functions
M-vThe date/time prompt
mouse-1Handling Links
mouse-1The date/time prompt
mouse-1Creating Footnotes
mouse-2Handling Links
mouse-2Agenda Commands
mouse-2Creating Footnotes
mouse-3Handling Links
mouse-3Agenda Commands

N
nUsing column view
nAgenda Commands

O
oAgenda Commands
OAgenda Commands

P
pUsing column view
pAgenda Commands

Q
qSetting Tags
qUsing column view
qAgenda Commands

R
rUsing column view
rGlobal TODO list
RAgenda Commands
rAgenda Commands
RETBuilt-in Table Editor
RETHandling Links
RETSetting Tags
RETThe date/time prompt
RETAgenda Commands

S
sResolving idle time
SResolving idle time
sAgenda Commands
SAgenda Commands
s (Agenda dispatcher)Agenda Dispatcher
s (Agenda dispatcher)Search view
S-DOWNPlain Lists
S-DOWNBuilt-in Table Editor
S-DOWNEditing and debugging formulas
S-DOWNPriorities
S-DOWNCreating Timestamps
S-DOWNThe date/time prompt
S-DOWNAgenda Commands
S-LEFTPlain Lists
S-LEFTBuilt-in Table Editor
S-LEFTEditing and debugging formulas
S-LEFTTODO Basics
S-LEFTMultiple sets in one file
S-LEFTProperty Syntax
S-LEFTUsing column view
S-LEFTCreating Timestamps
S-LEFTThe date/time prompt
S-LEFTThe clock table
S-LEFTAgenda Commands
S-M-DOWNClocking commands
S-M-LEFTUsing column view
S-M-RETTODO Basics
S-M-RIGHTUsing column view
S-M-UPClocking commands
S-RETBuilt-in Table Editor
S-RIGHTPlain Lists
S-RIGHTBuilt-in Table Editor
S-RIGHTEditing and debugging formulas
S-RIGHTTODO Basics
S-RIGHTMultiple sets in one file
S-RIGHTProperty Syntax
S-RIGHTUsing column view
S-RIGHTCreating Timestamps
S-RIGHTThe date/time prompt
S-RIGHTThe clock table
S-RIGHTAgenda Commands
S-TABGlobal and local cycling
S-TABBuilt-in Table Editor
S-UPPlain Lists
S-UPBuilt-in Table Editor
S-UPEditing and debugging formulas
S-UPPriorities
S-UPCreating Timestamps
S-UPThe date/time prompt
S-UPAgenda Commands
SPCSetting Tags
SPCAgenda Commands

T
tAgenda Commands
TAgenda Commands
t (Agenda dispatcher)TODO Basics
t (Agenda dispatcher)Global TODO list
T (Agenda dispatcher)Global TODO list
TABGlobal and local cycling
TABStructure Editing
TABPlain Lists
TABBuilt-in Table Editor
TABEditing and debugging formulas
TABSetting Tags
TABAgenda Commands
TABCDLaTeX mode

U
uAgenda Commands
UAgenda Commands

V
vUsing column view
v [Agenda Commands
v aAgenda Commands
v AAgenda Commands
v cAgenda Commands
v dAgenda Commands
v EAgenda Commands
v lAgenda Commands
v LAgenda Commands
v mAgenda Commands
v RAgenda Commands
v SPCAgenda Commands
v wAgenda Commands
v yAgenda Commands

W
wAgenda Commands

X
XAgenda Commands
xAgenda Commands

Z
zAgenda Commands


F Command and Function Index

Jump to:   L   N   O   P   W  

L
lisp-complete-symbolEditing and debugging formulas

N
next-errorSparse Trees

O
or-clock-gotoClocking commands
org-agendaActivation
org-agenda-add-noteAgenda Commands
org-agenda-archiveAgenda Commands
org-agenda-archive-default-with-confirmationAgenda Commands
org-agenda-archive-to-archive-siblingAgenda Commands
org-agenda-archives-modeAgenda Commands
org-agenda-bulk-actionAgenda Commands
org-agenda-bulk-markAgenda Commands
org-agenda-bulk-mark-allAgenda Commands
org-agenda-bulk-mark-regexpAgenda Commands
org-agenda-bulk-toggleAgenda Commands
org-agenda-bulk-toggle-allAgenda Commands
org-agenda-bulk-unmarkAgenda Commands
org-agenda-bulk-unmark-allAgenda Commands
org-agenda-captureAgenda Commands
org-agenda-clock-cancelAgenda Commands
org-agenda-clock-gotoAgenda Commands
org-agenda-clock-gotoAgenda Commands
org-agenda-clock-inAgenda Commands
org-agenda-clock-outAgenda Commands
org-agenda-clockreport-modeAgenda Commands
org-agenda-columnsAgenda Commands
org-agenda-columnsAgenda Column View
org-agenda-convert-dateAgenda Commands
org-agenda-date-promptAgenda Commands
org-agenda-day-viewAgenda Commands
org-agenda-deadlineAgenda Commands
org-agenda-diary-entryAgenda Commands
org-agenda-do-date-earlierAgenda Commands
org-agenda-do-date-laterAgenda Commands
org-agenda-drag-line-backwardAgenda Commands
org-agenda-drag-line-forwardAgenda Commands
org-agenda-earlierAgenda Commands
org-agenda-entry-text-modeAgenda Commands
org-agenda-exitAgenda Commands
org-agenda-file-to-frontAgenda Files
org-agenda-filterFiltering/limiting agenda items
org-agenda-filter-by-categoryFiltering/limiting agenda items
org-agenda-filter-by-effortFiltering/limiting agenda items
org-agenda-filter-by-regexpFiltering/limiting agenda items
org-agenda-filter-by-tagFiltering/limiting agenda items
org-agenda-filter-by-top-headlineFiltering/limiting agenda items
org-agenda-follow-modeAgenda Commands
org-agenda-gotoAgenda Commands
org-agenda-goto-calendarAgenda Commands
org-agenda-goto-dateAgenda Commands
org-agenda-goto-todayAgenda Commands
org-agenda-holidaysAgenda Commands
org-agenda-killAgenda Commands
org-agenda-laterAgenda Commands
org-agenda-limit-interactivelyFiltering/limiting agenda items
org-agenda-listWeekly/daily agenda
org-agenda-list-stuck-projectsStuck projects
org-agenda-log-modeAgenda Commands
org-agenda-manipulate-query-addAgenda Commands
org-agenda-month-viewAgenda Commands
org-agenda-next-lineAgenda Commands
org-agenda-open-linkAgenda Commands
org-agenda-phases-of-moonAgenda Commands
org-agenda-previous-lineAgenda Commands
org-agenda-priorityAgenda Commands
org-agenda-priority-downAgenda Commands
org-agenda-priority-upAgenda Commands
org-agenda-quitAgenda Commands
org-agenda-recenterAgenda Commands
org-agenda-redoAgenda Commands
org-agenda-refileAgenda Commands
org-agenda-remove-restriction-lockAgenda Files
org-agenda-remove-restriction-lockAgenda Files
org-agenda-remove-restriction-lockAgenda Commands
org-agenda-reset-viewAgenda Commands
org-agenda-scheduleAgenda Commands
org-agenda-set-effortAgenda Commands
org-agenda-set-restriction-lockAgenda Files
org-agenda-set-tagsAgenda Commands
org-agenda-show-and-scroll-upAgenda Commands
org-agenda-show-tagsAgenda Commands
org-agenda-skip-entry-ifSpecial Agenda Views
org-agenda-skip-subtree-ifSpecial Agenda Views
org-agenda-sunrise-sunsetAgenda Commands
org-agenda-switch-toAgenda Commands
org-agenda-todoAgenda Commands
org-agenda-todo-nextsetAgenda Commands
org-agenda-toggle-archive-tagAgenda Commands
org-agenda-toggle-diaryAgenda Commands
org-agenda-tree-to-indirect-bufferAgenda Commands
org-agenda-undoAgenda Commands
org-agenda-week-viewAgenda Commands
org-agenda-writeExporting Agenda Views
org-agenda-year-viewAgenda Commands
org-anniversaryTimestamps
org-archive-subtreeMoving subtrees
org-archive-subtree-defaultArchiving
org-archive-to-archive-siblingInternal archiving
org-ascii-convert-region-to-asciiExport Region
org-ascii-convert-region-to-utf8Export Region
org-ascii-export-as-asciiASCII/Latin-1/UTF-8 export
org-ascii-export-to-asciiASCII/Latin-1/UTF-8 export
org-attachAttachment defaults and dispatcher
org-attachAgenda Commands
org-attach-attachAttachment defaults and dispatcher
org-attach-bufferAttachment defaults and dispatcher
org-attach-dired-to-subtreeAttach from Dired
org-attach-newAttachment defaults and dispatcher
org-attach-openAttachment defaults and dispatcher
org-attach-open-in-emacsAttachment defaults and dispatcher
org-attach-revealAttachment defaults and dispatcher
org-attach-reveal-in-emacsAttachment defaults and dispatcher
org-attach-syncAttachment defaults and dispatcher
org-babel-check-src-blockKey bindings and Useful Functions
org-babel-demarcate-blockKey bindings and Useful Functions
org-babel-describe-bindingsKey bindings and Useful Functions
org-babel-do-key-sequence-in-edit-bufferKey bindings and Useful Functions
org-babel-execute-bufferKey bindings and Useful Functions
org-babel-execute-maybeKey bindings and Useful Functions
org-babel-execute-src-blockEvaluating Code Blocks
org-babel-execute-src-blockKey bindings and Useful Functions
org-babel-execute-subtreeKey bindings and Useful Functions
org-babel-expand-src-blockNoweb Reference Syntax
org-babel-expand-src-blockKey bindings and Useful Functions
org-babel-goto-named-resultKey bindings and Useful Functions
org-babel-goto-named-src-blockKey bindings and Useful Functions
org-babel-goto-src-block-headKey bindings and Useful Functions
org-babel-insert-header-argKey bindings and Useful Functions
org-babel-load-in-sessionKey bindings and Useful Functions
org-babel-load-in-sessionKey bindings and Useful Functions
org-babel-lob-ingestLibrary of Babel
org-babel-lob-ingestKey bindings and Useful Functions
org-babel-next-src-blockKey bindings and Useful Functions
org-babel-open-src-block-resultKey bindings and Useful Functions
org-babel-open-src-block-resultKey bindings and Useful Functions
org-babel-pop-to-sessionKey bindings and Useful Functions
org-babel-previous-src-blockKey bindings and Useful Functions
org-babel-sha1-hashKey bindings and Useful Functions
org-babel-switch-to-session-with-codeKey bindings and Useful Functions
org-babel-tangleExtracting Source Code
org-babel-tangleKey bindings and Useful Functions
org-babel-tangle-fileExtracting Source Code
org-babel-tangle-fileKey bindings and Useful Functions
org-babel-tangle-jump-to-orgExtracting Source Code
org-babel-view-src-block-infoKey bindings and Useful Functions
org-backward-heading-same-levelMotion
org-batch-agendaExtracting Agenda Information
org-batch-agenda-csvExtracting Agenda Information
org-bbdb-anniversariesWeekly/daily agenda
org-bbdb-anniversaries-futureWeekly/daily agenda
org-beamer-export-as-latexBeamer export commands
org-beamer-export-to-latexBeamer export commands
org-beamer-export-to-pdfBeamer export commands
org-beamer-select-environmentEditing support
org-blockTimestamps
org-buffer-property-keysUsing the Property API
org-calendar-goto-agendaAgenda Commands
org-captureActivation
org-captureUsing capture
org-capture-finalizeUsing capture
org-capture-killUsing capture
org-capture-refileUsing capture
org-check-after-dateInserting deadline/schedule
org-check-before-dateInserting deadline/schedule
org-check-deadlinesInserting deadline/schedule
org-cite-insertCitations
org-clock-cancelClocking commands
org-clock-displayClocking commands
org-clock-inClocking commands
org-clock-in-lastClocking commands
org-clock-modify-effort-estimateClocking commands
org-clock-modify-effort-estimateEffort Estimates
org-clock-outClocking commands
org-clock-reportThe clock table
org-clock-timestamps-downClocking commands
org-clock-timestamps-upClocking commands
org-clocktable-try-shiftThe clock table
org-clocktable-write-defaultThe clock table
org-clone-subtree-with-time-shiftStructure Editing
org-clone-subtree-with-time-shiftStructure Editing
org-columns-deleteUsing column view
org-columns-edit-allowedUsing column view
org-columns-edit-valueUsing column view
org-columns-insert-dblockCapturing column view
org-columns-move-leftUsing column view
org-columns-move-rightUsing column view
org-columns-move-row-downUsing column view
org-columns-move-row-upUsing column view
org-columns-narrowUsing column view
org-columns-newUsing column view
org-columns-next-allowed-valueUsing column view
org-columns-previous-allowed-valueUsing column view
org-columns-quitUsing column view
org-columns-redoUsing column view
org-columns-show-valueUsing column view
org-columns-toggle-or-columns-quitUsing column view
org-columns-widenUsing column view
org-compute-property-at-pointProperty Syntax
org-copy-subtreeStructure Editing
org-copy-visibleGlobal and local cycling
org-cut-subtreeStructure Editing
org-cycleGlobal and local cycling
org-cycleStructure Editing
org-cyclePlain Lists
org-cycle-agenda-filesAgenda Files
org-cycle-set-startup-visibilityGlobal and local cycling
org-cycle-set-startup-visibilityInitial visibility
org-cyclicTimestamps
org-dateTimestamps
org-date-from-calendarCreating Timestamps
org-datetree-find-create-hierarchyTemplate elements
org-dblock-updateCapturing column view
org-dblock-updateThe clock table
org-dblock-updateDynamic Blocks
org-deadlineInserting deadline/schedule
org-delete-propertyProperty Syntax
org-delete-property-globallyProperty Syntax
org-demoteUsing the Mapping API
org-demote-subtreeStructure Editing
org-do-demoteStructure Editing
org-do-promoteStructure Editing
org-dynamic-block-insert-dblockDynamic Blocks
org-edit-specialLiteral Examples
org-edit-specialInclude Files
org-edit-specialCooperation
org-emphasizeEmphasis and Monospace
org-entities-helpSpecial Symbols
org-entry-add-to-multivalued-propertyUsing the Property API
org-entry-deleteUsing the Property API
org-entry-getUsing the Property API
org-entry-get-multivalued-propertyUsing the Property API
org-entry-member-in-multivalued-propertyUsing the Property API
org-entry-propertiesUsing the Property API
org-entry-putUsing the Property API
org-entry-put-multivalued-propertyUsing the Property API
org-entry-remove-from-multivalued-propertyUsing the Property API
org-evaluate-time-rangeCreating Timestamps
org-evaluate-time-rangeClocking commands
org-export-asAdvanced Export Configuration
org-export-define-backendAdding Export Backends
org-export-define-derived-backendAdding Export Backends
org-export-dispatchThe Export Dispatcher
org-export-region-to-asciiExport Region
org-export-region-to-htmlExport Region
org-export-region-to-latexExport Region
org-export-region-to-mdExport Region
org-export-region-to-texinfoExport Region
org-export-region-to-utf8Export Region
org-fold-show-allGlobal and local cycling
org-fold-show-childrenGlobal and local cycling
org-forward-heading-same-levelMotion
org-global-cycleGlobal and local cycling
org-gotoMotion
org-goto-calendarCreating Timestamps
org-html-convert-region-to-htmlExport Region
org-html-export-as-htmlHTML export commands
org-html-export-to-htmlHTML export commands
org-icalendar-combine-agenda-filesiCalendar Export
org-icalendar-export-agenda-filesiCalendar Export
org-icalendar-export-to-icsiCalendar Export
org-indent-modeOrg Indent Mode
org-info-find-nodeDocumentation Access
org-insert-drawerDrawers
org-insert-drawerProperty Syntax
org-insert-headingTimers
org-insert-heading-respect-contentStructure Editing
org-insert-itemPlain Lists
org-insert-linkHandling Links
org-insert-link-globalUsing Links Outside Org
org-insert-property-drawerUsing the Property API
org-insert-property-drawerUsing the Property API
org-insert-structure-templateStructure Templates
org-insert-todo-headingStructure Editing
org-insert-todo-headingTODO Basics
org-insert-todo-headingCheckboxes
org-insert-todo-heading-respect-contentStructure Editing
org-latex-convert-region-to-latexExport Region
org-latex-export-as-latexLaTeX/PDF export commands
org-latex-export-to-latex~LaTeX/PDF export commands
org-latex-export-to-pdfLaTeX/PDF export commands
org-latex-previewPreviewing LaTeX fragments
org-link-escapeLink Format
org-link-previewImages and link previews
org-link-preview-clearImages and link previews
org-link-preview-refreshImages and link previews
org-link-preview-refreshImages and link previews
org-link-preview-regionImages and link previews
org-link-set-parametersAdding Hyperlink Types
org-lintOrg Syntax
org-list-checkbox-radio-modeCheckboxes
org-lookup-allLookup functions
org-lookup-firstLookup functions
org-lookup-lastLookup functions
org-map-entriesUsing the Mapping API
org-mark-ring-gotoHandling Links
org-mark-ring-pushHandling Links
org-mark-subtreeStructure Editing
org-match-sparse-treeTag Searches
org-match-sparse-treeProperty Searches
org-md-convert-region-to-mdExport Region
org-md-export-as-markdownMarkdown Export
org-md-export-to-markdownMarkdown Export
org-meta-returnStructure Editing
org-meta-returnPlain Lists
org-mobile-pullPulling from the mobile application
org-mobile-pushPushing to the mobile application
org-move-subtree-downStructure Editing
org-move-subtree-upStructure Editing
org-narrow-to-blockStructure Editing
org-narrow-to-blockDynamic Blocks
org-narrow-to-subtreeStructure Editing
org-next-linkHandling Links
org-next-visible-headingMotion
org-occurSparse Trees
org-odt-convertExtending ODT export
org-odt-export-to-odtODT export commands
org-open-at-pointHandling Links
org-open-at-pointCreating Timestamps
org-open-at-point-globalUsing Links Outside Org
org-org-export-to-orgOrg Export
org-paste-subtreeStructure Editing
org-previous-linkHandling Links
org-previous-visible-headingMotion
org-priorityPriorities
org-priorityUsing the Mapping API
org-priority-downPriorities
org-priority-upPriorities
org-promoteUsing the Mapping API
org-promote-subtreeStructure Editing
org-property-actionProperty Syntax
org-protocol-createThe open-source protocol
org-protocol-create-for-orgThe open-source protocol
org-publishTriggering Publication
org-publish-allTriggering Publication
org-publish-current-fileTriggering Publication
org-publish-current-projectTriggering Publication
org-publish-find-dateSite map
org-publish-find-propertySite map
org-publish-find-titleSite map
org-refileStructure Editing
org-refileRefile and Copy
org-refile-cache-clearRefile and Copy
org-refile-copyRefile and Copy
org-refile-goto-last-storedRefile and Copy
org-refile-reverseRefile and Copy
org-remove-fileAgenda Files
org-revealGlobal and local cycling
org-save-all-org-buffersAgenda Commands
org-scheduleInserting deadline/schedule
org-search-viewSearch view
org-set-effortEffort Estimates
org-set-propertyProperty Syntax
org-set-propertyProperty Syntax
org-set-propertyUsing Header Arguments
org-set-tags-commandSetting Tags
org-shiftcontroldownClocking commands
org-shiftcontrolupClocking commands
org-shiftmetadownClocking commands
org-shiftmetaupClocking commands
org-show-allGlobal and local cycling
org-show-branchesGlobal and local cycling
org-show-childrenGlobal and local cycling
org-show-todo-treeTODO Basics
org-sortStructure Editing
org-sparse-treeSparse Trees
org-speed-command-helpSpeed Keys
org-speedbar-set-agenda-restrictionAgenda Files
org-store-agenda-viewsExporting Agenda Views
org-store-linkActivation
org-store-linkHandling Links
org-store-linkExtracting Source Code
org-submit-bug-reportFeedback
org-switchbAgenda Files
org-table-alignBuilt-in Table Editor
org-table-alignColumn Width and Alignment
org-table-beginning-of-fieldBuilt-in Table Editor
org-table-blank-fieldBuilt-in Table Editor
org-table-copy-downBuilt-in Table Editor
org-table-copy-regionBuilt-in Table Editor
org-table-create-or-convert-from-regionBuilt-in Table Editor
org-table-create-or-convert-from-regionBuilt-in Table Editor
org-table-create-with-table.elCooperation
org-table-cut-regionBuilt-in Table Editor
org-table-delete-columnBuilt-in Table Editor
org-table-edit-fieldBuilt-in Table Editor
org-table-edit-formulasEditing and debugging formulas
org-table-end-of-fieldBuilt-in Table Editor
org-table-eval-formulaField and range formulas
org-table-eval-formulaColumn formulas
org-table-eval-formulaEditing and debugging formulas
org-table-eval-formulaEditing and debugging formulas
org-table-expandColumn Width and Alignment
org-table-exportBuilt-in Table Editor
org-table-fedit-abortEditing and debugging formulas
org-table-fedit-finishEditing and debugging formulas
org-table-fedit-line-downEditing and debugging formulas
org-table-fedit-line-upEditing and debugging formulas
org-table-fedit-lisp-indentEditing and debugging formulas
org-table-fedit-ref-downEditing and debugging formulas
org-table-fedit-ref-leftEditing and debugging formulas
org-table-fedit-ref-rightEditing and debugging formulas
org-table-fedit-ref-upEditing and debugging formulas
org-table-fedit-scroll-downEditing and debugging formulas
org-table-fedit-scroll-upEditing and debugging formulas
org-table-fedit-toggle-ref-typeEditing and debugging formulas
org-table-field-infoEditing and debugging formulas
org-table-header-line-modeBuilt-in Table Editor
org-table-hline-and-moveBuilt-in Table Editor
org-table-importBuilt-in Table Editor
org-table-insert-columnBuilt-in Table Editor
org-table-insert-hlineBuilt-in Table Editor
org-table-insert-rowBuilt-in Table Editor
org-table-iterateUpdating the table
org-table-iterate-buffer-tablesUpdating the table
org-table-kill-rowBuilt-in Table Editor
org-table-move-cell-downBuilt-in Table Editor
org-table-move-cell-leftBuilt-in Table Editor
org-table-move-cell-rightBuilt-in Table Editor
org-table-move-cell-upBuilt-in Table Editor
org-table-move-column-leftBuilt-in Table Editor
org-table-move-column-rightBuilt-in Table Editor
org-table-move-row-downBuilt-in Table Editor
org-table-move-row-upBuilt-in Table Editor
org-table-next-fieldBuilt-in Table Editor
org-table-next-rowBuilt-in Table Editor
org-table-paste-rectangleBuilt-in Table Editor
org-table-previous-fieldBuilt-in Table Editor
org-table-recalculateUpdating the table
org-table-recalculate-buffer-tablesUpdating the table
org-table-rotate-recalc-marksAdvanced features
org-table-shrinkColumn Width and Alignment
org-table-sort-linesBuilt-in Table Editor
org-table-sumBuilt-in Table Editor
org-table-toggle-column-widthColumn Width and Alignment
org-table-toggle-coordinate-overlaysEditing and debugging formulas
org-table-toggle-coordinate-overlaysEditing and debugging formulas
org-table-toggle-formula-debuggerEditing and debugging formulas
org-table-transpose-table-at-pointBuilt-in Table Editor
org-table-wrap-regionBuilt-in Table Editor
org-tags-viewTag Searches
org-tags-viewProperty Searches
org-tags-viewMatching tags and properties
org-tags-viewMatching tags and properties
org-texinfo-convert-region-to-texinfoExport Region
org-texinfo-export-to-infoTexinfo export commands
org-texinfo-export-to-texinfoTexinfo export commands
org-time-stampCreating Timestamps
org-time-stamp-inactiveCreating Timestamps
org-timerTimers
org-timer-itemTimers
org-timer-pause-or-continueTimers
org-timer-set-timerTimers
org-timer-startTimers
org-timer-stopTimers
org-timestampCreating Timestamps
org-timestamp-downClocking commands
org-timestamp-down-dayCreating Timestamps
org-timestamp-inactiveCreating Timestamps
org-timestamp-upClocking commands
org-timestamp-up-dayCreating Timestamps
org-todoClocking commands
org-todoUsing the Mapping API
org-todo-listGlobal TODO list
org-todo-listGlobal TODO list
org-toggle-archive-tagInternal archiving
org-toggle-checkboxCheckboxes
org-toggle-commentComment Lines
org-toggle-headingStructure Editing
org-toggle-ordered-propertyTODO dependencies
org-toggle-ordered-propertyCheckboxes
org-toggle-pretty-entitiesSubscripts and Superscripts
org-toggle-pretty-entitiesSpecial Symbols
org-toggle-radio-buttonCheckboxes
org-toggle-sticky-agendaAgenda Dispatcher
org-toggle-tagUsing the Mapping API
org-toggle-tags-groupsTag Hierarchy
org-toggle-time-stamp-overlaysCustom time format
org-toggle-timestamp-overlaysCustom time format
org-tree-to-indirect-bufferGlobal and local cycling
org-update-statistics-cookiesCheckboxes
org-versionFeedback
org-yankStructure Editing
orgtbl-ascii-drawOrg Plot
orgtbl-modeOrgtbl Mode
orgtbl-to-csvTranslator functions
orgtbl-to-genericTranslator functions
orgtbl-to-htmlTranslator functions
orgtbl-to-latexTranslator functions
orgtbl-to-orgtblTranslator functions
orgtbl-to-texinfoTranslator functions
orgtbl-to-tsvTranslator functions
orgtbl-to-unicodeTranslator functions
outline-up-headingMotion

P
pcompleteProperty Syntax
previous-errorSparse Trees

W
widenStructure Editing


G Variable Index

本索引并未完整收录所有变量与文本的视觉样式,仅包含手册中提及的内容。如需更完整的列表,可使用 M-x org-customize 并在选项树中逐级浏览。

Jump to:   C   I   L   O   P   U  

C
cdlatex-simplify-sub-super-scriptsCDLaTeX mode
constants-unit-systemReferences
constants-unit-systemIn-buffer Settings

I
icalendar-export-sexp-enumeration-daysiCalendar Export

L
LaTeX-verbatim-environmentsA LaTeX example

O
org-adapt-indentationHard indentation
org-agenda-auto-exclude-functionFiltering/limiting agenda items
org-agenda-bulk-custom-functionsAgenda Commands
org-agenda-bulk-custom-functionsAgenda Commands
org-agenda-bulk-persistent-marksAgenda Commands
org-agenda-category-filter-presetFiltering/limiting agenda items
org-agenda-category-icon-alistCategories
org-agenda-clock-consistency-checksAgenda Commands
org-agenda-columns-add-appointments-to-effort-sumEffort Estimates
org-agenda-confirm-killAgenda Commands
org-agenda-custom-commandsSparse Trees
org-agenda-custom-commandsStoring searches
org-agenda-custom-commandsSetting options
org-agenda-custom-commandsExtracting Agenda Information
org-agenda-custom-commands-contextsSetting options
org-agenda-default-appointment-durationiCalendar Export
org-agenda-diary-fileAgenda Commands
org-agenda-dim-blocked-tasksTODO dependencies
org-agenda-dim-blocked-tasksSpeeding Up Your Agendas
org-agenda-effort-filter-presetFiltering/limiting agenda items
org-agenda-entry-text-maxlinesAgenda Commands
org-agenda-exporter-settingsExporting Agenda Views
org-agenda-exporter-settingsExporting Agenda Views
org-agenda-filesAgenda Files
org-agenda-filesSorting of agenda items
org-agenda-ignore-propertiesSpeeding Up Your Agendas
org-agenda-inhibit-startupSpeeding Up Your Agendas
org-agenda-log-mode-itemsAgenda Commands
org-agenda-loop-over-headlines-in-active-regionExecute commands in the active region
org-agenda-max-effortFiltering/limiting agenda items
org-agenda-max-entriesFiltering/limiting agenda items
org-agenda-max-tagsFiltering/limiting agenda items
org-agenda-max-todosFiltering/limiting agenda items
org-agenda-overriding-headerSpecial Agenda Views
org-agenda-prefix-formatPresentation and Sorting
org-agenda-regexp-filter-presetFiltering/limiting agenda items
org-agenda-restore-windows-after-quitAgenda Views
org-agenda-search-headline-for-timeTime-of-day specifications
org-agenda-show-inherited-tagsAgenda Commands
org-agenda-show-inherited-tagsSpeeding Up Your Agendas
org-agenda-skip-archived-treesInternal archiving
org-agenda-skip-archived-treesAgenda Views
org-agenda-skip-comment-treesAgenda Views
org-agenda-skip-deadline-prewarning-if-scheduledDeadlines and Scheduling
org-agenda-skip-functionSpecial Agenda Views
org-agenda-skip-functionSpecial Agenda Views
org-agenda-skip-functionUsing the Mapping API
org-agenda-skip-function-globalSpecial Agenda Views
org-agenda-skip-scheduled-delay-if-deadlineDeadlines and Scheduling
org-agenda-skip-scheduled-if-doneDeadlines and Scheduling
org-agenda-skip-scheduled-repeats-after-deadlineRepeated tasks
org-agenda-sort-noeffort-is-highFiltering/limiting agenda items
org-agenda-sorting-strategySorting of agenda items
org-agenda-spanWeekly/daily agenda
org-agenda-spanAgenda Commands
org-agenda-start-dayWeekly/daily agenda
org-agenda-start-on-weekdayWeekly/daily agenda
org-agenda-start-with-archives-modeAgenda Commands
org-agenda-start-with-clockreport-modeAgenda Commands
org-agenda-start-with-entry-text-modeAgenda Commands
org-agenda-start-with-follow-modeAgenda Commands
org-agenda-stickyAgenda Dispatcher
org-agenda-tag-filter-presetFiltering/limiting agenda items
org-agenda-tags-columnPresentation and Sorting
org-agenda-tags-todo-honor-ignore-optionsMatching tags and properties
org-agenda-text-search-extra-filesAgenda Dispatcher
org-agenda-text-search-extra-filesSearch view
org-agenda-time-gridTime-of-day specifications
org-agenda-time-gridAgenda Commands
org-agenda-todo-ignore-deadlinesGlobal TODO list
org-agenda-todo-ignore-scheduledGlobal TODO list
org-agenda-todo-ignore-timestampGlobal TODO list
org-agenda-todo-ignore-with-dateGlobal TODO list
org-agenda-todo-list-sublevelsBreaking Down Tasks
org-agenda-todo-list-sublevelsGlobal TODO list
org-agenda-use-tag-inheritanceTag Inheritance
org-agenda-use-tag-inheritanceSpeeding Up Your Agendas
org-agenda-use-time-gridTime-of-day specifications
org-agenda-use-time-gridAgenda Commands
org-agenda-window-setupAgenda Views
org-alphabetical-listsPlain Lists
org-archive-default-commandArchiving
org-archive-default-commandAgenda Commands
org-archive-locationMoving subtrees
org-archive-locationIn-buffer Settings
org-archive-save-context-infoMoving subtrees
org-archive-subtree-save-file-pMoving subtrees
org-ascii-links-to-notesASCII/Latin-1/UTF-8 export
org-ascii-text-widthASCII/Latin-1/UTF-8 export
org-attach-archive-deleteAttachment options
org-attach-auto-tagAttachment options
org-attach-commandsAttachment options
org-attach-dir-relativeAttachment options
org-attach-expertAttachment options
org-attach-id-dirAttachment options
org-attach-id-to-path-function-listAttachment options
org-attach-methodAttachment defaults and dispatcher
org-attach-methodAttachment options
org-attach-preferred-new-methodAttachment options
org-attach-store-link-pAttachment options
org-attach-use-inheritanceAttachment options
org-babel-default-header-argsUsing Header Arguments
org-babel-default-header-argsUsing Header Arguments
org-babel-default-inline-header-argsUsing Header Arguments
org-babel-inline-result-wrapEvaluating Code Blocks
org-babel-load-languagesLanguages
org-babel-post-tangle-hookExtracting Source Code
org-babel-pre-tangle-hookExtracting Source Code
org-babel-tangle-body-hookExtracting Source Code
org-babel-tangle-finished-hookExtracting Source Code
org-beamer-environments-defaultFrames and Blocks in Beamer
org-beamer-environments-extraFrames and Blocks in Beamer
org-beamer-frame-levelFrames and Blocks in Beamer
org-beamer-themeBeamer specific export settings
org-bookmark-names-plistUsing capture
org-calc-default-modesFormula syntax for Calc
org-capture-last-storedUsing capture
org-capture-templatesCapture templates
org-capture-templates-contextsTemplates in contexts
org-capture-use-agenda-dateAgenda Commands
org-checkbox-hierarchical-statisticsCheckboxes
org-cite-activate-processorCitation handling
org-cite-biblatex-optionsCitation export processors
org-cite-export-processorCitation handling
org-cite-follow-processorCitation handling
org-cite-global-bibliographyCitations
org-cite-insert-processorCitation handling
org-clock-auto-clockout-timerResolving idle time
org-clock-continuouslyClocking commands
org-clock-continuouslyClocking commands
org-clock-continuouslyResolving idle time
org-clock-display-default-rangeThe clock table
org-clock-idle-timeResolving idle time
org-clock-in-prepare-hookClocking commands
org-clock-into-drawerClocking commands
org-clock-mode-line-totalClocking commands
org-clock-persistClocking Work Time
org-clock-report-include-clocking-taskAgenda Commands
org-clock-x11idle-program-nameResolving idle time
org-clocktable-defaultsThe clock table
org-closed-keep-when-no-todoClosing items
org-coderef-label-formatLiteral Examples
org-columnsUsing column view
org-columns-dblock-formatterCapturing column view
org-columns-default-formatUsing column view
org-columns-default-formatEffort Estimates
org-columns-default-formatAgenda Commands
org-columns-default-formatAgenda Column View
org-columns-default-format-for-agendaAgenda Column View
org-columns-skip-archived-treesInternal archiving
org-columns-summary-typesColumn attributes
org-complete-tags-always-offer-all-agenda-tagsSetting Tags
org-confirm-babel-evaluateCode Evaluation Security
org-create-file-search-functionsCustom Searches
org-crypt-tag-matcherOrg Crypt
org-ctrl-k-protect-subtreeHeadlines
org-cycle-emulate-tabGlobal and local cycling
org-cycle-global-at-bobGlobal and local cycling
org-cycle-include-plain-listsPlain Lists
org-cycle-inline-images-displayImages and link previews
org-cycle-open-archived-treesInternal archiving
org-cycle-separator-linesHeadlines
org-deadline-warning-daysDeadlines and Scheduling
org-deadline-warning-daysInserting deadline/schedule
org-default-notes-fileSetting up capture
org-default-notes-fileTemplate elements
org-directoryTemplate elements
org-display-custom-timesCustom time format
org-display-custom-timesIn-buffer Settings
org-disputed-keysConflicts
org-done, faceFaces for TODO keywords
org-edit-src-auto-save-idle-delayEditing Source Code
org-effort-propertyEffort Estimates
org-enforce-todo-dependenciesTODO dependencies
org-enforce-todo-dependenciesTODO dependencies
org-entities-userSpecial Symbols
org-execute-file-search-functionsCustom Searches
org-export-allow-bind-keywordsExport Settings
org-export-async-init-fileThe Export Dispatcher
org-export-backendsExporting
org-export-before-parsing-functionsAdvanced Export Configuration
org-export-before-parsing-hookAdvanced Export Configuration
org-export-before-processing-functionsAdvanced Export Configuration
org-export-before-processing-hookAdvanced Export Configuration
org-export-body-onlyThe Export Dispatcher
org-export-creator-stringHTML preamble and postamble
org-export-date-timestamp-formatExport Settings
org-export-default-languageExport Settings
org-export-default-languageLaTeX specific export settings
org-export-default-languageLaTeX header and sectioning
org-export-dispatch-use-expert-uiThe Export Dispatcher
org-export-exclude-tagsExport Settings
org-export-expand-linksExport Settings
org-export-force-publishingThe Export Dispatcher
org-export-global-macrosMacro Replacement
org-export-headline-levelsExport Settings
org-export-html-table-tagTables in HTML export
org-export-html-tag-class-prefixCSS support
org-export-html-todo-kwd-class-prefixCSS support
org-export-html-use-infojsJavaScript support
org-export-in-backgroundThe Export Dispatcher
org-export-initial-scopeThe Export Dispatcher
org-export-odt-convert-capabilitiesAdvanced topics in ODT export
org-export-odt-convert-processAdvanced topics in ODT export
org-export-odt-convert-processesAdvanced topics in ODT export
org-export-odt-preferred-output-formatODT export commands
org-export-odt-schema-dirAdvanced topics in ODT export
org-export-preserve-breaksExport Settings
org-export-replace-macrosMacro Replacement
org-export-select-tagsExport Settings
org-export-time-stamp-fileExport Settings
org-export-time-stamp-fileHTML preamble and postamble
org-export-timestamp-fileExport Settings
org-export-use-babelExporting Code Blocks
org-export-visible-onlyThe Export Dispatcher
org-export-with-archived-treesInternal archiving
org-export-with-archived-treesExport Settings
org-export-with-authorExport Settings
org-export-with-broken-linksExport Settings
org-export-with-clocksExport Settings
org-export-with-creatorExport Settings
org-export-with-dateExport Settings
org-export-with-drawersExport Settings
org-export-with-emailExport Settings
org-export-with-emphasizeExport Settings
org-export-with-entitiesExport Settings
org-export-with-fixed-widthExport Settings
org-export-with-footnotesExport Settings
org-export-with-inlinetasksExport Settings
org-export-with-latexLaTeX fragments
org-export-with-latexExport Settings
org-export-with-planningExport Settings
org-export-with-priorityExport Settings
org-export-with-propertiesExport Settings
org-export-with-section-numbersExport Settings
org-export-with-smart-quotesExport Settings
org-export-with-special-stringsExport Settings
org-export-with-statistics-cookiesExport Settings
org-export-with-sub-superscriptsSubscripts and Superscripts
org-export-with-sub-superscriptsExport Settings
org-export-with-tablesExport Settings
org-export-with-tagsExport Settings
org-export-with-tasksExport Settings
org-export-with-timestampsExport Settings
org-export-with-titleExport Settings
org-export-with-tocExport Settings
org-export-with-tocTable of Contents
org-export-with-todo-keywordsExport Settings
org-expot-creator-stringExport Settings
org-faces-easy-propertiesFaces for TODO keywords
org-fast-tag-selection-maximum-tagsSetting Tags
org-fast-tag-selection-single-keySetting Tags
org-file-appsHandling Links
org-file-appsAttachment defaults and dispatcher
org-fold-catch-invisible-editsCatching invisible edits
org-fold-catch-invisible-edits-commandsCatching invisible edits
org-fold-show-context-detailSparse Trees
org-fontify-emphasized-textEmphasis and Monospace
org-footnote-auto-adjustCreating Footnotes
org-footnote-auto-adjustIn-buffer Settings
org-footnote-auto-labelCreating Footnotes
org-footnote-auto-labelIn-buffer Settings
org-footnote-define-inlineCreating Footnotes
org-footnote-define-inlineIn-buffer Settings
org-footnote-sectionHeadlines
org-footnote-sectionCreating Footnotes
org-format-latex-headerLaTeX fragments
org-format-latex-headerPreviewing LaTeX fragments
org-format-latex-optionsPreviewing LaTeX fragments
org-global-propertiesProperty Syntax
org-global-propertiesEffort Estimates
org-goto-auto-isearchMotion
org-goto-interfaceMotion
org-group-tagsTag Hierarchy
org-habit-following-daysTracking your habits
org-habit-graph-columnTracking your habits
org-habit-preceding-daysTracking your habits
org-habit-show-habits-only-for-todayTracking your habits
org-hide-block-startupBlocks
org-hide-block-startupIn-buffer Settings
org-hide-drawer-startupIn-buffer Settings
org-hide-emphasis-markersEmphasis and Monospace
org-hide-leading-starsHard indentation
org-hide-leading-starsIn-buffer Settings
org-hide-macro-markersMacro Replacement
org-hide, faceHard indentation
org-hierarchical-todo-statisticsBreaking Down Tasks
org-html-container-elementHTML specific export settings
org-html-doctypeHTML specific export settings
org-html-doctypeHTML doctypes
org-html-doctype-alistHTML doctypes
org-html-headHTML specific export settings
org-html-headBare HTML
org-html-headCSS support
org-html-head-extraHTML specific export settings
org-html-head-extraBare HTML
org-html-head-extraCSS support
org-html-head-include-default-styleBare HTML
org-html-head-include-default-styleCSS support
org-html-head-include-scriptsBare HTML
org-html-html5-elementsHTML doctypes
org-html-html5-fancyHTML doctypes
org-html-inline-image-rulesImages in HTML export
org-html-inline-imagesImages in HTML export
org-html-link-homeHTML specific export settings
org-html-link-org-files-as-htmlLinks in HTML export
org-html-link-upHTML specific export settings
org-html-mathjax-optionsHTML specific export settings
org-html-mathjax-optionsMath formatting in HTML export
org-html-mathjax-templateMath formatting in HTML export
org-html-postambleHTML preamble and postamble
org-html-postambleBare HTML
org-html-postamble-formatHTML preamble and postamble
org-html-preambleHTML preamble and postamble
org-html-preambleBare HTML
org-html-preamble-formatHTML preamble and postamble
org-html-self-link-headlinesHeadlines in HTML export
org-html-style-defaultCSS support
org-html-table-align-individual-fieldsTables in HTML export
org-html-table-caption-aboveTables in HTML export
org-html-table-data-tagsTables in HTML export
org-html-table-default-attributesTables in HTML export
org-html-table-header-tagsTables in HTML export
org-html-table-row-tagsTables in HTML export
org-html-table-use-header-tags-for-first-columnTables in HTML export
org-html-use-infojsBare HTML
org-html-validation-linkHTML preamble and postamble
org-icalendar-alarm-timeiCalendar Export
org-icalendar-categoriesiCalendar Export
org-icalendar-combined-agenda-fileiCalendar Export
org-icalendar-include-bodyiCalendar Export
org-icalendar-include-todoiCalendar Export
org-icalendar-store-UIDiCalendar Export
org-icalendar-todo-unscheduled-startiCalendar Export
org-icalendar-ttliCalendar Export
org-icalendar-use-deadlineiCalendar Export
org-icalendar-use-schedulediCalendar Export
org-id-link-consider-parent-idHandling Links
org-id-link-to-org-use-idHandling Links
org-id-link-to-org-use-idExtracting Source Code
org-id-link-use-contextHandling Links
org-image-actual-widthImages
org-image-alignImages
org-image-max-widthImages
org-imenu-depthCooperation
org-indent-indentation-per-levelOrg Indent Mode
org-indent-mode-turns-off-org-adapt-indentationOrg Indent Mode
org-indent-mode-turns-on-hiding-starsOrg Indent Mode
org-infojs-optionsJavaScript support
org-insert-mode-line-in-empty-fileActivation
org-irc-links-to-logsHandling Links
org-latex-bib-compilerLaTeX/PDF export commands
org-latex-classesLaTeX specific export settings
org-latex-classesLaTeX specific export settings
org-latex-classesLaTeX header and sectioning
org-latex-compilerLaTeX/PDF export commands
org-latex-compilerLaTeX specific export settings
org-latex-default-classLaTeX specific export settings
org-latex-default-classLaTeX header and sectioning
org-latex-default-example-environmentExample blocks in LaTeX export
org-latex-default-packages-alistLaTeX/PDF export commands
org-latex-default-packages-alistLaTeX header and sectioning
org-latex-default-table-environmentTables in LaTeX export
org-latex-default-table-modeTables in LaTeX export
org-latex-engraved-optionsSource blocks in LaTeX export
org-latex-hyperref-templateLaTeX specific export settings
org-latex-hyperref-templateLaTeX specific export settings
org-latex-images-centeredImages in LaTeX export
org-latex-language-alistLaTeX specific export settings
org-latex-listings-optionsSource blocks in LaTeX export
org-latex-minted-optionsSource blocks in LaTeX export
org-latex-packages-alistLaTeX specific export settings
org-latex-packages-alistLaTeX header and sectioning
org-latex-packages-alistExample blocks in LaTeX export
org-latex-src-block-backendLiteral Examples
org-latex-src-block-backendSource blocks in LaTeX export
org-latex-subtitle-formatLaTeX specific export settings
org-latex-subtitle-separateLaTeX specific export settings
org-latex-tables-booktabsTables in LaTeX export
org-latex-tables-centeredTables in LaTeX export
org-latex-title-commandLaTeX specific export settings
org-latex-title-commandLaTeX specific export settings
org-latex-to-mathml-convert-commandLaTeX math snippets
org-latex-to-mathml-jar-fileLaTeX math snippets
org-latex-use-sansLaTeX header and sectioning
org-link-abbrev-alistLink Abbreviations
org-link-abbrev-alistIn-buffer Settings
org-link-context-for-filesHandling Links
org-link-descriptiveIn-buffer Settings
org-link-elisp-confirm-functionCode Evaluation Security
org-link-email-description-formatHandling Links
org-link-frame-setupHandling Links
org-link-from-user-regexpTemplate expansion
org-link-keep-stored-after-insertionHandling Links
org-link-parametersAdding Hyperlink Types
org-link-search-must-match-exact-headlineInternal Links
org-link-shell-confirm-functionCode Evaluation Security
org-link-store-propsTemplate expansion
org-link-use-indirect-buffer-for-internalsHandling Links
org-list-automatic-rulesPlain Lists
org-list-automatic-rulesCheckboxes
org-list-demote-modify-bulletPlain Lists
org-list-indent-offsetPlain Lists
org-list-use-circular-motionPlain Lists
org-log-doneTracking TODO state changes
org-log-doneAgenda Commands
org-log-doneIn-buffer Settings
org-log-into-drawerTracking TODO state changes
org-log-into-drawerAgenda Commands
org-log-note-clock-outClocking commands
org-log-note-clock-outIn-buffer Settings
org-log-redeadlineInserting deadline/schedule
org-log-refileRefile and Copy
org-log-repeatRepeated tasks
org-log-repeatIn-buffer Settings
org-log-rescheduleInserting deadline/schedule
org-log-states-order-reversedTracking TODO state changes
org-loop-over-headlines-in-active-regionExecute commands in the active region
org-M-RET-may-split-lineStructure Editing
org-M-RET-may-split-linePlain Lists
org-md-headline-styleMarkdown Export
org-mobile-directorySetting up the staging area
org-mobile-encryptionSetting up the staging area
org-mobile-filesPushing to the mobile application
org-mobile-inbox-for-pullPulling from the mobile application
org-num-faceDynamic Headline Numbering
org-num-format-functionDynamic Headline Numbering
org-num-max-levelDynamic Headline Numbering
org-num-skip-commentedDynamic Headline Numbering
org-num-skip-footnotesDynamic Headline Numbering
org-num-skip-tagsDynamic Headline Numbering
org-num-skip-unnumberedDynamic Headline Numbering
org-odd-levels-onlyMatching tags and properties
org-odd-levels-onlyHard indentation
org-odd-levels-onlyIn-buffer Settings
org-odd-levels-onlySpecial Agenda Views
org-odt-category-map-alistLabels and captions in ODT export
org-odt-convert-processExtending ODT export
org-odt-create-custom-styles-for-srcblocksLiteral examples in ODT export
org-odt-fontify-srcblocksLiteral examples in ODT export
org-odt-pixels-per-inchImages in ODT export
org-odt-preferred-output-formatODT export commands
org-odt-preferred-output-formatExtending ODT export
org-odt-styles-fileODT specific export settings
org-odt-styles-fileApplying custom styles
org-odt-table-stylesAdvanced topics in ODT export
org-odt-table-stylesAdvanced topics in ODT export
org-outline-path-complete-in-stepsRefile and Copy
org-plain-list-ordered-item-terminatorPlain Lists
org-plain-list-ordered-item-terminatorPlain Lists
org-popup-calendar-for-date-promptThe date/time prompt
org-pretty-entitiesSubscripts and Superscripts
org-pretty-entitiesIn-buffer Settings
org-pretty-entities-include-sub-superscriptsSubscripts and Superscripts
org-preview-latex-default-processPreviewing LaTeX fragments
org-priority-defaultPriorities
org-priority-defaultIn-buffer Settings
org-priority-facesPriorities
org-priority-highestPriorities
org-priority-highestIn-buffer Settings
org-priority-lowestPriorities
org-priority-lowestIn-buffer Settings
org-priority-start-cycle-with-defaultPriorities
org-property-allowed-value-functionsUsing the Property API
org-protocol-default-template-keyThe capture protocol
org-protocol-project-alistThe open-source protocol
org-publish-project-alistProject alist
org-publish-project-alistPublishing options
org-publish-project-alistSite map
org-publish-use-timestamps-flagTriggering Publication
org-read-date-display-liveThe date/time prompt
org-read-date-force-compatible-datesThe date/time prompt
org-read-date-prefer-futureThe date/time prompt
org-refile-allow-creating-parent-nodesRefile and Copy
org-refile-keepRefile and Copy
org-refile-targetsRefile and Copy
org-refile-use-cacheRefile and Copy
org-refile-use-outline-pathRefile and Copy
org-remove-highlights-with-changeSparse Trees
org-remove-highlights-with-changeClocking commands
org-replace-disputed-keysConflicts
org-return-follows-linkHandling Links
org-reverse-note-orderRefile and Copy
org-scheduled-delay-daysDeadlines and Scheduling
org-show-context-detailSparse Trees
org-sort-agenda-noeffort-is-highFiltering/limiting agenda items
org-sparse-tree-open-archived-treesInternal archiving
org-special-ctrl-a/eHeadlines
org-special-ctrl-kHeadlines
org-speed-commandsSpeed Keys
org-src-ask-before-returning-to-edit-bufferEditing Source Code
org-src-block-facesEditing Source Code
org-src-fontify-nativelyEditing Source Code
org-src-lang-modesEditing Source Code
org-src-preserve-indentationEditing Source Code
org-src-window-setupEditing Source Code
org-startup-align-all-tablesColumn Width and Alignment
org-startup-align-all-tablesIn-buffer Settings
org-startup-foldedInitial visibility
org-startup-foldedIn-buffer Settings
org-startup-foldedSpeeding Up Your Agendas
org-startup-indentedOrg Indent Mode
org-startup-indentedIn-buffer Settings
org-startup-numeratedDynamic Headline Numbering
org-startup-numeratedIn-buffer Settings
org-startup-shrink-all-tablesColumn Width and Alignment
org-startup-shrink-all-tablesIn-buffer Settings
org-startup-with-inline-imagesIn-buffer Settings
org-startup-with-latex-previewPreviewing LaTeX fragments
org-startup-with-link-previewsImages and link previews
org-store-link-propsTemplate expansion
org-structure-template-alistStructure Templates
org-stuck-projectsStuck projects
org-support-shift-selectPlain Lists
org-support-shift-selectPlain Lists
org-support-shift-selectConflicts
org-table-automatic-realignColumn Width and Alignment
org-table-copy-incrementBuilt-in Table Editor
org-table-current-columnReferences
org-table-current-dlineReferences
org-table-duration-custom-formatDurations and time values
org-table-export-default-formatBuilt-in Table Editor
org-table-formulaIn-buffer Settings
org-table-formula-constantsReferences
org-table-formula-constantsIn-buffer Settings
org-table-formula-constantsCooperation
org-table-header-line-pBuilt-in Table Editor
org-table-use-standard-referencesEditing and debugging formulas
org-tag-alistSetting Tags
org-tag-alistIn-buffer Settings
org-tag-facesTags
org-tag-persistent-alistSetting Tags
org-tags-columnSetting Tags
org-tags-exclude-from-inheritanceTag Inheritance
org-tempo-keywords-alistStructure Templates
org-texinfo-classesTexinfo file header
org-texinfo-classesHeadings and sectioning structure
org-texinfo-coding-systemTexinfo file header
org-texinfo-default-classTexinfo specific export settings
org-texinfo-default-classHeadings and sectioning structure
org-texinfo-info-processTexinfo export commands
org-texinfo-table-default-markupPlain lists in Texinfo export
org-time-stamp-custom-formatsCustom time format
org-time-stamp-custom-formatsIn-buffer Settings
org-time-stamp-rounding-minutesCreating Timestamps
org-timer-default-timerTimers
org-timestamp-custom-formatsCustom time format
org-timestamp-custom-formatsIn-buffer Settings
org-todo-keyword-facesFaces for TODO keywords
org-todo-keywordsTODO Basics
org-todo-keywordsTODO Extensions
org-todo-keywordsGlobal TODO list
org-todo-keywordsIn-buffer Settings
org-todo-repeat-to-stateRepeated tasks
org-todo-state-tags-triggersTODO Basics
org-todo, faceFaces for TODO keywords
org-track-ordered-property-with-tagTODO dependencies
org-track-ordered-property-with-tagCheckboxes
org-treat-insert-todo-heading-as-state-changeStructure Editing
org-treat-S-cursor-todo-selection-as-state-changeTODO Basics
org-use-property-inheritanceProperty Inheritance
org-use-property-inheritanceUsing Header Arguments
org-use-property-inheritanceUsing the Property API
org-use-speed-commandsSpeed Keys
org-use-sub-superscriptsSubscripts and Superscripts
org-use-tag-inheritanceTag Inheritance
org-yank-adjusted-subtreesStructure Editing
org-yank-dnd-default-attach-methodDrag and Drop & yank-media
org-yank-dnd-methodDrag and Drop & yank-media
org-yank-folded-subtreesStructure Editing
org-yank-image-file-name-functionDrag and Drop & yank-media
org-yank-image-save-methodDrag and Drop & yank-media

P
parse-time-monthsThe date/time prompt
parse-time-weekdaysThe date/time prompt

U
user-full-nameExport Settings
user-mail-addressExport Settings


Footnotes

(1)

若未全局启用字体锁定,可通过 ‘(add-hook 'org-mode-hook #'turn-on-font-lock)’ 在 Org 缓冲区单独开启。

(2)

为减轻邮件列表管理员的工作负担,建议你订阅该邮件列表。

(3)

可通过变量 org-special-ctrl-a/eorg-special-ctrl-k 以及 org-ctrl-k-protect-subtree 配置标题中 C-aC-eC-k 的特殊行为。另需注意,计时功能仅对星号数量少于 30 个的标题生效。

(4)

详见选项 org-cycle-emulate-tab

(5)

间接框架包含整个框架的内容,但会 narrowed 至当前大纲树。编辑间接框架同样会修改原框架,却不会影响原框架的可见状态。有关间接框架的更多信息,参见 GNU Emacs Manual

(6)

org-agenda-inhibit-startup 为非 nil 时,Org 为日程首次打开文件时不会遵循默认可见性状态,详见 Speeding Up Your Agendas

(7)

另请参阅变量 org-fold-show-context-detail ,用于控制每个匹配项周围显示多少上下文。

(8)

该行为受选项 org-remove-highlights-with-change 控制。

(9)

使用 ‘*’ 作为项目符号时,行首必须缩进,避免被识别为标题。此外,若隐藏前导星号以获得整洁的大纲视图,以星号开头的普通列表项可能难以与真正的标题区分。简而言之:尽管 ‘*’ 受支持,但仍建议不要将其用于普通列表项。

(10)

可通过配置 org-plain-list-ordered-item-terminator 禁用其中一种形式。

(11)

可通过配置 org-list-allow-alphabetical 启用 ‘a.’ 、 ‘A.’ 、 ‘a)’ 、 ‘A)’ 等序号格式。为避免与普通文本混淆,此类序号仅限单个字符,超出长度后会自动变为数字序号。

(12)

若列表项中包含复选框,统计标记必须置于复选框 之前 。若已启用字母序号列表,也可使用 ‘[@b]’ 这类计数器。

(13)

若不希望拆分项,可自定义变量 org-M-RET-may-split-line

(14)

若希望以此循环切换项,可自定义 org-list-use-circular-motion

(15)

循环行为见 org-list-use-circular-motion

(16)

许多桌面环境会拦截 M-TAB 用于窗口切换,此时可改用 C-M-iESC TAB

(17)

若要在表格单元格内插入竖线,可使用 ‘\vert’ ,或在单词内部使用 ‘abc\vert{}def’ 。

(18)

Org 可识别用户输入的 ‘B4’ 格式引用,但在提供可编辑公式时不会使用该语法。可通过变量 org-table-use-standard-references 自定义此行为。

(19)

计算时间复杂度为 O(N^2), 因为每个待复制单元格都要重新解析一次 FOO

(20)

文件 ‘constants.el’ 可提供两种单位制下的常量值: ‘SI’ 与 ‘cgs’ 。具体使用哪种取决于变量 constants-unit-system 。可通过 ‘STARTUP’ 选项 ‘constSI’ 与 ‘constcgs’ 为当前框架设置该值。

(21)

formatC 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Stringsformat 的文档字符串。

(22)

formatC 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Stringsformat 的文档字符串。

(23)

名称必须以字母开头,仅可使用字母、数字和下划线。

(24)

普通 URI 仅支持预定义的协议类型,参见 External Links。与 URI 语法不同,普通 URI 同样不能包含括号或空格,而尖括号包裹的 URI 无此限制。

(25)

更准确地说,具体行为取决于光标是如何到达此处的— 详见 Invisible Text

(26)

插入指向标题的链接时可使用框架内补全:在框架中输入星号与若干可选字母,按下 M-TAB,当前框架内所有标题均可作为补全项。

(27)

当指向 ‘NAME’ 关键字时, 必须搭配 ‘CAPTION’ 关键字才能获得正确编号(见 Captions)。

(28)

可运行 ‘M-x shortdoc-display-group’ 查看所有已知文档组。

(29)

搜索的实际行为取决于变量 org-link-search-must-match-exact-headline :值为 nil 时执行模糊文本搜索;值为 t 时仅精确匹配标题(忽略空格与统计标记);值为 query-to-create 时先精确搜索标题,未找到则询问用户是否创建。

(30)

必须先加载 org-id 库,可以通过 org-customize 、在 org-modules 中启用 id ,或在 Emacs 初始化文件中添加 ‘(require 'org-id)’ 实现。

(31)

同时需要 org-link-context-for-filesorg-id-link-use-context 均启用,默认即为启用状态。

(32)

插入链接并非必须使用该命令。Org 中的链接为普通文本,可直接输入或粘贴至框架中。使用该命令时,链接会自动包裹在双层方括号内,并提示输入可选描述文本。

(33)

插入已存储的链接后,该链接会从存储列表中移除。如需保留以便后续使用,可对 C-c C-l 使用三重 C-u 前缀参数,或配置选项 org-link-keep-stored-after-insertion

(34)

前提是已在 org-link-parameters 中为该链接的 :complete 属性定义了对应函数。

(35)

参见变量 org-link-use-indirect-buffer-for-internals

(36)

为兼容旧版,行号也可跟在单个冒号后。

(37)

当然,你可以创建一个只包含长待办事项列表的文档,但这并非必需。

(38)

修改变量 org-todo-keywords 后,需在缓冲区中重启 Org mode 方可生效。

(39)

这同样适用于议程框架中的 t 命令。

(40)

除 ‘@’ 、 ‘^’ 和 ‘!’ 外的所有字符均可使用,这些字符在此处有特殊含义。

(41)

Org mode 仅在打开文件并激活时解析这些行。 将光标置于以 ‘#+’ 开头的行并使用 C-c C-c, 即为当前缓冲区重启 Org mode。

(42)

对应的缓冲区内设置为: ‘#+STARTUP: logdone’ 。

(43)

对应的缓冲区内设置为: ‘#+STARTUP: lognotedone’ 。

(44)

参见变量 org-log-states-order-reversed

(45)

注意在议程框架中按下 SPC 显示条目时, ‘LOGBOOK’ 抽屉会自动展开;可使用 C-u SPC 使其保持折叠。

(46)

若同时启用 org-log-done 与状态变更记录,Org 模式可能会记录两个时间戳,但不会两次提示输入备注:若两者均配置,状态变更备注优先,取消任务完成备注。

(47)

另见选项 org-priority-start-cycle-with-default

(48)

若要将子任务排除在全局待办列表之外,参见选项 org-agenda-todo-list-sublevels

(49)

描述列表除外,不过可通过修改 org-list-automatic-rules 允许该行为。

(50)

若希望标记统计下方所有复选框而非仅直接子项,可设置变量 org-checkbox-hierarchical-statistics

(51)

在无复选框的列表 第一项 执行 C-u C-c C-c 会为列表其余项添加复选框。

(52)

与所有缓冲区内设置相同,按下 C-c C-c 可使该行修改生效。

(53)

若要将该列表扩展至所有日程文件中使用的标签(参见 Agenda Views),可自定义变量 org-complete-tags-always-offer-all-agenda-tags

(54)

未配置按键的标签会自动分配按键。

(55)

对于 ‘TIMESTAMP’ 与 ‘TIMESTAMP_IA’ : “首个(first)” 指条目中第一次出现的时间戳,而非时间最早的;计时条目开头的 ‘CLOCK:’ 前缀在此处视为关键字;属性抽屉内的时间戳会被忽略。

(56)

若同一属性被多次定义列,只有第一个定义会写入属性收纳块。例如 ‘%EFFORT{mean} %EFFORT(Sum){:}’ 只会写入 ‘EFFORT’ 的平均值而非合计值。若第一个列定义不含汇总类型( ‘%EFFORT %EFFORT{mean}’ ),则不会写入收纳块

(57)

时长可定义为持续时间,使用 org-duration-units 中定义的单位,例如 ‘3d 1h’ 。若列中存在此类值,汇总结果也会以持续时间形式呈现。

(58)

注意 ‘COLUMNS’ 定义必须写在一行内,此处换行仅为排版限制。

(59)

扩展包不属于 Emacs 核心,但随 Org 主发行版分发——访问 https://orgmode.org

(60)

Org 日期格式参考标准 ISO 8601 日期/时间格式。如需使用其他格式,参见 Custom time format。手动输入日期时星期名为可选项,而 Org 自动插入或修改的日期会添加该名称以便阅读。

(61)

使用标准日记表达式函数时需格外注意参数顺序,其顺序受变量 calendar-date-style 影响。例如指定 2005 年 12 月 1 日,调用形式可能为 ‘(diary-date 12 1 2005)’ 、 ‘(diary-date 1 12 2005)’ 或 ‘(diary-date 2005 12 1)’ ,极易造成混淆。Org 模式用户可使用专用函数 org-dateorg-anniversaryorg-cyclicorg-block ,用法与对应 diary- 函数一致,但参数固定为 ISO 顺序(年、月、日),不受 calendar-date-style 影响。

(62)

参见变量 org-read-date-prefer-future ,将其设为符号 time 可使早于当前时刻的时间自动跳转至次日。

(63)

若不需要日历, 可配置变量 org-popup-calendar-for-date-prompt

(64)

可使用日历命令 . 跳转至今日日期,但插入时间戳的小时部分时,. 会在小时后插入点号;与之相对,C-. 始终跳转至今日。

(65)

若觉得干扰, 可通过 org-read-date-display-live 关闭该显示。

(66)

任务标记为完成后仍会显示在对应日期中,若不希望如此,可设置变量 org-agenda-skip-scheduled-if-done

(67)

SCHEDULED’ 与 ‘DEADLINE’ 日期会插入在标题正下方,请勿在该行与标题之间添加任何文本。

(68)

对应 ‘STARTUP’ 选项 ‘logredeadline’ 、 ‘lognoteredeadline’ 和 ‘nologredeadline’ 。

(69)

对应 ‘STARTUP’ 选项 ‘logreschedule’ 、 ‘lognotereschedule’ 和 ‘nologreschedule’ 。

(70)

但 Org 不会重复非活动时间戳,参见 Timestamps

(71)

实际目标状态依次取自: ‘REPEAT_TO_STATE’ 属性、字符串类型的 org-todo-repeat-to-state 、 若变量为 t 则取前一个 TODO 状态,或 TODO 序列的第一个状态。

(72)

可通过选项 org-log-repeat 或 ‘STARTUP’ 选项 ‘logrepeat’ 、 ‘lognoterepeat’ 、 ‘nologrepeat’ 修改该行为。使用 ‘lognoterepeat’ 时会额外提示输入备注。

(73)

计时功能仅对所有星号缩进少于 30 个的标题生效,这是 org-clock-sumlmax 的硬编码限制。

(74)

若要假设你在 Emacs 之外仍在处理该任务并恢复计时,使用 ‘(setq org-clock-persist t)’ 。

(75)

如需 “即时(on the fly)” 添加预估耗时,可将实现该功能的函数挂入 org-clock-in-prepare-hook

(76)

任务最近一次重置时间由 ‘LAST_REPEAT’ 属性记录。

(77)

另见变量 org-clock-mode-line-total

(78)

对应的缓冲区内设置为: ‘#+STARTUP: lognoteclock-out’ 。

(79)

使用 :step 时, untilnow 从 2003 年初开始计算,而非从时间起点开始。

(80)

语言文本可通过变量 org-clock-clocktable-language-setup 设置。

(81)

注意所有参数必须写在同一行,此处换行仅为适配手册排版。

(82)

在 macOS 设备上,闲置状态基于实际用户闲置时间,而非仅 Emacs 闲置时间。X11 环境下可安装工具程序 ‘x11idle.c’ (位于 ‘org-contrib/’ 仓库),或 Debian 系统中安装 xprintidle 包并赋值给变量 org-clock-x11idle-program-name ,以实现相同的闲置检测逻辑。其他系统下闲置时间仅指 Emacs 闲置时间。

(83)

请注意在扁平列表中汇总层级数据存在局限性,参见 Using Column View in the Agenda

(84)

注意,对应 ‘STARTUP’ 选项为 ‘logrefile’ 、 ‘lognoterefile’ 和 ‘nologrefile’ 。

(85)

Org 曾为日期/周树捕获提供四种不同目标,现已自动转换为 file+olp+datetree ,并应用 :time-prompt:tree-type 属性。请使用 file+olp+datetree 重写原有日期/周树目标,旧目标已废弃。

(86)

日期树为一种大纲结构:顶层为年份,子层级为月份或 ISO 周,最底层为具体日期。

* 2022
** 2022-10 October
*** 2022-10-07 Friday
*** 2022-10-08 Saturday

树结构中允许使用 TODO 状态、优先级(priority)、标签(tag)、统计标记(statistics cookies)与 COMMENT 关键字。

(87)

文件名非绝对路径时,Org 会视为相对于 org-directory

(88)

若需原样使用这些序列,可用反斜杠转义 ‘%’ 。

(89)

若自定义了链接类型(参见 Adding Hyperlink Types),通过 org-link-store-props 保存的任何属性都可在捕获模板中以类似方式访问。

(90)

此处始终指对方而非用户,参见变量 org-link-from-user-regexp

(91)

如果你将条目或 Org 文件从一个目录移动到另一个目录,可能需要将 org-attach-id-dir 配置为绝对路径。

(92)

如果该变量的值不是列表而是单个文件名,则日程文件列表维护在该外部文件中。

(93)

使用调度器时,在选择命令前按下 < 会将命令限制在当前文件,直到下一次调度器命令前忽略 org-agenda-files

(94)

为兼容旧版,也可按 1 限制到当前缓冲区。

(95)

为兼容旧版,通用前缀参数 C-u 会使所有 TODO 条目列在日程之前,该功能已废弃,建议使用专用 TODO 列表或区块日程(参见 Block agenda)。

(96)

示例中变量 org-anniversarydiary-anniversary 类似,但参数顺序严格遵循 ISO 格式,与 calendar-date-style 无关。

(97)

字母数字和下划线前的反斜杠会被忽略。

(98)

不过,你可以将变量 org-agenda-search-headline-for-time 设置为 nil 来禁用此功能。

(99)

自定义日程命令可通过绑定变量 org-agenda-tag-filter-presetorg-agenda-category-filter-presetorg-agenda-effort-filter-presetorg-agenda-regexp-filter-preset 预设过滤器。该过滤器会应用至视图,并在刷新与次级过滤时保留。过滤器为整个日程视图的全局属性,在区块日程中仅应在全局选项段设置,而非单个区块段内。

(100)

此处仅尊重标签过滤,忽略耗时过滤。

(101)

你也可以通过 org-agenda-bulk-custom-functions 创建持久化自定义函数。

(102)

当设置 org-agenda-include-diary 时,该文件会被日程解析。

(103)

可通过包含前缀与描述的 cons 单元为前缀键添加说明。

(104)

此处 “已规划(planned)” 指条目附带规划信息,如时间戳、计划日期或截止日期。如何设置纳入统计的规划信息,参见 org-agenda-entry-types

(105)

HTML 导出需安装 Hrvoje Nikšić 的 ‘htmlize.el’ ,可从 NonGNU ELPA作者仓库 安装。

(106)

生成 PDF 输出需系统安装 Ghostscript ps2pdf 工具。选择导出 PDF 时同时会生成 PostScript 文件。

(107)

若需保存标准视图(如周日程、全局 TODO 列表),需先为其定义自定义命令才能指定导出文件。

(108)

引号规则因系统而异,示例见 FAQ。

(109)

标记仍会被识别,只是不会在 Emacs 中进行视觉高亮。

(110)

底层标记仍为上下标,仅视觉显示与导出行为改变。

(111)

可通过设置变量 org-pretty-entities 默认开启,或在文件中使用 ‘STARTUP’ 选项 ‘entitiespretty’ 。

(112)

可通过 ‘-’ 导出设置禁用该行为,见 Export Settings

(113)

LaTeX 是基于 Donald E. Knuth 的 TeX 系统的宏体系。此处描述为 “LaTeX” 的许多功能实际源自 TeX,为简便起见不再严格区分。

(114)

使用 MathJax 时,仅处理其支持的环境;使用 dvipng、dvisvgm 或 ImageMagick 套件生成图片时,可处理任意 LaTeX 环境。

(115)

相关工具分别可在 https://sourceforge.net/projects/dvipng/http://dvisvgm.bplaced.net/ 及 ImageMagick 套件获取。通过设置变量 org-preview-latex-default-process 选择转换器。

(116)

Org mode 提供判断光标是否在片段内的方法,见函数 org-inside-LaTeX-fragment-p 文档。

(117)

HTML 后端可自动实现该功能(需安装 1.34 及以上版本的 ‘htmlize.el’ 包)。LaTeX 中高亮代码块可使用 listingsminted 包或 engrave-faces 实现,详情参见 org-latex-src-block-backend

(118)

代码块中的源代码可交互式执行或在导出时执行,有关代码块执行的更多信息参见 Working with Source Code

(119)

在 ‘src’ 片段中,参数必须紧跟语言名称,置于 header arguments 之前

(120)

这需要一段 JavaScript,且 不会 自动包含在 HTML 输出中;必须将变量 ‘org-html-head-include-scripts’ 设为 t 才会包含,默认值为 nil

(121)

在 ‘-n -r’ 基础上添加 ‘-k’ ,可在为链接使用行号的同时 保留keeps 源码中的标签,这在讲解 Org 示例代码时很有用。

(122)

可通过变量 org-edit-fixed-width-region-mode 选择其他模式。

(123)

图片链接指指向现有图片文件的 ‘file:’ 和 ‘attachment:’ 链接;Emacs 仅能显示 image-types 变量中列出的链接图片。

(124)

Emacs 对图片的识别取决于 image-file-name-extensionsimage-file-name-regexps

(125)

图片宽度自定义要求 Emacs ≥ 24.1 且编译时支持 ImageMagick。

(126)

对应的缓冲区内设置为: ‘#+STARTUP: fninline’ 或 ‘#+STARTUP: nofninline’ 。

(127)

对应的缓冲区内选项为 ‘#+STARTUP: fnadjust’ 和 ‘#+STARTUP: nofnadjust’ 。

(128)

许多桌面环境会拦截 M-TAB 用于窗口切换,此时可改用 C-M-iESC TAB

(129)

变量 org-export-date-timestamp-format 定义该时间戳的导出格式。

(130)

导出为 LaTeX 格式(或 Beamer 等相关格式)时,需额外配置变量 org-latex-package-alist ,参见 LaTeX specific export settings

(131)

当前部分导出后端不遵循该规则:例如 LaTeX 导出默认将所有无编号标题排除在目录外,除非将自定义变量 ‘org-latex-toc-include-unnumbered’ 设为 ‘t’ ,或在章节属性中添加 ‘:UNNUMBERED: toc’ 。

(132)

注意 org-link-search-must-match-exact-headline 本地绑定为非 nil ,因此 org-link-search 仅匹配标题与命名元素。

(133)

org-export-replace-macros 设为 nil 可禁用宏替换,默认为 t。

(134)

逗号用于分隔参数,参数内的逗号需使用反斜杠转义,仅逗号前的反斜杠需要额外添加反斜杠转义。

(135)

Literal Examples 相同,需要用 ‘,’ 转义行首 ‘*’ 避免被识别为标题。

(136)

若需要限制更宽松的导出规则,可改用选择标签(见 Export Settings)。

(137)

若设置 ‘BEAMER_ENV’ ,Org 导出会添加 ‘B_environment’ 标签以便识别,该标签仅为视觉提示,无语义含义。

(138)

默认情况下 Org 从 jsDelivr 加载 MathJax,遵循 MathJax 组件快速上手 中的推荐配置。

(139)

注意导出的公式为 HTML 文档一部分, ‘<’ 、 ‘>’ 、 ‘&’ 等符号具有特殊含义,参见 MathJax TeX and LaTeX in HTML documents

(140)

若 TODO 关键字与标签的类名冲突,可使用变量 org-html-todo-kwd-class-prefixorg-html-tag-class-prefix 确保唯一性。

(141)

该命令会打开一个 PDF 文件,也可从 https://mirrors.ctan.org/info/latex-doc-ptr/latex-doc-ptr.pdf 下载

(142)

该方式不支持为不同文件设置不同参考文献编译器,不过 latexmk 等 “智能” LaTeX 编译系统可自动选择合适的编译器。

(143)

Minted 使用外部 Python 包进行代码高亮,需要在 org-latex-pdf-process 中添加 ‘-shell-escape’ 参数

(144)

参见 办公应用开放文档格式(OpenDocument)1.2 版本

(145)

MathToWeb

(146)

https://dlmf.nist.gov/LaTeXML/

(147)

OpenDocument-v1.2 Specification

(148)

见开放文档 v1.2 规范中的 ‘<table:table-template>’ 元素。

(149)

见开放文档 v1.2 规范中 ‘<table:table>’ 元素的 ‘table:template-name’ 、 ‘table:use-first-row-styles’ 、 ‘table:use-last-row-styles’ 、 ‘table:use-first-column-styles’ 、 ‘table:use-last-column-styles’ 、 ‘table:use-banding-rows-styles’ 、 ‘table:use-banding-column-styles’ 属性。

(150)

日记 sexp 事件(部分内置类型除外,见 icalendar-export-sexp-enumerate-all )最多会向未来导出 icalendar-export-sexp-enumeration-days 天。

(151)

除非另有说明,导出过程的每一步仅对缓冲区的可访问部分进行操作。当选择子树导出时(参见 The Export Dispatcher),缓冲区会被缩小到所选子树的主体范围,因此缓冲区中除导出关键字外的其余文本不会进入导出结果。

(152)

参见 org-export-define-backendorg-export-define-derived-backend 文档字符串中的转码器及 :translate-alist

(153)

参见 org-export-define-backend 文档字符串中的 inner-template

(154)

若发布目录与源目录相同, ‘file.org’ 会被导出为 ‘file.org.org’ ,因此通常不建议这样做。

(155)

可通过选项 org-babel-no-eval-on-ctrl-c-ctrl-c 移除 C-c C-c 的代码执行功能。

(156)

实际上, ‘call_<name>()’ 与 ‘src_<lang>{}’ 出现在关键字中时不会被执行,参见 Summary of In-Buffer Settings

(157)

实际上, ‘call_<name>()’ 与 ‘src_<lang>{}’ 出现在关键字中时不会被执行,参见 Summary of In-Buffer Settings

(158)

有关 noweb 文学编程详情,参见 https://www.cs.tufts.edu/~nr/noweb/.

(159)

下例中尝试执行第二个代码块会报错,因为第一个代码块中定义的变量在第二个块中无效。

#+NAME: get-prompt
#+BEGIN_SRC emacs-lisp :var prompt="root> " :var command="ls"
  (concat prompt command)
#+END_SRC
#+RESULTS: get-prompt
: root> ls
#+BEGIN_SRC emacs-lisp :noweb yes
  <<get-prompt>>
#+END_SRC

上一代码块展开时未设置 promptcommand 的值。

#+BEGIN_SRC emacs-lisp
  (concat prompt command)
#+END_SRC
(160)

引用执行时,光标会定位在被引用代码块处,并使用其头部参数(含继承而来的参数)

(161)

更多信息请参考 ‘org-tempo.el’ 中的注释部分。

(162)

Org 缩进模式会正确设置 wrap-prefix ,实现标题或长文本行的缩进与自动换行。该次要模式同时兼容可视化行模式与通过 word-wrap 直接设置的参数。

(163)

该方式可行但操作繁琐,多数场景下 Org 缩进模式更为便捷。

(164)

org-adapt-indentation 也可设置为 ‘'headline-data’ ,此时仅标题下方的数据行会缩进。

(165)

注意 Org 缩进模式同时设置 wrap-prefix 属性,使可视行模式(或仅开启 word-wrap )能正确缩进换行长文本(包括标题)。

(166)

若需搭建文件服务器,可考虑 WebDAV 服务器,例如 Nextcloud,更多帮助参见此 FAQ 条目

(167)

若 Emacs 配置了安全存储密码功能,则需自定义变量 org-mobile-encryption-password ;请查阅该变量的文档字符串。

(168)

org-directory 中的符号链接需要与目标文件同名。

(169)

生成日程时,Org 模式会为所有引用条目强制设置 ‘ID’ 属性,以便 Org Mobile 标记后可唯一识别。如需避免自动设置属性,可将变量 org-mobile-force-id-on-agenda-items 设为 nil ,此时 Org 依赖大纲路径标识,需保证路径唯一。

(170)

校验和会自动保存在 ‘checksums.dat’ 文件中。

(171)

操作后该文件会被清空。

(172)

默认情况下 org-yank-dnd-default-attach-method 设为 nil,即与 org-attach-method 使用相同值(默认为 cp )。

(173)

https://www.ctan.org/pkg/comment

(174)

默认仅支持 LaTeX、HTML、Texinfo 格式,可配置变量 orgtbl-radio-table-templates 为其他模式添加模板。

(175)

若 ‘TBLFM’ 关键字包含奇数个美元符号,可能导致 LaTeX 模式中的字体锁定异常。示例中通过在 ‘comment’ 环境内添加额外行平衡美元表达式可修复该问题。若使用 AUCTeX 与 font-latex 库,更佳方案是将 ‘comment’ 环境添加至变量 LaTeX-verbatim-environments

(176)

agenda* 视图与 agenda 基本相同,区别在于它只处理 /约会事项(appointments)/,即时间戳中包含 ‘[h]h:mm’ 格式时间的计划与截止日期条目。

(177)

注意,在 org-odd-levels-only 生效时,层级编号对应结构中的顺序,而非星号数量。