本手册适用于 Org 版本 10.0。
版权所有 © 2004–2026 自由软件基金会。
依据自由软件基金会发布的 GNU 自由文档许可证 第 1.3 版 或其更新版本,您有权复制、分发、修改本文档。本文档无固定章节,前封面文字为 “一份 GNU 手册”,后封面文字如下文 (a) 所述。许可证副本收录在名为 “GNU 自由文档许可证” 的章节中。
(a) 自由软件基金会的后封面文字为:“您拥有复制和修改本 GNU 手册的自由。”
yank-mediaOrg 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 年停业。
Org 已内置在 GNU Emacs 发行版中,通常无需额外安装。大多数用户只需启用 Org 即可开始使用其功能。
若因特殊原因需要在预装版本之外另行安装 Org,可使用 Emacs 包管理器或克隆 Org 的 Git 仓库。我们 强烈建议 仅使用一种安装方式。
在预装版本之上安装 Org 时请注意:Org 稳定版与最近三个 Emacs 稳定版完全兼容,但不支持更早版本的 Emacs。
部分 Org 组件依赖包仓库提供的第三方软件包,Org 仅保证与这些第三方包的最新稳定版兼容。
新版 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 会话隔离,避免出现版本冲突。
可克隆 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 页面。
Org 仓库曾包含 ‘contrib/’ 目录,用于存放社区贡献的扩展。自 Org 9.5 起,该目录已迁移至独立的 org-contrib 仓库,可作为 package 包从 NonGNU ELPA 单独安装。
Org 仓库外有许多优质扩展包,Worg 网站提供 org-contrib 与外部扩展包 列表,该列表并未完全收录所有相关项目。
Org 模式缓冲区需要启用字体锁定功能,这是 Emacs 的默认设置1。
Org 模式与部分 Elisp 包存在兼容问题(见 Packages that conflict with Org mode),建议查阅相关列表。
为提升使用体验, org-store-link 、 org-capture 与 org-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 激活区域。
如果你在使用 Org 时发现问题,或有相关疑问、意见与建议, 请发送邮件至 Org 邮件列表 mailto:[email protected]。 你可以通过该网页订阅该邮件列表。 若你并非邮件列表成员,你的邮件需经管理员审核后才会发布至列表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)” 信息会非常有用— 下文会说明如何生成该信息。 通常一份小型示例文件会很有帮助,同时请清晰说明以下内容:
若你感受到性能下降,可录制一份 “性能剖析文件(profile)” 并分享至 Org 邮件列表。 下文会说明如何生成有效的性能剖析数据。
感谢你帮助改进这款程序。
若使用 Org 时出现无法理解的错误提示,你可能遇到了程序缺陷。 报告此类问题的最佳方式是,除上述信息外,额外提供一份调用栈回溯信息。 该信息来自内置调试器,记录了错误发生的位置与原因。 以下是生成有效调用栈回溯信息的方法:
C-u M-x org-reload <RET>
或通过菜单操作:Org → 刷新/重新加载 → 以未编译形式重新加载 Org。
M-x toggle-debug-on-error <RET>
或通过菜单:选项 → 出错时进入调试器。
有时 Org 会无故运行缓慢。 这类卡顿通常由第三方包与 Org 模式的交互导致, 但定位根本原因并非总是易事。
Emacs 可以记录性能统计数据, 借此找出执行耗时最长的函数。 记录统计数据需要使用性能剖析器。 使用 Emacs 剖析器建议按以下步骤操作:
M-x profiler-stop <RET>
M-x profiler-start <RET> cpu <RET>
M-x profiler-report <RET>
该命令会显示 profiler-start 与 profiler-report
执行期间所运行的命令与函数摘要,耗时最长的命令会显示在顶部。
可在剖析器缓冲区中按 ‘<TAB>’ 键折叠或展开行。 展开后显示的子项即为被展开父项所调用的函数与命令。
根本原因通常深藏在剖析器的子项中。
你可以按 ‘B’ (profiler-report-render-reversed-calltree)
快速定位实际耗时最长的函数/命令。
按 ‘C’ profiler-report-render-calltree 可恢复原始视图。
保存数据的命令为:
M-x profiler-report-write-profile <RET> /path/to/profile-file-to-be-saved <RET>
随后将保存的文件附加到发送至 Org 邮件列表的邮件中, 并详细说明触发卡顿的操作。
注意:保存的统计数据仅包含函数名与执行耗时, 不会记录任何隐私数据。
Org 使用多种语法元素:TODO 关键字、标签、属性名、关键字、块等。 本手册使用以下约定:
TODO 关键字全部使用大写书写,即使用户自定义也是如此。
标签区分大小写。用户自定义标签通常使用小写; 具有特殊含义的内置标签按其在文档中的实际形式书写,一般为全大写。
用户自定义属性首字母大写; 具有特殊含义的内置属性全部使用大写。
关键字与代码块使用大写以提升可读性, 但你在自己的 Org 文件中可以使用小写。
本手册会同时列出功能对应的快捷键与命令。
Org 模式常会根据上下文,将同一个快捷键用于不同功能。
绑定到这类快捷键的命令通常使用通用名称,例如 org-metaright 。
手册会尽可能给出该通用命令内部实际调用的函数。
例如,在文档结构章节中,M-RIGHT 会标注为调用 org-do-demote ,
而在表格章节中,该快捷键则标注为调用 org-table-move-column-right 。
Org 是一款大纲编辑模式。大纲可以让文档以层级结构进行组织,至少对我而言,这是呈现笔记与思路的最佳方式。通过折叠可以概览该结构,也就是隐藏文档的大部分内容,只显示整体文档结构和当前正在处理的部分。Org 将显示与隐藏功能精简为单一命令 org-cycle 并绑定到 TAB 按键,极大简化了大纲的使用。
标题定义了大纲树的结构。Org 标题从行首3开始,由一个或多个星号后跟空格构成。示例如下:
* 第一级(顶层)标题
** 第二级
*** 第三级
一些文本
*** 第三级
更多文本
* 另一个第一级(顶层)标题
org-footnote-section 中定义的名称为保留名称,请勿将其用作自定义标题。
部分用户觉得大量星号显得杂乱,希望大纲标题标记为空白加单个星号的形式。这可以通过 Org 缩进次要模式实现,更多信息详见 A Cleaner Outline View。
标题默认不编号,但你可以对部分或全部标题进行动态编号,详见 Dynamic Headline Numbering。
子树末尾的空行会被视为该子树的一部分,子树折叠时会一同隐藏。若保留至少两个空行,折叠子树后会保留一个空行可见,用于规整折叠后的视图。可通过变量 org-cycle-separator-lines 修改该行为。
大纲支持隐藏缓冲区中的部分文本。Org 仅使用两个绑定到 TAB 和 S-TAB 的命令,即可切换缓冲区的可见性。
org-cycle) ¶子树循环切换: 将当前子树在以下状态间循环切换
,-> FOLDED -> CHILDREN -> SUBTREE --. '-----------------------------------'
光标需位于标题上该命令才会生效4
org-global-cycle), C-u TAB ¶全局循环切换: 将整个缓冲区在以下状态间循环切换
,-> OVERVIEW -> CONTENTS -> SHOW ALL --. '--------------------------------------'
当 S-TAB 携带数字前缀参数 N 时,仅显示至第 N 级标题的内容。
注意在表格内部(详见 Tables),S-TAB 会跳转到上一个字段。
仅当光标位于缓冲区最开头且不在标题上,同时 org-cycle-global-at-bob 设置为非 nil 值时,才能通过 TAB 执行全局循环切换。
org-cycle-set-startup-visibility) ¶恢复为缓冲区的启动可见性状态(详见 Initial visibility)。
org-fold-show-all) ¶显示全部内容,包括抽屉。
org-reveal) ¶显示光标周围的上下文,展示当前条目、后续标题以及上层层级结构。该命令适用于在稀疏树命令(详见 Sparse Trees)或日程命令(详见 Commands in the Agenda Buffer)所显示的位置附近编辑。携带前缀参数时,每层均显示所有同级标题;携带双重前缀参数时,还会显示父节点的完整子树。
org-show-branches) ¶展开子树的所有标题,但不显示其正文内容。
org-fold-show-children) ¶展开子树的所有直接子节点。携带数字前缀参数 N 时,展开至第 N 级的所有子节点。
org-tree-to-indirect-buffer) ¶在间接缓冲区5中显示当前子树。携带数字前缀参数 N 时,向上跳转至第 N 级并取该子树;若 N 为负数,则向上跳转对应级数。携带 C-u 前缀时,不删除此前使用的间接缓冲区。
org-copy-visible) ¶将区域内 可见 文本复制到剪切环。
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’ 。
org-cycle-set-startup-visibility) ¶恢复为缓冲区的启动可见性状态,即由启动选项和各条目 ‘VISIBILITY’ 属性指定的状态。
有时你会误操作编辑缓冲区的不可见部分,导致不清楚修改内容以及如何撤销错误。默认情况下,Org 会对部分用户命令禁止此类编辑,用户可通过自定义 org-fold-catch-invisible-edits-commands 控制生效的命令。
判断指定编辑是否存在风险的策略由 org-fold-catch-invisible-edits 控制,可用策略详见该选项的文档字符串。将该选项设为 nil 可完全关闭不可见编辑拦截功能。
下列命令可在缓冲区中跳转到其他标题。
org-next-visible-heading) ¶下一个标题。
org-previous-visible-heading) ¶上一个标题。
org-forward-heading-same-level) ¶同层级下一个标题。
org-backward-heading-same-level) ¶同层级上一个标题。
outline-up-heading) ¶向上跳转到更高层级标题。
org-goto) ¶跳转到其他位置,同时不改变当前大纲的显示状态。在临时缓冲区中显示文档结构, 可使用以下按键定位目标位置:
| TAB | 循环切换显示状态。 |
| DOWN / UP | 下一个/上一个可见标题。 |
| RET | 选中当前位置。 |
| / | 执行稀疏树搜索 |
关闭 org-goto-auto-isearch 后,以下按键生效。
| n / p | 下一个/上一个可见标题。 |
| f / b | 同层级下一个/上一个标题。 |
| u | 向上提升一级。 |
| 0 … 9 | 数字前缀参数。 |
| q | 退出。 |
另请参阅变量 org-goto-interface 。
org-meta-return) ¶插入新标题、列表项或表格行。
若在 行首 执行该命令,且光标处为标题或普通列表项(见 Plain Lists), 新标题/项将插入到当前行 之前 。在普通文本行首执行时,会将该行转为标题。
在行中间执行时,会拆分该行,后半部分成为新的列表项或标题。
若不希望拆分行,可自定义 org-M-RET-may-split-line 。
搭配 C-u 前缀执行时,将无条件在当前子树末尾插入新标题, 保留原有内容。搭配双重前缀 C-u C-u 时,新标题将创建在父级子树末尾。
org-insert-heading-respect-content) ¶在当前子树末尾插入新标题。
org-insert-todo-heading) ¶插入与当前标题同级的新 TODO 条目。另请参阅变量 org-treat-insert-todo-heading-as-state-change 。
org-insert-todo-heading-respect-content) ¶插入与当前标题同级的新 TODO 条目。与 C-RET 类似, 新标题将插入到当前子树之后。
org-cycle) ¶在尚无内容的新条目中,首次按下 TAB 会将该条目降级为前一条目的子项。 再次按下 TAB 会将其升级为父级,依此类推直至最顶层。 继续按下 TAB 则会回到初始层级。
org-do-promote), M-RIGHT (org-do-demote) ¶将当前标题提升或降级一级。
当存在激活区域—即瞬时标记模式激活时—提升与降级操作会作用于区域内所有标题。 选择标题区域时,建议将标记设在首个标题开头,光标置于最后一个待修改标题的下一行。
org-promote-subtree) ¶将当前子树整体提升一级。
org-demote-subtree) ¶将当前子树整体降级一级。
org-move-subtree-up) ¶将子树上移,即与同层级上一个子树交换位置。
org-move-subtree-down) ¶将子树下移,即与同层级下一个子树交换位置。
org-mark-subtree) ¶标记光标处的子树。重复按键可依次标记与已标记子树同级的后续子树。
org-cut-subtree) ¶剪切子树,即从缓冲区移除并保存至剪切环。 搭配数字前缀参数 N 时,剪切连续 N 个子树。
org-copy-subtree) ¶复制子树至剪切环。搭配数字前缀参数 N 时,复制连续 N 个子树。
org-paste-subtree) ¶从剪切环粘贴子树。会自动调整子树层级,使其适配粘贴位置。 粘贴层级也可通过数字前缀参数指定,或粘贴在类似 ‘****’ 的标题标记之后。 搭配 C-u 前缀时,强制作为同级节点插入。 搭配 C-u C-u 前缀时,强制作为子节点插入。
org-yank) ¶根据变量 org-yank-adjusted-subtrees 与 org-yank-folded-subtrees 的设置,
Org 内置的 yank 命令会以折叠状态智能粘贴子树,逻辑与 C-c C-x C-y 一致。
默认设置下不调整层级,但粘贴的子树会折叠,除非此举会遮挡原本可见的文本。
该命令的任何前缀参数都会强制执行普通 yank 并传递前缀。
强制普通粘贴的常用方式为 C-u C-y。
粘贴后使用 yank-pop 时,会直接粘贴之前的剪切内容,不做调整与折叠。
org-clone-subtree-with-time-shift) ¶克隆子树,创建多个同级副本。系统会提示输入副本数量,
并可选择是否偏移条目中的时间戳。
例如可用于快速创建一系列备课相关任务。
更多细节请参阅该命令的文档字符串 org-clone-subtree-with-time-shift 。
org-refile) ¶将条目或区域归档至其他位置。见 Refile and Copy。
org-sort) ¶对同层级条目排序。存在激活区域时,对区域内所有条目排序; 否则对当前标题的子项排序。命令会提示选择排序方式, 可按字母、数字、时间(优先首个激活时间戳、创建时间、计划时间、截止时间)、 优先级、TODO 关键字(按配置中定义顺序)或属性值排序。也支持反向排序, 还可自定义提取排序键的函数。搭配 C-u 前缀时,排序区分大小写。
org-narrow-to-subtree) ¶将缓冲区限制显示为当前子树。
org-narrow-to-block) ¶将缓冲区限制显示为当前块。
widen) ¶取消限制,恢复显示整个缓冲区。
org-toggle-heading) ¶将普通行或普通列表项转为标题,即在当前位置成为子标题; 也可移除标题星号,将标题还原为普通行。 存在激活区域时,将区域内所有行转为标题。 若区域首行为列表项,则仅将列表项行转为标题。 若区域首行为标题,则移除区域内所有标题的星号。
注意,当光标位于表格内时(见 Tables),Meta+方向键功能不同。
Org 模式的一项重要功能是可为大纲树中的指定内容构建 稀疏树(sparse trees) , 使整个文档尽可能折叠,但选中内容及其上方的标题结构保持可见7。 实际操作一次即可直观理解其工作方式。
Org 模式提供多个创建稀疏树的命令,均可通过调度器调用:
org-sparse-tree) ¶提示输入额外按键,选择创建稀疏树的对应命令。
org-occur) ¶提示输入正则表达式(见 Regular Expressions)并显示包含所有匹配项的稀疏树。 若匹配项在标题中,则显示该标题;若在条目正文中,则显示标题与正文。 为提供基础上下文,匹配项上方的完整标题层级及匹配项后的标题也会显示。 每个匹配项会高亮显示;执行编辑操作修改缓冲区或按下 C-c C-c 后高亮消失8。 搭配 C-u 前缀执行时,会保留之前的高亮,可多次叠加执行该命令。
next-error) ¶跳转到当前缓冲区中下一个稀疏树匹配项。
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
仅导出文档可见部分并打印生成的文件。
在大纲树的条目内部,手动格式化的列表可提供额外结构, 也可用于创建复选框列表(见 Checkboxes)。 Org 支持编辑此类列表,所有导出器(见 Exporting)均可解析并格式化。
Org 支持有序列表、无序列表与描述列表。
同属一个列表的项,首行缩进必须一致。 特别地,有序列表编号达到 ‘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 单独禁用。
org-cycle) ¶列表项可像标题层级一样折叠显示。通常仅当光标在普通列表项上时生效。
更多细节见变量 org-cycle-include-plain-lists 。
若该变量设为 integrate ,普通列表项将被视为低级标题,
项的层级由项目符号/数字的缩进决定。
但列表项始终从属于真实标题,两者层级完全分离。
在尚无内容的新项中,首次按下 TAB 会将该项降级为前一项的子项,
后续按下 TAB 会在列表中切换有效层级,最终回到初始位置。
org-insert-item) ¶在当前层级插入新项。搭配前缀参数时,强制插入新标题(见 Structure Editing)。 若在项中间执行,该项会 拆分 为两部分,后半部分成为新项13。 若在项正文之前执行,新项会插入到当前项 之前 。
插入带复选框的新项(见 Checkboxes)。
跳转到当前列表的上一个/下一个项,但仅当 org-support-shift-select 关闭时生效14。
未关闭时,可使用 C-UP 与 C-DOWN 等段落跳转命令实现类似效果。
将项及其子项整体上移/下移15, 即与同缩进的上一个/下一个项交换位置。若为有序列表,会自动重新编号。
减小/增大项的缩进,子项保持不变。
减小/增大项及其所有子项的缩进。 初始时根据当前缩进选择项树,连续多次执行时, 即使新缩进对应不同层级,仍使用初始选中区域。 若要应用新层级,需移动光标中断连续操作。
特殊情况:在列表首个项上执行该命令会移动整个列表。
可通过配置 org-list-automatic-rules 禁用该行为。
列表的整体缩进不影响列表 后 的文本。
若项行包含复选框(见 Checkboxes),切换复选框状态。 无论何种情况,都会检查整个列表的项目符号与缩进一致性。
将整个列表层级循环切换为不同项目符号( ‘-’ 、 ‘+’ 、 ‘*’ 、 ‘1.’ 、 ‘1)’ )或其子集,
具体取决于 org-plain-list-ordered-item-terminator 、列表类型与缩进。
搭配数字前缀参数 N 时,选择列表中第 N 种项目符号。
执行时若存在激活区域,将所有行转为列表项。
搭配前缀参数时,选中文本转为单个项。
若首行已是列表项,则移除所有项标记。
即使无激活区域,普通行也会转为列表项。
将普通列表项转为标题,即在当前位置成为子标题。 详细说明见 Structure Editing。
将整个普通列表转为当前标题的子树。 复选框(见 Checkboxes)未选中时转为 ‘TODO’ 关键字,选中时转为 ‘DONE’ 关键字。
当光标在项目符号上或项行任意位置时,该命令也会循环切换项目符号样式,
具体细节取决于 org-support-shift-select 。
对普通列表排序。提示选择排序方式:数字、字母、时间或自定义函数。
有时需要保存与条目关联的信息,但通常不希望显示。 为此 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’ 抽屉中。 若要像状态变更一样快速添加备注,可使用:
向 ‘LOGBOOK’ 抽屉添加带时间戳的备注。
Org 模式使用 ‘#+BEGIN’ … ‘#+END’ 块实现多种用途,
包括插入源代码示例(见 Literal Examples)、记录计时信息(见 Clocking Work Time)等。
在 ‘#+BEGIN’ 行按下 TAB 可折叠或展开这些块。
可通过配置变量 org-hide-block-startup 让所有块在启动时折叠,
或针对单个文件使用以下设置:
#+STARTUP: hideblocks #+STARTUP: nohideblocks
Org 内置了一款高效易用的表格编辑器。借助 Emacs Calc 软件包,还支持类似电子表格的计算功能(参见 GNU Emacs Calculator Manual)。
Org 可以轻松在纯 ASCII 文本中排版表格。任何以 ‘|’ 作为首个非空白字符的行都会被视为表格的一部分。 ‘|’ 同时也用作列分隔符17。 此外,以 ‘|-’ 开头的行表示水平分隔线,用于显式分隔行。 第一条水平分隔线之前的行均为表头行。一个表格示例如下:
| Name | Phone | Age | |-------+-------+-----| | Peter | 1234 | 17 | | Anna | 4321 | 25 |
在表格内按下 TAB、RET 或 C-c C-c 时,表格会自动重新对齐。 TAB 还会跳至下一个单元格—RET 跳至下一行— 并在表格末尾或水平分隔线之前创建新的表格行。表格的缩进由第一行决定。 每次重新对齐时,水平分隔线会自动扩展至整个表格宽度。因此,要创建上面的表格,你只需输入:
|Name|Phone|Age| |-
然后按下 TAB 对齐表格并开始填写内容。 更快的方式是输入 ‘|Name|Phone|Age’ ,随后按下 C-c RET。
在单元格中输入文本时,Org 会对 DEL、Backspace
以及所有字符按键做特殊处理,确保插入和删除操作不会打乱其他单元格。
此外,在通过 TAB、S-TAB 或 RET
移动到新单元格后 立即(immediately) 输入内容时,该单元格会自动清空。
如果你觉得该行为不够可控,可配置选项 org-table-auto-blank-field 。
org-table-create-or-convert-from-region) ¶将选中区域转换为表格。如果每行至少包含一个 TAB 字符, 函数会判定内容为制表符分隔。如果每行包含逗号,则判定为逗号分隔值(CSV)。 否则按空白字符分割为单元格。你可以使用前缀参数强制指定分隔符: C-u 强制为 CSV,C-u C-u 强制为 TAB, C-u C-u C-u 会提示输入匹配分隔符的正则表达式, 数字前缀参数 N 表示至少连续 N 个空格或一个 TAB 作为分隔符。
如果没有选中区域,该命令会创建一个空的 Org 表格。 不过更简单的方式是直接开始输入,例如 | N a m e | P h o n e | A g e RET | - TAB。
org-table-align) ¶重新对齐表格,光标位置不变。
org-table-next-field) ¶重新对齐表格,跳至下一个单元格,必要时创建新行。
清空当前表格单元格或选中区域。
org-table-previous-field) ¶重新对齐表格,跳至上一个单元格。
org-table-next-row) ¶重新对齐表格并跳至下一行,必要时创建新行。 在行首或行尾时,RET 仍会插入新行,因此可用于拆分表格。
org-table-beginning-of-field) ¶跳至当前表格单元格开头,或跳至上一个单元格。
org-table-end-of-field) ¶跳至当前表格单元格末尾,或跳至下一个单元格。
org-table-move-column-left) ¶将当前列左移。
org-table-move-column-right) ¶将当前列右移。
org-table-delete-column) ¶删除当前列。
org-table-insert-column) ¶在光标位置插入新列,将当前列及右侧所有单元格右移。
org-table-move-row-up) ¶将当前行上移。
org-table-move-row-down) ¶将当前行下移。
org-table-kill-row) ¶与上方相邻单元格交换位置,实现单元格上移。
org-table-move-cell-up) ¶Move cell up by swapping with adjacent cell.
org-table-move-cell-down) ¶与下方相邻单元格交换位置,实现单元格下移。
org-table-move-cell-left) ¶与左侧相邻单元格交换位置,实现单元格左移。
org-table-move-cell-right) ¶与右侧相邻单元格交换位置,实现单元格右移。
org-table-insert-row) ¶在当前行上方插入新行。使用前缀参数时,在当前行下方创建新行。
org-table-insert-hline) ¶在当前行下方插入水平分隔线。使用前缀参数时,在当前行上方创建分隔线。
org-table-hline-and-move) ¶在当前行下方插入水平分隔线,并将光标移至该分隔线下方的行。
org-table-sort-lines) ¶对区域内的表格行排序。光标位置指定排序列, 行范围为最近的水平分隔线之间的区域或整个表格。 如果光标在第一列之前,会提示选择排序列。 如果存在选中区域,标记指定首行与排序列,光标应位于排序包含的最后一行。 命令会提示排序类型:字母序、数字序或时间序。 可选择正序或倒序,也可使用自定义的键提取与比较函数。 带前缀参数调用时,字母排序区分大小写。
org-table-copy-region) ¶将表格中的矩形区域复制到专用剪贴板。 光标与标记确定矩形的边界单元格。若无选中区域,则仅复制当前单元格。 该过程会忽略水平分隔线。
org-table-cut-region) ¶将表格中的矩形区域复制到专用剪贴板,并清空该矩形内所有单元格,即 “剪切(cut)” 操作。
org-table-paste-rectangle) ¶将矩形区域粘贴到表格中,左上角对齐当前单元格,覆盖所有相关单元格。 如果矩形大小超出当前表格,表格会按需扩展。该过程忽略水平分隔线。
org-table-wrap-region) ¶在光标位置拆分当前单元格,将剩余内容移至下一行。 如果存在选中区域且光标与标记在同一列,该列文本会自动换行至指定行数的最小宽度。 数字前缀参数可修改目标行数。若无选中区域但指定前缀参数, 则清空当前单元格,并将内容追加到上方单元格。
org-table-sum) ¶对当前列或选中区域矩形内的数字求和。 结果显示在回显区,可通过 C-y 插入。
org-table-copy-down) ¶当前单元格为空时,从上方第一个非空单元格复制内容。 不为空时,将当前单元格内容复制到下一行并同步移动光标。
根据变量 org-table-copy-increment 的设置,
整数、时间戳字段以及前后带整数的字段在复制时可自动递增。
前缀参数 0 可临时禁用递增功能。
该快捷键同样用于选区切换及相关模式(详见 Packages that conflict with Org mode)。
org-table-edit-field) ¶在独立窗口中编辑当前单元格,适用于内容无法完全显示的单元格(详见 Column Width and Alignment)。 带一个 C-u 前缀调用时,仅完整显示单元格以便原地编辑。 带两个 C-u 前缀调用时,编辑窗口会跟随光标在表格中移动并始终显示当前单元格。 跟随模式在光标离开表格或重复执行 C-u C-u C-c ` 时自动退出。
导入文件作为表格。表格内容应为制表符或空白字符分隔。 例如可用于导入电子表格或数据库数据,这类程序通常可导出制表符分隔的文本文件。 该命令先将文件插入缓冲区,再将区域转换为表格。 所有前缀参数都会传递给转换器,用于确定分隔符。
org-table-create-or-convert-from-region) ¶也可通过以下方式导入表格:将表格文本粘贴到 Org 缓冲区, 使用 C-x C-x 选中粘贴内容,然后执行 C-c | 命令(详见 Creation and conversion)。
导出表格,默认格式为制表符分隔文件,用于与电子表格或数据库程序交换数据。
导出格式可通过变量 org-table-export-default-format 配置。
也可使用属性 ‘TABLE_EXPORT_FILE’ 与 ‘TABLE_EXPORT_FORMAT’
在子树中指定导出文件名与格式。Org 支持非常通用的表格导出格式,
导出器格式与 Orgtbl 无线电表格所用格式一致,详见 Translator functions。
当表格首行数据在缓冲区中不可见时,在窗口标题栏显示该行内容。
可将选项 org-table-header-line-p 设置为 t 以默认启用该次要模式。
对光标处的表格进行转置并移除水平分隔线。
列宽由表格编辑器自动确定。 列的对齐方式则根据该列中数值型与非数值型单元格的占比自动判断。
编辑单元格可能会改变表格的对齐方式。
移动连续的行或列——例如使用 TAB 或 RET—会自动重新对齐表格。
如果你想禁用该行为,可将 org-table-automatic-realign 设置为 nil 。
无论如何,你都可以手动对齐表格:
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 为以字符数表示的宽度。 你可以使用以下工具控制列的显示宽度:
org-table-toggle-column-width) ¶收缩或展开当前列。
如果某列通过宽度标记指定了宽度 W,收缩时只显示前 W 个可见字符。 否则该列会收缩至仅一个字符宽度。
若在第一列之前或最后一列之后调用,会提示输入要操作的列范围列表。
org-table-shrink) ¶收缩所有设置了宽度的列,展开其余列。
org-table-expand) ¶展开所有列。
将鼠标悬停在收缩后的单元格上即可查看完整文本,
提示窗口会显示该单元格的全部内容。
或者使用 C-h . (display-local-help) 也可显示完整内容。
为方便使用,在收缩列附近进行任何修改都会自动展开该列。
设置选项 org-startup-shrink-all-tables 会在打开文件时立即收缩所有包含宽度标记的列。
你也可以按单个文件设置:
#+STARTUP: shrink
如果你想覆盖自动对齐规则(数值多的列右对齐、文本多的列左对齐), 可以类似地使用 ‘<r>=、=<c>’ 或 ‘<l>’ 。 你还可以同时设置对齐方式和列宽,例如 ‘<r10>’ 。
仅包含这些格式标记的行会在导出文档时自动移除。
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) | |---+-----+-----+-----+---------+------------| | / | < | | | < | |
如果你喜欢 Org 表格编辑器直观的操作方式, 也可以在文本模式、邮件模式等其他模式中使用。 Orgtbl 次要模式可以实现这一点。 你可以随时通过 M-x orgtbl-mode 切换该模式。 要默认启用,例如在消息模式中启用,可使用:
(add-hook 'message-mode-hook #'turn-on-orgtbl)
此外,通过一些特殊配置,还可以在 Orgtbl 模式下维护任意语法格式的表格。 例如,可以借助 Orgtbl 模式便捷强大的功能(包括电子表格计算能力)来编写 LaTeX 表格。 详情参见 Tables in Arbitrary Syntax。
表格编辑器借助 Emacs Calc 软件包实现了类似电子表格的功能。 它还可以执行 Emacs Lisp 表达式,根据其他单元格的值计算出新单元格的内容。 尽管功能完备,Org 的实现与其他电子表格并不完全相同。 例如,Org 引入了 列公式(column formula) 的概念:一条公式即可应用于整列的所有非表头单元格, 无需将公式复制到每个相关单元格。此外还提供公式调试器, 以及具备以下特性的公式编辑器:高亮表格中与光标所在公式引用对应的单元格, 并可通过方向键移动这些引用。
要根据表格中其他单元格计算当前单元格,公式必须引用其他单元格或区域。 在 Org 中,单元格可以通过名称、绝对坐标和相对坐标引用。 若要查看某个单元格的坐标,可在该单元格内按下 C-c ?, 或按下 C-c } 切换显示坐标网格。
公式可以通过两种方式引用其他单元格的值。 与其他电子表格一样,你可以用字母+数字的组合如 ‘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’ | 最后一行第五列的单元格 |
你可以通过两个单元格引用以两个点 ‘..’ 连接的方式,指定一个矩形单元格区域。 区域包含起止两个端点。 如果两个单元格都在当前行,你可以直接写成 ‘$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。
在执行 Calc 公式和 Lisp 公式时,最先执行的操作之一就是将公式中的 ‘@#’ 和 ‘$#’
替换为当前结果单元格所在的行号和列号。
传统 Lisp 公式中对应的变量是 org-table-current-dline 和 ~org-table-current-column~。
示例:
奇数行显示列号,偶数行清空单元格。
将名为 FOO 的表格中每一行第一列的文本或数值, 复制到当前表格的第二列。
将名为 FOO 的表格中第一行每一列的值翻倍后, 写入当前表格的第三行。
第二、第三个示例中,表格 FOO 的行/列数至少要与当前表格相同。 注意这种方式效率较低19,不适用于大量行。
‘$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(NAME,REF)
其中 NAME 可以是当前文件中某张表格的名称, 由表格前的 ‘#+NAME:’ 行设定;也可以是某个条目的 ID(即便在其他文件中), 此时引用指向该条目中的第一张表格。 REF 是上文所述的绝对单元格或区域引用, 例如 ‘@3$3’ 或 ‘$somename’ ,在被引用表格中有效。
当 NAME 格式为 ‘@ROW$COLUMN’ 时, 会被替换为当前表格该单元格中的名称或 ID。 例如 ‘remote($1, @@>$2)’ ⇒ ‘remote(year_2013, @@>$1)’ 。 不支持 ‘B3’ 格式,因为无法与普通表格名或 ID 区分。
公式可以是 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 配置。
将 Calc 内部计算精度设为 20 位。
将 Calc 计算结果以普通、科学、工程或定点格式返回给 Org。 只要 Calc 计算精度足够,其格式化精度不受限制。
Calc 的角度模式:角度制 / 弧度制。
Calc 的分数模式与符号模式。
Calc 的单位简化模式。Calc 同时也是符号计算器, 可以处理带单位的数值,在 Org 表格单元格中以数字后接单位字符串表示。 该模式指示 Calc 在返回结果前简化计算表达式中的单位。
Calc 或 Lisp 中的时长计算,参见 Durations and time values。
是否以及如何处理空单元格。 不带 ‘E’ 时,区域引用中的空单元格会被忽略, Calc 向量或 Lisp 列表只包含非空值。 带 ‘E’ 时空单元格会被保留。 区域或单元格引用为空时,Calc 公式中使用 ‘nan’ (非数值), Lisp 公式中使用空字符串。添加 ‘N’ 可对两类公式都改用 0 代替空值。 对单个单元格而言,模式 ‘N’ 优先级高于 ‘E’ 。
将所有单元格按数值解析,非数值按 0 处理。 下一节会说明这对 Lisp 公式计算至关重要。 在 Calc 公式中偶尔使用,因为不带 ‘N’ 时数串已会被解析为数值。
字面量模式(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 还包含完整的逻辑运算集合(参见 逻辑运算)。例如:
若年龄 ‘$1’ 小于 20 则显示 ‘"teen"’ ,否则 Org 表格结果单元格置空。
前两列之和。若任一输入单元格为空,则结果单元格置空。 ‘E’ 用于避免将空单元格转为 0。 ‘f-1’ 是可选的 Calc 格式字符串, 类似 ‘%.1f’ ,但会保留空结果。
计算区域的平均值,若区域中存在任意空单元格则结果为空。 区域内的每个空单元格都会被替换为 ‘nan’ ,这会导致 ‘vmean’ 函数返回 ‘nan’ 。 随后 ‘typeof =’ 12= 会检测出 ‘vmean’ 返回的 ‘nan’ ,并将 Org 表格的结果单元格设为空。 当预期数据集永远不会存在缺失值时,使用此方式。
区域平均值,跳过空单元格。 区域内所有空单元格均被忽略;若全部为空则平均值无定义,结果置空。 适用于数据集大小可变的场景。
区域平均值,空单元格按 0 计算。 仅适用于需要用 0 填充不完整样本的场景。
你可以用 defmath 在 Emacs Lisp 中自定义 Calc 函数,并在 Calc 公式语法中使用。
也可以使用 Emacs Lisp 编写公式。如果 Calc 的功能不足以满足需求,这种方式在字符串处理和控制结构方面会非常有用。
当公式以单引号后跟左括号开头时,会被当作 Lisp 表达式求值。表格单元格引用会在执行前代入到 Lisp 表达式中。求值结果应当为字符串或数字。求值模式以及用于渲染返回值的 format 字符串(类似 printf )22 可以在分号后指定。
默认情况下,单元格引用会作为字面量 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 ";");
如果需要计算时间值,可以在 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 ,结果以小时小数形式展示(见示例中第三个公式)。
负时长同样可以参与运算,加减法中的整数会被当作秒数处理。
要为某个特定字段指定公式,可以直接在字段中输入,以 ‘:=’ 开头,例如 ‘vsum(@II..III)’ 。当光标仍在该字段内时按下 TAB、RET 或 C-c C-c,公式会被保存为该字段的公式并执行,当前字段会被结果替换。
公式会保存在表格正下方专用的 ‘TBLFM’ 关键字中。如果在表格第三行数据的第四个字段输入公式,形式为 ‘@3$4=$1+$2’ 。使用相应命令插入、删除或交换行列时,已保存公式中的 绝对引用(absolute reference) (而非相对引用)会自动调整,以保持指向原单元格。为避免这种情况,尤其是在范围引用中,可将范围锚定在表格边界(使用 ‘@<’ 、 ‘@>’ 、 ‘$<’ 、 ‘$>’ )或使用 ‘@I’ 标记锚定在水平分隔线上。如果使用普通编辑命令修改表格结构,字段引用不会自动适配,需要手动修正公式。
除了直接在字段中输入等式,也可以使用以下命令:
org-table-eval-formula) ¶为当前字段设置新公式。该命令会提示输入公式,默认值取自 ‘TBLFM’ 关键字,应用到当前字段并保存。
公式左侧也可以使用特殊表达式,将公式应用到多个不同字段。这类范围公式没有快捷键,可通过公式编辑器(见 Editing and debugging formulas)或直接编辑 ‘TBLFM’ 关键字添加。
列公式,对整列生效。这类用法非常常见,Org 会对其做特殊处理,详见 Column formulas。
行公式,应用到指定行的所有字段。 ‘@>=’ 表示最后一行。
范围公式,应用到指定矩形区域内的所有字段。也可用于为某一行中的部分字段指定公式。
命名字段,详见 Advanced features。
当为简单列引用(如 ‘$3=’ )指定公式时,该列所有字段都会使用同一公式,但有以下便捷例外:(i) 如果表格包含水平分隔线,且分隔线上下均有数据行,第一条分隔线以上的内容会被视为表格表 头 ,列公式不会修改表头内容。因此,使用列公式并希望用分隔线分组行时(例如将底部总计行与上方求和行分开),必须设置表头。(ii) 已通过字段/范围公式赋值的字段,列公式不会覆盖。这些规则让列公式使用起来非常简便。
要为某列指定公式,可直接在该列任意字段输入,以等号开头,例如 ‘=$1+$2’ 。当光标仍在该字段内时按下 TAB、RET 或 C-c C-c,公式会保存为当前列的公式并执行,当前字段被结果替换。如果字段仅包含 ‘=’ ,则使用该列之前保存的公式。Org 对每一列只记录最近使用的公式。在 ‘TBLFM’ 关键字中,列公式形如 ‘$4=$1+$2’ 。列公式左侧不能使用列名,必须为数字列引用或 ‘$>’ 。
除了直接在字段中输入等式,也可以使用以下命令:
org-table-eval-formula) ¶为当前列设置新公式,并将当前字段替换为公式结果。命令会提示输入公式,默认值取自 ‘TBLFM’ 关键字,应用到当前字段并保存。若带数字前缀参数,例如 C-5 C-c =,则会将公式应用到当前列连续指定数量的字段。
Org 内置了三个 Emacs Lisp 函数用于表格查找。
在列表 S-LIST 中查找第一个使
(PREDICATE VAL S)
非 nil 的元素 S,并返回列表 R-LIST 中对应位置的值。默认 PREDICATE 为 equal 。注意参数 VAL 和 S 传入 PREDICATE 的顺序与 org-lookup-first 调用时一致,即 VAL 在 S-LIST 之前。若 R-LIST 为 nil ,则返回 S-LIST 中匹配的元素 S。
与上述 org-lookup-first 类似,但查找使 PREDICATE 非 nil 的最后一个元素。
与 org-lookup-first 类似,但查找 所有 使 PREDICATE 非 nil 的元素,并返回 所有 对应值。该函数不能单独在公式中使用,因为它返回值列表。但与其他 Emacs Lisp 函数结合时,可实现强大的查找功能。
如果这些函数使用的范围包含空字段,通常需要为公式指定 ‘E’ 模式,否则空字段不会被包含在 S-LIST 和/或 R-LIST 中,可能导致 S-LIST 元素与 R-LIST 元素映射错误。
这三个函数可用于实现关联数组、统计匹配单元格、结果排序、数据分组等。实用示例参见 Worg 上的教程。
可以在迷你缓冲区或直接在字段中编辑单个公式。Org 也可以打开专用缓冲区,显示表格所有生效公式。提供公式编辑时,Org 会尽可能将引用转为标准格式(如 ‘B3’ 或 ‘D&’ )。如果希望只使用内部格式(如 ‘@3$2’ 或 ‘$4’ ),可配置变量 org-table-use-standard-references 。
org-table-eval-formula) ¶在迷你缓冲区中编辑当前列/字段关联的公式。详见 Column formulas 和 Field and range formulas。
org-table-eval-formula) ¶将当前生效公式(字段公式或列公式)重新插入当前字段,可直接在字段内编辑。相比迷你缓冲区编辑,优势是可以使用 C-c ? 命令。
org-table-field-info) ¶在表格字段中编辑公式时,高亮光标所在引用指向的字段。
org-table-toggle-coordinate-overlays) ¶通过覆盖层开关表格行号和列号的显示。表格对齐时会自动更新,也可通过 C-c C-c 强制刷新。
org-table-toggle-formula-debugger) ¶开关公式调试器。详见下文。
org-table-edit-formulas) ¶在专用缓冲区中编辑当前表格的所有公式,每行显示一个公式。如果当前字段有生效公式,公式编辑器光标会定位到该公式。在专用缓冲区中,Org 会自动高亮光标所在的字段或范围引用。可编辑、删除、添加公式,并使用以下命令:
org-table-fedit-finish) ¶退出公式编辑器并保存修改后的公式。带 C-u 前缀时,会同时将新公式应用到整个表格。
org-table-fedit-abort) ¶退出公式编辑器且不应用修改。
org-table-fedit-toggle-ref-type) ¶在公式编辑器中切换所有引用的显示格式,在标准格式(如 ‘B3’ )和内部格式(如 ‘@3$2’ )之间切换。
org-table-fedit-lisp-indent) ¶对光标所在的 Lisp 公式进行美化打印或缩进。当行内包含 Lisp 公式时,按 Emacs Lisp 规则格式化。再次按下 TAB 会将公式折叠回去。展开的公式中,TAB 会像在 Emacs Lisp 模式中一样重新缩进。
lisp-complete-symbol) ¶补全 Lisp 符号,与 Emacs Lisp 模式一致。
移动光标所在的引用。例如引用为 ‘B3’ 时按下 S-RIGHT,会变为 ‘C3’ 。相对引用和分隔线引用同样适用。
org-table-fedit-line-up) ¶在 Org 缓冲区中将列公式的测试行上移。
org-table-fedit-line-down) ¶在 Org 缓冲区中将列公式的测试行下移。
org-table-fedit-scroll-up) ¶向上滚动显示表格的窗口。
org-table-fedit-scroll-down) ¶向下滚动显示表格的窗口。
开关表格中的坐标网格显示。
将表格字段置空并不会删除该字段关联的公式,因为公式保存在独立的 ‘TBLFM’ 关键字行中。下次重新计算时,字段会再次被填充。要删除字段的公式,需要在提示输入公式时给出空值,或直接编辑 ‘TBLFM’ 关键字。
可以直接编辑 ‘TBLFM’ 关键字,并在该行按下 C-c C-c 或使用表格常规重计算命令重新应用修改后的等式。
可以临时应用某个公式。在需要切换表格应用的公式时非常实用。在表格下方放置多个 ‘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
当公式求值出错时,字段内容会变为字符串 ‘#ERROR’ 。如果希望查看变量替换和计算过程以排查错误,可以在表格菜单中开启公式调试,然后重新计算,例如在字段中按下 C-u C-u C-c = RET,会显示详细信息。
表格通常不会自动重计算,需要通过命令触发。如需实现至少半自动重计算,详见 Advanced features。
重计算表格某一行或整个表格可使用以下命令:
org-table-recalculate) ¶重计算当前行:先从左到右应用已保存的列公式,再执行当前行所有字段/范围公式。
逐行重计算整个表格。第一条水平分隔线以上的行会被忽略,视为表头。
org-table-iterate) ¶迭代重计算表格,直到不再发生变化。当某些计算字段依赖计算顺序更 靠后 的其他字段时,需要使用该命令。
重计算当前缓冲区中的所有表格。
迭代当前缓冲区中的所有表格,使表格间依赖关系收敛。
如果希望字段自动重计算,或为字段和列指定 名称23,需要将表格第一列预留为特殊标记字符。
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。参数与常量用法完全一致,仅支持按表格单独定义。
在该行按下 TAB、RET 或 S-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
Org Plot 可以根据 Org 表格中存储的信息生成图表, 既可以是图形化图表,也可以是 ASCII 艺术图表。
Org Plot 可以借助 Gnuplot 与 Gnuplot mode, 将 Org 表格中的数据生成二维与三维图表。 想要实际体验该功能,请先确保系统已安装 Gnuplot 与 Gnuplot mode, 随后将光标置于下方表格处,执行 C-c " g 或 M-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。
指定绘图时需要设置的任意 Gnuplot 选项。
指定图表标题。
指定表格中用作 ‘x’ 轴的列。
指定表格中用作 ‘x’ 轴时间值的列。
以 Lisp 风格列表形式指定需要绘制的列,使用圆括号包裹、空格分隔, 例如 ‘dep:(3 4)’ 表示绘制第三列与第四列。 默认绘制除 ‘ind’ 指定列之外的所有列。
取值为 ‘y’ 、 ‘yes’ 或 ‘t’ 时,会在绘图前尝试转置表格数据。 也支持简写 ‘trans’ 。
指定图表类型,默认为 ‘2d’ 、 ‘3d’ 、 ‘radar’ 或 ‘grid’ 之一。
可用类型可通过 org-plot/preset-plot-types 自定义。
为所有待绘制列指定 ‘with’ 选项,例如 ‘lines’ 、 ‘points’ 、 ‘boxes’ 、 ‘impulses’ 。 默认为 ‘lines’ 。
若需要将图表输出至文件,可指定为 ‘"path/to/desired/output-file"’ 。
为 ‘deps’ 指定的列设置标签列表。 若存在表头,默认使用列标题。
指定一整行内容,直接插入到 Gnuplot 脚本中。
绘制 ‘3d’ 或 ‘grid’ 类型图表时,将此项设为 ‘t’ 可绘制平面映射图,而非三维坡度图。
设置图表可使用的坐标轴最小值,默认指代 ‘y’ 轴。 可通过 ‘xmin’ 与 ‘ymin’ 分别显式指定 ‘x’ 轴与 ‘y’ 轴的最小值。
设置图表可使用的坐标轴最大值,默认指代 ‘y’ 轴。 可通过 ‘xmax’ 与 ‘ymax’ 分别显式指定 ‘x’ 轴与 ‘y’ 轴的最大值。
设置希望显示的坐标轴刻度数量,供对应图表类型使用。
若未指定,需要刻度的图表类型会通过 org--plot/sensible-tick-num 自动计算合适值。
指定 Org 时间戳的格式,以便 Gnuplot 解析。 默认为 ‘%Y-%m-%d-%H:%M:%S’ 。
若需要完全自主控制,可指定一个脚本文件(文件名用双引号包裹)用于绘图。 绘图前,脚本中所有 ‘$datafile’ 都会被替换为生成的数据文件路径。 注意:即使设置了该选项,通常仍建议指定图表类型,因为它会影响数据文件内容。
将光标置于某一列上,输入 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 调用。
在表格中绘制 ASCII 柱状条。
VALUE 为待绘制的数据值。
MIN 对应空柱所代表的数值,MAX 对应填满整个 WIDTH 柱宽的数值。 超出该范围的源数据会显示为 ‘too small’ 或 ‘too large’ 。
WIDTH 为柱状图所占字符数,默认为 ‘12’ 。
与 HTML 类似,Org 支持文件内部链接、指向其他文件的外部链接、 新闻组文章、电子邮件等多种链接形式。
Org 可以识别普通 URI,也支持用尖括号包裹24, 并将它们激活为可点击链接。
而通用的链接格式如下所示:
[[LINK][DESCRIPTION]]
或者简写形式:
[[LINK]]
LINK 部分中的部分 ‘\’ 、 ‘[’ 、 ‘]’ 字符需要 “转义(escaped)”, 即在其前面再加一个 ‘\’ 。具体来说,必须转义的字符只有以下几种:
插入链接的函数(见 Handling Links)会自动对歧义字符正确转义。
只有当你直接在方括号内插入或粘贴 URI 时,才需要关心上述规则。
如有疑问,可以使用函数 org-link-escape ,它会将链接字符串转为转义后的形式。
当缓冲区中的一个链接完整且所有括号都齐全时,Org 会改变显示方式:
显示 ‘DESCRIPTION’ 而非 ‘[[LINK][DESCRIPTION]]’ ,
显示 ‘LINK’ 而非 ‘[[LINK]]’ 。
链接会使用 org-link 文本的视觉样式高亮,默认是带下划线的样式。
你可以直接编辑链接的可见部分: 如果没有描述文本,则是 LINK 部分; 否则是 DESCRIPTION 部分。 若要编辑不可见的 LINK 部分, 将光标置于链接上并使用 C-c C-l(见 Handling Links)。
如果将光标放在显示文本的开头或末尾后方并按下 BS,
会删除该位置不可见的括号25。
这会使链接变为不完整状态,内部结构重新以纯文本显示。
插入缺失的括号后,链接内部会再次隐藏。
若要显示所有链接的内部结构,可使用菜单:Org → Hyperlinks → Literal links,
自定义 org-link-descriptive ,
或使用 ‘literallinks’ 启动选项(见 Summary of In-Buffer Settings)。
不具备 URL 形式的链接—即不以已知协议或文件名开头的链接— 指向当前文档。将光标放在链接上时, 可通过 C-c C-o 或鼠标点击打开(见 Handling Links)。
Org 对文档内部导航提供了多项增强功能。 最常用的是 ‘[[#my-custom-id]]’ 这样的结构, 它精确指向 ‘CUSTOM_ID’ 属性为 ‘my-custom-id’ 的条目。 此外,形如 ‘[[*Some section]]’ 的内部链接会指向标题为 ‘Some section’ 的标题26。
当链接不属于以上任何一种情况时,Org 会查找 专用目标(dedicated target) : 即使用双层尖括号的相同字符串,例如 ‘<<My Target>>’ 。
如果没有专用目标,链接会尝试匹配缓冲区中某个元素的确切名称。 命名通过 ‘NAME’ 关键字完成,该关键字必须放在其所指向元素的前一行, 如下例所示:
#+NAME: My Target | a | table | |----+------------| | of | four cells |
最后,如果以上方式均未匹配成功,Org 会根据 org-link-search-must-match-exact-headline 的值,
搜索与链接文本完全一致(可包含 TODO 关键字与标签)的标题,
或发起纯文本搜索。
注意:你必须确保自定义 ID、专用目标和名称在整个文档中唯一。 如有需要,Org 提供语法检查工具辅助处理。详见 Org Syntax。
导出时,内部链接用于标记对象并为其分配编号。 被标记的对象会被指向它们的链接所引用。 特别是没有描述文本的链接,会显示为被标记对象的编号27。 以下是 Org 缓冲区中的一段示例:
1. one item 2. <<target>>another item Here we refer to item [[target]].
导出后最后一句话会显示为: ‘Here we refer to item 2’ 。
在非 Org 文件中,搜索会查找链接文本中的单词。 上例中,搜索内容为 ‘target’ 。
打开链接时会向 Org 的标记环中添加一个标记。 你可以使用 C-c & 返回上一位置。 连续多次使用该命令可回到更早记录的位置。
Org 可以自动将普通文本中出现的特定目标名称转为链接。 这样无需显式创建链接,文本即可连接到对应目标并定位其位置。 无线电目标使用三层尖括号包裹。 例如,目标 ‘<<<My Target>>>’ 会使普通文本中每次出现 ‘my target’ 时都激活为链接。 Org 文件仅在首次加载到 Emacs 时自动扫描无线电目标。 若要在编辑时更新目标列表, 将光标放在目标上或其附近并按下 C-c C-c。
Org 支持指向文件、网站、新闻组与邮件、BBDB 数据库条目的链接, 以及 IRC 对话及其日志的链接。 外部链接是类 URL 定位符,以简短标识字符串开头,后跟冒号, 冒号后不能有空格。
以下是全部内置链接类型:
文件链接。文件名可以是远程路径、绝对路径或相对路径。
特殊情况:如果文件名完整(例如以 ‘./’ 或 ‘/’ 开头),可省略 “file” 前缀。
与文件链接相同,但指向附加到当前节点的文件与文件夹(见 Attachments)。 附件链接的行为与文件链接完全一致,只是路径相对于附件目录。
指向 BBDB 记录的链接,支持正则表达式补全。
指向使用 DocView mode 打开的文档,可指定页码。
通过数字对象标识符指向电子资源。
激活时执行一条 Elisp 命令。
指向指定 Emacs 邮件客户端中的邮件或文件夹。
在 ‘*Help*’ 缓冲区中显示符号的文档。
网页链接。
通过 ID 属性指向某个 Org 文件中的特定标题。
指向 Info 手册或特定节点。
指向 IRC 频道。
调用邮件撰写窗口。
新闻组链接。
激活时执行一条 shell 命令。
指向一组 Emacs Lisp 函数的简要文档汇总。 28
更多信息见 Name Help 和 Documentation Groups。
对于 ‘file:’ 和 ‘id:’ 链接,还可以用 ‘::’ 分隔,额外指定行号或文本搜索串。 在 Org 文件中,也可以直接指向标题名、自定义 ID 或代码引用。
下表展示了上述链接类型及其用法示例:
| Link Type | Example |
|---|---|
| http | ‘http://orgmode.org/’ |
| https | ‘https://orgmode.org/’ |
| doi | ‘doi:10.1000/182’ |
| file | ‘file:/home/dominik/images/jupiter.jpg’ |
| ‘/home/dominik/images/jupiter.jpg’ (同上) | |
| ‘file:papers/last.pdf’ | |
| ‘./papers/last.pdf’ (同上) | |
| ‘file:/ssh:[email protected]:papers/last.pdf’ (远程文件) | |
| ‘/ssh:[email protected]:papers/last.pdf’ (同上) | |
| ‘file:sometextfile::NNN’ (跳转到指定行号) | |
| ‘file:projects.org’ | |
| ‘file:projects.org::some words’ (文本搜索)29 | |
| ‘file:projects.org::*task title’ (标题搜索) | |
| ‘file:projects.org::#custom-id’ (按自定义 ID 搜索标题) | |
| attachment | ‘attachment:projects.org’ |
| ‘attachment:projects.org::some words’ (文本搜索) | |
| docview | ‘docview:papers/last.pdf::NNN’ |
| id | ‘id:B7423F4D-2E8A-471B-8810-C40F074717E9’ |
| ‘id:B7423F4D-2E8A-471B-8810-C40F074717E9::*task’ (标题搜索) | |
| news | ‘news:comp.emacs’ |
| mailto | ‘mailto:[email protected]’ |
| mhe | ‘mhe:folder’ (文件夹链接) |
| ‘mhe:folder#id’ (邮件链接) | |
| rmail | ‘rmail:folder’ (文件夹链接) |
| ‘rmail:folder#id’ (邮件链接) | |
| gnus | ‘gnus:group’ (组链接) |
| ‘gnus:group#id’ (文章链接) | |
| bbdb | ‘bbdb:R.*Stallman’ (正则匹配记录) |
| irc | ‘irc:/irc.com/#emacs/bob’ |
| help | ‘help:org-store-link’ |
| info | ‘info:org#External links’ |
| shortdoc | ‘shortdoc:text-properties’ |
| ‘shortdoc:text-properties::#get-pos-property’ | |
| shell | ‘shell:ls *.org’ (同步执行), ‘shell:inkscape&’ (异步执行) |
| elisp | ‘elisp:(find-file "Elisp.org")’ (待执行的 Elisp 表达式) |
| ‘elisp:org-agenda’ (交互式 Elisp 命令) |
除了这些内置链接类型外, ‘org-contrib’ 仓库还提供更多类型(见 Installation)。 例如,当你从 ‘org-contrib’ 加载对应库后, 即可使用指向 VM 或 Wanderlust 邮件的链接:
| ‘vm:folder’ | VM 文件夹链接 |
| ‘vm:folder#id’ | VM 邮件链接 |
| ‘vm://[email protected]/folder#id’ | 远程机器上的 VM |
| ‘vm-imap:account:folder’ | VM IMAP 文件夹链接 |
| ‘vm-imap:account:folder#id’ | VM IMAP 邮件链接 |
| ‘wl:folder’ | Wanderlust 文件夹链接 |
| ‘wl:folder#id’ | Wanderlust 邮件链接 |
关于自定义 Org 以添加新链接类型的说明,见 Adding Hyperlink Types。
链接应使用双层方括号包裹,并可包含显示用描述文本以替代 URL(见 Link Format),例如:
[[https://www.gnu.org/software/emacs/][GNU Emacs]]
如果描述文本是指向图片的文件名或 URL,HTML 导出(见 HTML Export)会将图片内嵌为可点击按钮。 如果完全没有描述文本且链接指向图片,该图片会直接嵌入到导出的 HTML 文件中。
Org 也能识别普通文本中的外部链接并将其激活。 如果链接中必须包含空格(例如 ‘bbdb:R.*Stallman’ ), 或需要消除链接结尾的歧义,可将链接用方括号或尖括号包裹。
Org 提供了按正确语法创建链接、将其插入 Org 文件以及跳转链接的方法。
主要函数为 org-store-link ,通过 M-x org-store-link 调用。由于该功能十分重要,建议将其绑定到一个常用按键上(见 Activation)。它会为当前位置创建一个链接并保存,供稍后插入到 Org 缓冲区—详见下文。创建的链接类型取决于当前缓冲区:
对于 Org 文件,如果光标处存在 ‘<<target>>’ ,链接将指向该目标。如果光标处有命名块(使用 ‘#+name:’ ),链接将指向该名称。除此之外,链接指向当前标题,并以该标题作为描述文本。
如果该标题含有 ‘CUSTOM_ID’ 属性,则保存指向该自定义 ID 的链接。此外,根据 org-id-link-to-org-use-id 的取值,还可为链接创建并/或使用全局唯一的 ‘ID’ 属性30。因此在 Org 缓冲区中使用该命令,可能会生成两种链接:一种是基于自定义 ID、人类可读的链接,另一种是全局唯一、即便条目在文件间移动依然有效的链接。=ID= 属性可以是 UUID(默认)或时间戳,具体由 org-id-method 决定。稍后插入链接时,你可以选择使用哪一种。
当 org-id-link-consider-parent-id 为 t31 时,会考虑上层标题的 ‘ID’ 属性。这样即便某个具体目标、命名块或标题自身没有全局唯一 =ID=,也可以在拥有全局 ID 的上层标题或文件上下文内实现精确链接。
例如下方 Org 文件:
* Parent :PROPERTIES: :ID: abc :END: ** Child 1 ** Child 2
将光标放在 “Child 1” 处保存链接,会生成链接 ‘<id:abc::*Child 1>’ ,即便该子标题自身没有 ID,也能精确指向 “Child 1”。
几乎所有 Emacs 邮件客户端均受支持。链接指向当前文章,在部分 Gnus 缓冲区中则指向新闻组。描述文本根据变量 org-link-email-description-format 构造,默认包含收件人与主题。
链接为当前 URL,并以页面标题作为描述。
在 BBDB 缓冲区中创建的链接指向当前条目。
对于 IRC 链接,如果变量 org-irc-link-to-logs 非 nil ,则创建一个 ‘file’ 类型链接,指向当前对话日志中的相关位置;否则保存 ‘irc’ 类型链接,指向光标下的用户/频道/服务器。
对于任意其他文件,链接指向该文件,并附带一个搜索字符串(见 Search Options in File Links)定位当前行内容。如果存在活跃选区,选中的文字将作为搜索字符串的基础。你可以编写自定义 Lisp 函数,为特定文件类型选择搜索串并执行搜索(见 Custom Searches)。
你也可以定义指向其他文件的专用链接,见 Adding Hyperlink Types。
当光标位于日程视图中时,创建的链接指向当前行所引用的条目。
在 Org 缓冲区中,以下命令可用于创建、导航或对链接执行其他操作。
org-insert-link) ¶插入链接32。命令会提示输入要插入的链接,你可以直接输入链接内容:内部链接使用文本即可,外部链接则使用上文示例中的类型前缀。链接会连同描述文本一起插入缓冲区33。如果此时有选中的文本,该文本将作为默认描述。
当前会话中保存的所有链接都会出现在提示历史中,可通过 UP 和 DOWN(或 M-p、M-n)选择。
使用 TAB 补全可帮助输入合法的链接前缀,如 ‘http’ 或 ‘ftp’ ,包括通过链接缩写定义的前缀(见 Link Abbreviations)。如果只输入前缀后按下 RET,Org 会为部分链接类型提供专用补全支持34。例如输入 f i l e RET—另一种方式是 C-u C-c C-l,见下文—Org 会提供文件名补全;输入 b b d b RET 后则可以补全联系人姓名。
当以 C-u 作为前缀调用 C-c C-l 时,直接插入指向文件的链接,并可使用文件名补全选择文件。若被链接文件位于当前 Org 文件所在目录或其子目录,或路径使用 ‘../’ 相对当前目录书写,则插入相对路径;否则使用绝对路径,主目录部分尽可能用 ‘~/’ 表示。使用两层 C-u 前缀可强制使用绝对路径。
当光标位于已有链接上时,C-c C-l 允许编辑链接的地址与描述部分。
org-open-at-point) ¶打开光标处的链接。对于 URL 会启动网页浏览器(使用 browse-url-at-point );对于对应类型链接会启动 VM/MH-E/Wanderlust/Rmail/Gnus/BBDB;对于 shell 链接会执行其中命令。当光标位于内部链接上时,该命令会执行对应的搜索。当光标位于标题的标签部分时,会创建对应的标签视图(见 Matching tags and properties)。若光标位于时间戳上,则会生成该日期的日程。此外,它会用 Emacs 打开 ‘file’ 链接中的文本文件与远程文件,并为本地非文本文件选择合适的应用程序。文件类型仅根据扩展名判断,详见选项 org-file-apps 。若想覆盖默认应用、强制用 Emacs 打开,可使用 C-u 前缀;若想避免用 Emacs 打开,则使用 C-u C-u 前缀。
若光标位于标题上但不在链接处,Org 会显示该标题与正文中的所有链接。如果需要配置打开链接时的框架布局,可自定义 org-link-frame-setup 。
当 org-return-follows-link 开启时,RET 也可打开光标处的链接。
在链接上,mouse-1 与 mouse-2 的作用与 C-c C-o 相同,均可打开链接。
功能与 mouse-2 类似,但会强制用 Emacs 打开文件链接,并在另一个窗口中显示内部链接35。
org-mark-ring-push) ¶将当前位置压入 Org 标记环,方便后续返回。打开内部链接的命令会自动执行该操作。
org-mark-ring-goto) ¶跳回已记录的位置。打开内部链接的命令与 C-c % 都会记录位置。连续多次使用该命令可在历史位置环中依次回退。
org-next-link), C-c C-x C-p (org-previous-link) ¶在缓冲区中向前/向后移动到下一个/上一个链接。到达缓冲区边界时,搜索失败一次后会循环到另一端。该按键组合较长,你可能希望将其绑定到 M-n 和 M-p。
(with-eval-after-load 'org (define-key org-mode-map (kbd "M-n") #'org-next-link) (define-key org-mode-map (kbd "M-p") #'org-previous-link))
你不仅可以在 Org 中,还可以在任意 Emacs 缓冲区中插入和跳转符合 Org 语法的链接。为此,Org 提供了两个函数: org-insert-link-global 和 org-open-at-point-global 。
你可以将它们绑定到全局可用按键,相关建议见 Activation。
输入长 URL 十分繁琐,而文档中又常常需要大量相似链接,这时可以使用链接缩写。缩写链接格式如下:
[[linkword:tag][description]]
其中标签 tag 为可选部分。链接词 linkword 必须是一个单词,以字母开头,后跟字母、数字、=-= 和 ‘_’ 。缩写根据变量 org-link-abbrev-alist 中的映射关系解析,该变量将链接词与替换文本相关联。示例如下:
(setq org-link-abbrev-alist
'(("bugzilla" . "https://10.1.2.9/bugzilla/show_bug.cgi?id=")
("Nu Html Checker" . "https://validator.w3.org/nu/?doc=%h")
("duckduckgo" . "https://duckduckgo.com/?q=%s")
("omap" . "https://nominatim.openstreetmap.org/search?q=%s&polygon=1")
("ads" . "https://ui.adsabs.harvard.edu/search/q=%20author%3A\"%s\"")))
如果替换文本包含 ‘%s=,则会被标签替换。使用 =%h’ 替代 ‘%s’ 会对标签进行 URL 百分号编码(如上例中需要对 URL 参数编码)。使用 ‘%(my-function)’ 可将标签传入自定义 Lisp 函数,并以返回字符串作为替换结果。
如果替换文本不包含任何占位符,则直接拼接在链接词后生成完整链接。
除了字符串,你也可以指定一个 Lisp 函数来生成链接,该函数以标签作为唯一参数。
使用以上配置后,你可以用 ‘[[bugzilla:129]]’ 链接到特定缺陷单,用 ‘[[duckduckgo:OrgMode]]’ 搜索 OrgMode,用 ‘[[omap:31 Milk Street, Boston]]’ 显示自由软件基金会所在地地图,用 ‘[[omap:Science Park 904, Amsterdam, The Netherlands]]’ 定位 Carsten 的办公室,还可以用 ‘[[ads:Dominik,C]]’ 查询 Org 作者除 Emacs 开发外的学术成果。
如果只需要在单个 Org 缓冲区中使用专用缩写,可以在文件内定义:
With the above setting, you could link to a specific bug with ‘[[bugzilla:129]]’, search the web for ‘OrgMode’ with ‘[[duckduckgo:OrgMode]]’, show the map location of the Free Software Foundation ‘[[omap:31 Milk Street, Boston]]’ or of Carsten’s office ‘[[omap:Science Park 904, Amsterdam, The Netherlands]]’ and find out what the Org author is doing besides Emacs hacking with ‘[[ads:Dominik,C]]’.
#+LINK: bugzilla https://10.1.2.9/bugzilla/show_bug.cgi?id= #+LINK: duckduckgo https://duckduckgo.com/?q=%s #+LINK: "Nu Html Checker" https://validator.w3.org/nu/?doc=%h
包含空格的缩写必须用引号包裹。
缓冲区内部补全(见 Completion)可在输入 ‘[’ 后补全链接缩写。你还可以定义 Lisp 函数,为使用 C-c C-l 插入此类链接提供专用(如补全)支持。该函数不应接受任何参数,并返回带前缀的完整链接。设置链接补全函数的示例如下:
(org-link-set-parameter "type" :complete #'some-completion-function)
文件链接可以包含附加信息,使 Emacs 在打开链接时跳转到文件内的特定位置。该信息可以是行号,也可以是双冒号后的搜索选项36。例如,当 org-store-link 为某个文件创建链接时(见 Handling Links),会将当前行内容编码为搜索字符串,以便后续使用 C-c C-o 打开链接时找回该行。
注意,所有搜索选项对附件链接和 ID 链接的作用方式与文件链接完全一致。
以下为文件链接附加搜索内容的不同语法及说明:
[[file:~/code/main.c::255]] [[file:~/xx.org::My Target]] [[file:~/xx.org::*My Target]] [[file:~/xx.org::#my-custom-id]] [[file:~/xx.org::/regexp/]] [[attachment:main.c::255]]
跳转到第 255 行。
搜索链接目标 ‘<<My Target>>=,或对文本 =my target’ 进行搜索,规则与内部链接类似,见 Internal Links。在 HTML 导出中(见 HTML Export),此类文件链接会变为指向目标文件中对应命名锚点的 HTML 引用。
在 Org 文件中,仅在标题范围内搜索。
链接到带有 ‘CUSTOM_ID’ 属性的标题。
对 REGEXP 执行正则表达式搜索(见 Regular Expressions)。该功能使用 Emacs 命令 occur 在独立窗口列出所有匹配项。如果目标文件为 Org 模式,则使用 org-occur 创建包含匹配项的稀疏树。
作为一种特殊用法,文件名为空的文件链接可用于搜索当前文件。例如 ‘[[file:::find me]]’ 会在当前文件中搜索 ‘find me=,效果与 =[[find me]]’ 相同。
创建搜索字符串并执行文件链接相关搜索的默认机制并非在所有场景下都有效。例如 BibTeX 数据库文件中有许多形如 year="1993" 的条目,这类内容无法生成良好的搜索串,因为 BibTeX 条目的唯一标识是引用键。
遇到此类问题时,你可以编写自定义函数,为特定文件类型设置合适的搜索字符串,并在文件中执行对应搜索。通过 add-hook ,这些函数需要添加到钩子变量 org-create-file-search-functions 和 org-execute-file-search-functions 中。更多信息参见这些变量的文档字符串。Org 本身已对 BibTeX 数据库文件使用了该机制,你可以参考对应代码作为实现示例,详见文件 ‘ol-bibtex.el’ 。
Org mode 并不会将待办列表作为独立文档维护37。相反,待办事项是笔记文件的有机组成部分,因为待办事项通常是在记笔记的过程中产生的!使用 Org mode,只需将树形结构中的任意条目标记为待办事项即可。这样一来,信息不会重复,待办事项产生时的完整上下文也始终保留。
当然,这种管理待办事项的方式会将它们分散在整个笔记文件中。Org mode 为此提供了多种方法,让你可以概览所有需要完成的事务。
任何标题以 ‘TODO’ 开头时,都会成为待办事项,例如:
*** TODO Write letter to Sam Fortune
用于操作 待办条目(TODO entries) 的最重要命令如下:
org-todo) ¶在以下状态间循环切换当前条目的待办状态:
,-> (unmarked) -> TODO -> DONE --. '--------------------------------'
如果待办关键字设有快速访问键(参见 Fast access to TODO states),则通过快速选择界面提示选择待办关键字;当 org-use-fast-todo-selection 为非 nil 时,这是默认行为。
同样的状态切换也可以在议程框架中通过 t 命令键 “远程(remotely)” 完成(参见 Commands in the Agenda Buffer)。
选择下一个/上一个待办状态,效果类似循环切换。
主要在存在多于两种待办状态时使用(参见
Extended Use of TODO Keywords)。关于与 Shift 选择功能的冲突说明,
另见 Packages that conflict with Org mode。
同时可参考变量 org-treat-S-cursor-todo-selection-as-state-change 。
org-show-todo-tree) ¶在 稀疏树(sparse tree) 中查看待办事项(参见 Sparse Trees)。折叠整个缓冲区,
但显示所有待办事项——非 DONE 状态——及其上方的标题层级。
携带前缀参数,或使用 C-c / T,可搜索特定待办事项。
系统会提示输入关键字,你也可以输入形如 ‘KWD1|KWD2|...’ 的关键字列表,
以列出匹配任一关键字的条目。携带数字前缀参数 N 时,显示变量 org-todo-keywords
中第 N 个关键字对应的树形结构。携带两个前缀参数时,查找所有待办状态,包括未完成和已完成。
org-todo-list) ¶显示全局待办列表。从所有议程文件中收集待办事项(非 DONE 状态) (参见 Agenda Views)并整合到单一框架中。 新框架处于 Org 议程模式,可在其中执行命令查看和操作待办条目 (参见 Commands in the Agenda Buffer)。 更多信息参见 The global TODO list。
org-insert-todo-heading) ¶在当前条目下方插入新的待办条目。
修改待办状态时也可触发标签变更。详情参见选项 org-todo-state-tags-triggers 的文档字符串。
默认情况下,标记的待办条目仅有两种状态:TODO 和 DONE。
Org mode 允许你通过 待办关键字(TODO keywords) (存储于 org-todo-keywords )
以更复杂的方式分类待办事项。通过特殊配置,待办关键字系统可在不同文件中表现不同。
注意, 标签(tags) 是另一种通用的标题分类方式,尤其适用于待办事项(参见 Tags)。
你可以使用待办关键字表示处理事项过程中不同的、可能 连续(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-RIGHT 和 S-LEFT 在状态间前后切换。 若定义了大量关键字,可使用缓冲区内补全(参见 Completion) 或专用单键选择方案(参见 Fast access to TODO states)将这些词插入缓冲区。 修改待办状态可附带时间戳记录;更多信息参见 Tracking TODO state changes。
第二种用法是使用待办关键字表示不同 类型(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。
有时你可能希望并行使用多组待办关键字。 例如,你可能需要基础的 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 会从 ‘TODO’ 或 ‘DONE’ 跳至 ‘REPORT’ , 并从第二行任意单词跳至 ‘CANCELED’ 。 注意 C-S- 按键绑定与 Shift 选择功能存在冲突(参见 Packages that conflict with Org mode)。
S-LEFT 和 S-RIGHT 会遍历所有子序列中的 全部 关键字, 例如在上例中 S-RIGHT 会从 ‘DONE’ 切换至 ‘REPORT’ 。 关于与 Shift 选择功能的冲突说明,参见 Packages that conflict with Org mode。
若你希望快速将条目切换至任意待办状态,而非循环遍历, 可为各状态设置单键访问方式。 只需在每个关键字后用括号添加选择字符即可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 可移除条目的所有待办关键字。
在不同文件中使用待办机制的不同特性会非常实用。 对于文件本地配置,需在文件中添加特殊行, 仅为该文件设置关键字及解析方式。 例如,设置上述任一示例,需在文件任意位置的行首添加以下某一行:
#+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。
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 决定该颜色被解析为前景色还是背景色。
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:
org-toggle-ordered-property) ¶切换当前条目的 ‘ORDERED’ 属性。
该行为使用属性实现,因为此设置应仅作用于当前条目,
而非像标签一样从上层条目继承(参见 Tags)。
不过,若你希望通过标签 跟踪(track) 该属性值以提升可见性,
可自定义变量 org-track-ordered-property-with-tag 。
强制修改待办状态,忽略所有状态阻塞规则。
若设置变量 org-agenda-dim-blocked-tasks ,
因存在未标记子项而无法标记为完成的待办条目,
会以淡化字体显示,甚至在议程视图中完全隐藏(参见 Agenda Views)。
你也可以通过复选框阻塞待办状态的修改(参见 Checkboxes)。
若设置变量 org-enforce-todo-checkbox-dependencies ,
存在未勾选复选框的条目将无法切换至 DONE 状态。
若需要更复杂的依赖结构,例如不同树形结构或文件中条目间的依赖, 可查阅 ‘org-contrib’ 仓库中的 ‘org-depend.el’ 模块。
若要在修改待办状态时记录时间戳与备注,可携带前缀参数调用命令 org-todo 。
org-todo) ¶提示输入备注,并记录待办状态的变更时间。 备注会作为列表项插入到标题下方,也可放入抽屉中,参见 Tracking TODO state changes。
如果你希望更系统化地记录,Org mode 可以在将待办事项标记为完成时, 甚至每次修改待办状态时,自动记录时间戳并可选添加备注。 该系统高度可配置,可按关键字单独设置,也可限定在单个文件甚至子树中生效。 关于为任务记录工作时长的方法,参见 Clocking Work Time。
最基础的自动记录功能是跟踪某个待办事项 何时(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’ 标题形式存储在条目下方。
你可能希望自动记录状态变更时间,并可为此变更添加备注。
可以只记录时间戳,也可记录带时间戳的备注。
这些记录会以列表形式插入标题下方,最新记录排在最前44。
当备注数量较多时,你可能希望将其收纳到抽屉中以避免干扰(参见 Drawers)。
自定义变量 org-log-into-drawer 即可启用该行为—推荐使用的抽屉名为 ‘LOGBOOK’45。
你也可以通过设置 ‘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:
Org 可以跟踪一类特殊待办事项 “习惯(habits)” 的执行连贯性。
要使用习惯功能,需通过自定义变量 org-modules 启用 habit 模块。
一个习惯事项具备以下属性:
为让你直观了解上述规则的实际效果, 以下是一个带有历史记录的真实习惯示例:
** 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 恢复显示。 习惯同样支持标签过滤,例如你有仅在特定场景下执行的习惯时。
如果你大量使用 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-highest 、 org-priority-lowest
和 org-priority-default 设为整数,且均为 0 到 64 之间的非负整数。
优先级可附加到任意标题,不必是待办事项。
org-priority) ¶设置当前标题的优先级。命令会提示输入优先级字符 ‘A’ 、 ‘B’ 或 ‘C’ 。 若按下 SPC,则移除标题中的优先级标记(如有)。 也可在议程框架中通过 , 命令 “远程(remotely)” 修改优先级(参见 Commands in the Agenda Buffer)。
org-priority-up) ¶org-priority-down)提升/降低当前标题的优先级47。 注意这些按键也用于修改时间戳(参见 Creating Timestamps)。 关于与 Shift 选择功能的冲突说明,参见 Packages that conflict with Org mode。
你可以通过设置变量 org-priority-highest 、 org-priority-lowest
和 org-priority-default 修改允许的优先级范围。
合法的优先级值为单个大写拉丁字母 A-Z,以及 0 到 64 之间的非负整数。
对于单个缓冲区,可按如下方式设置这些值(最高、最低、默认)
(请确保最高优先级在字母顺序上早于最低优先级):
#+PRIORITIES: A C B
或使用数字:
#+PRIORITIES: 1 10 5
通常建议将大型任务拆分为更小、可管理的子任务。 你可以在待办事项下方创建大纲树,在树上设置详细子任务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。
普通列表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’ 属性,复选框必须按顺序勾选, 若尝试在上方存在未勾选框时勾选下方框,会抛出错误。
复选框有三种状态:
复选框按层级工作,若一个复选框项包含子复选框, 切换任一子复选框会使父复选框反映子项的全部、部分或未勾选状态。
若所有子复选框均未勾选,父复选框也未勾选:
- [ ] call people - [ ] Peter - [ ] Sarah
若部分子复选框已勾选,父复选框为部分勾选:
- [-] call people - [X] Peter - [ ] Sarah
若所有子复选框均已勾选,父复选框也已勾选:
- [X] call people - [X] Peter - [X] Sarah
以下命令用于操作复选框:
org-toggle-checkbox) ¶切换光标处复选框状态;若携带前缀参数,则切换复选框是否存在。 携带单个前缀参数时,添加空复选框或移除当前复选框51。 携带双前缀参数时,设为 ‘[-]’ ,即中间状态。
org-toggle-checkbox) ¶切换光标处复选框状态;若携带前缀参数,则切换复选框是否存在。 携带双前缀参数时,设为 ‘[-]’ 中间状态。
org-toggle-radio-button) ¶将光标所在项的复选框作为单选按钮切换: 当该复选框勾选时,同一层级的其他所有复选框会自动取消勾选。 携带通用前缀参数时,切换复选框是否存在。 携带双前缀参数时,设为 ‘[-]’ 。
通过在列表前设置 ‘#+ATTR_ORG: :radio t’ ,或调用 M-x org-list-checkbox-radio-mode 启用该次要模式, 可使 C-c C-c 将复选框视为单选按钮。
org-insert-todo-heading) ¶插入带复选框的新项。仅当光标已在普通列表项中时生效(参见 Plain Lists)。
org-toggle-ordered-property) ¶切换条目的 ‘ORDERED’ 属性,控制复选框是否必须按顺序勾选。
该行为使用属性实现,因为此设置应仅作用于当前条目,而非像标签一样继承。
若希望通过标签 跟踪(track) 该属性值以提升可见性,可自定义 org-track-ordered-property-with-tag 。
org-update-statistics-cookies) ¶更新当前大纲条目的统计标记。 携带 C-u 前缀调用时,更新整个文件。 使用 C-c C-c 切换复选框或用 M-S-RET 新建复选框时, 复选框统计标记会自动更新。 修改待办状态时,待办统计标记会更新。 若手动删除/添加框或条目,可使用该命令同步统计数据。
为信息交叉关联设置标识与上下文,一种极佳的方式是为标题指定 /标签(tags)/。Org 模式对标签提供了全面的支持。
每个标题均可包含一组标签,标签位于标题末尾。标签由普通字符构成,可包含字母、数字、 ‘_’ 、
‘@’ 、 ‘#’ 与 ‘%’ 。标签前后必须各有一个冒号,例如 ‘:work:’ 。可同时指定多个标签,如
‘:work:urgent:’ 。默认情况下,标签以粗体显示,颜色与标题一致。你可以通过变量
org-tag-faces 为特定标签指定专用的文本的视觉样式,用法与 TODO 关键字类似(参见 Faces for TODO keywords)。
标签(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-inheritance 与 org-tags-exclude-from-inheritance 。
标签继承在日程搜索匹配标签时生效,适用于 tags 或 tags-todo 类型的日程视图。
在其他日程类型中, org-use-tag-inheritance 不产生作用。不过你可能仍希望
日程中标签能正确显示,以确保基于继承标签的筛选正常工作。可通过设置
org-agenda-use-tag-inheritance 进行控制:默认值对所有日程类型生效,
将其设为 nil 可显著加快日程生成速度。
标签可直接在缓冲区标题末尾输入。输入冒号后,M-TAB 可触发标签补全。 同时也提供专用命令用于插入标签:
org-set-tags-command) ¶为当前标题设置新标签。Org 模式会提供补全或专用单键操作界面来设置标签,详见下文。
按下 RET 后,标签会插入并对齐到 org-tags-column 列。
若带 C-u 前缀调用,会将当前缓冲区所有标签对齐到该列,仅用于美化排版。
标题升降级、TODO 状态变更后,标签会自动重新对齐(参见 Basic TODO Functionality)。
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。
按下标签对应按键可在当前行标签列表中添加或移除该标签。在互斥组中选中一个标签, 会自动取消组内其他标签的选中状态。
在该界面中,还可使用以下特殊按键:
在小缓冲区中输入标签,即便该标签不在预定义列表中。可补全缓冲区中所有标签
以及全局通过 org-tag-alist 与 org-tag-persistent-alist 预定义的标签。
也可同时添加多个标签,使用逗号分隔即可。
清除当前行所有标签。
确认修改后的标签集合。
放弃修改并退出。
若 q 未分配给标签,作用与 C-g 相同,即放弃退出。
临时关闭互斥标签组限制。可用于(作为例外)为同一组分配多个标签。
切换下次修改后自动退出(见下文)。若使用专家模式,首次按下 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 限制,
避免可用按键耗尽。你可自定义该变量。
标签可定义为层级结构。一个标签可作为一组其他标签的 /分组标签(group tag)/, 分组标签可视为其下属标签的“上位概念”。定义多个分组标签并嵌套,即可形成标签层级。
典型用途是构建术语(标签)分类体系,用于对文档或文档集中的节点进行分类。
搜索分组标签时,会返回该组及其子组内所有成员标签的匹配结果。在日程视图中, 按分组标签筛选会显示或隐藏带有该组任一成员或子组成员标签的标题。 这让标签搜索与筛选更加灵活。
可使用方括号设置分组标签,在分组标签与其关联标签间插入冒号—注意所有空格均为必需, 以确保 Org 能正确解析该行:
#+TAGS: [ GTD : Control Persp ]
本例中 ‘GTD’ 为分组标签,关联 ‘Control’ 、 ‘Persp’ 两个标签。 将 ‘Control’ 与 ‘Persp’ 继续设为分组标签,可形成完整标签层级:
#+TAGS: [ Control : Context Task ] #+TAGS: [ Persp : Vision Goal AOF Project ]
从概念上可视为如下标签层级:
直接设置 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 。
标签体系建立后,可用于将相关信息汇总为专用列表。
org-match-sparse-tree) ¶生成符合标签搜索条件的所有标题构成的稀疏树。 带 C-u 前缀调用时,忽略非 TODO 行的标题。
org-tags-view) ¶从所有日程文件中生成全局标签匹配列表。参见 Matching tags and properties。
org-tags-view) ¶从所有日程文件中生成全局标签匹配列表,但仅检查 TODO 条目。
这些命令均会提示输入匹配字符串,支持基础布尔逻辑, 例如 ‘+boss+urgent-project1’ 表示查找带有 ‘boss’ 与 ‘urgent’ 标签、 但不含 ‘project1’ 标签的条目; ‘Kathy|Sally’ 表示查找带有 ‘Kathy’ 或 ‘Sally’ 任一标签的条目。 搜索字符串语法丰富,还可匹配 TODO 关键字、条目层级与属性。 完整语法说明与大量示例参见 Matching tags and properties。
属性是与条目关联的键值对。可以设置属性,使其仅关联单个条目、关联某个树形结构下的所有条目,或关联整个缓冲区。
Org 模式中属性主要有两大用途。第一,属性类似标签,但带有对应取值。设想你维护一个文件,用于记录软件缺陷并规划版本发布。你可以使用名为 ‘Release’ 的属性,在不同子树中设置 ‘1.0=、=2.0’ 等不同取值,而非使用 ‘release_1’ 、 ‘release_2’ 这类标签。第二,你可以借助属性在 Org 缓冲区中实现(非常基础的)数据库功能。例如管理音乐 CD 信息,属性可以是专辑名、艺术家、发行日期、曲目数量等。
属性可在列视图中方便地编辑与查看(参见 Column View)。
属性为键值对。当属性关联单个条目或某个树形结构时,需要插入到名为 ‘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 文件中的全部条目继承。
以下命令可用于操作属性:
pcomplete) ¶在行首输入冒号后,补全属性键名。会列出当前文件中使用过的所有键名作为候选项。
org-set-property) ¶设置属性。会提示输入属性名与取值,必要时自动创建属性收纳块。
在当前条目插入属性收纳块。收纳块会插入在条目靠前位置,位于截止日期等规划信息行之后。若在首个标题前使用,则插入在缓冲区顶部注释之后。
org-property-action) ¶光标位于属性收纳块内时,执行属性相关命令。
org-set-property) ¶为当前条目设置属性,属性名与取值均可通过补全输入。
org-property-next-allowed-value), S-LEFT (org-property-previous-allowed-value) ¶将光标所在属性切换为下一个/上一个允许取值。
org-delete-property) ¶从当前条目中移除指定属性。
org-delete-property-globally) ¶从当前文件所有条目中全局移除指定属性。
org-compute-property-at-point) ¶依据最近的列格式定义中的运算符与作用范围,计算光标处属性的取值。
特殊属性提供了访问 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 关键字。 |
基于属性筛选生成稀疏树与专用列表,所用命令与标签搜索相同(参见 Tag Searches)。
org-match-sparse-tree) ¶生成包含所有匹配条目的稀疏树。携带 C-u 前缀调用时,忽略非 TODO 行的标题。
org-tags-view) ¶从所有日程文件中生成标签与属性匹配的全局列表。
org-tags-view) ¶从所有日程文件中生成全局标签匹配列表,但仅筛选 TODO 条目。
搜索字符串的语法详见 Matching tags and properties。
另有专用命令可基于单个属性生成稀疏树:
基于属性值生成稀疏树。先提示输入属性名,再提示输入取值,随后生成所有设置该属性为指定值的条目构成的稀疏树。若将取值放在大括号内,会按正则表达式匹配属性值(参见 Regular Expressions)。
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)。
在大纲树中查看和编辑属性的一种极佳方式是 列视图(column view) 。在列视图下,每个标题都会变为表格的一行,表格中的列用于访问条目的各类属性。Org 模式通过在每个条目标题上叠加表格结构来实现列视图。即便标题已被转为表格行,你仍然可以控制大纲树的可见性。例如,切换到 “内容(contents)” 视图可得到紧凑的表格—在列视图激活时按 S-TAB S-TAB 或直接按 c—同时你仍可以展开、查看和编辑每个标题下方的内容。此外,你也可以在执行稀疏树命令后再切换到列视图,这样就能只针对筛选出的条目生成表格。列视图同样适用于日程缓冲区(参见 Agenda Views),这类缓冲区通常已通过查询从多个文件中收集了指定条目。
使用列视图首先需要定义列,这通过设置列格式行来完成。
若要指定仅适用于某棵子树的格式,可在该子树的顶层节点添加 ‘COLUMNS’ 属性,示例如下:
** Top node for columns view :PROPERTIES: :COLUMNS: %25ITEM %TAGS %PRIORITY %TODO :END:
在首个标题之前的属性收纳块中定义 ‘COLUMNS’ 属性,将作用于整个文件。除了属性收纳块,也可通过如下关键字行为整个文件定义列格式:
#+COLUMNS: %25ITEM %TAGS %PRIORITY %TODO
如果某个条目包含 ‘COLUMNS’ 属性,它会为该条目及其下方整个子树定义列结构。由于列定义遵循文档的层级结构,你可以在一级标题定义通用列,适用于所有下级,再在更深层级定义更具体的列,用于编辑子树的细节内容。
列定义用于设置列的各项属性,通用格式如下:
%[WIDTH]PROPERTY[(TITLE)][{SUMMARY-TYPE}]
%[宽度]属性名[(列标题)][{汇总类型}]
除百分号与属性名外,其余部分均为可选。各部分含义如下:
整数,指定列的字符宽度。省略时宽度自动计算。
本列要编辑的属性。也支持表示元数据的特殊属性(参见 Special Properties)。
列表头文字。省略时使用属性名。
汇总类型。若指定,父标题的列值将由直接子节点计算得出。若父节点已有同名属性,该属性不会参与计算。
当父标题存在已有属性时,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:’ 记录,包括父标题内的记录。
在多层嵌套结构中计算汇总时,会从最深层级向上递归计算。示例如下:
#+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:
org-columns) ¶开启列视图。若光标位于文件首个标题之前,列视图将作用于整个文件并使用 ‘#+COLUMNS’ 定义。若光标位于大纲内部,命令会从当前位置向上查找层级中定义格式的 ‘COLUMNS’ 属性。找到后,以包含该属性的条目为根建立列视图表格。若未找到,则使用 ‘#+COLUMNS’ 行或变量 org-columns-default-format 中的格式,为当前条目及其子树建立列视图。
org-columns-redo) ¶重建列视图,同步缓冲区最近的修改。
org-columns-quit) ¶Exit column view.
在列视图中按字段移动光标。
直接选择第 N 个允许值,0 选择第 10 个值。
org-columns-next-allowed-value) 与 p 或 S-LEFT (org-columns-previous-allowed-value) ¶切换到当前字段的下一个/上一个允许值。使用前提是该属性已设置允许取值列表。
org-columns-edit-value) ¶编辑光标处属性。对于特殊属性,会调用常规修改界面;例如编辑 ‘TAGS’ 属性时会弹出标签补全或快速选择框架。
org-columns-toggle-or-columns-quit) ¶若光标在复选框上则切换状态,否则退出列视图。
org-columns-show-value) ¶查看属性完整值。适用于列宽小于值长度的情况。
org-columns-edit-allowed) ¶编辑当前属性的允许取值列表。若列表在层级中已定义,修改会保存在原处;否则新值存入当前列视图对应顶层条目。
org-columns-narrow) 与 > (org-columns-widen) ¶将当前列收窄/加宽一个字符。
org-columns-new) ¶在当前列左侧插入新列。
org-columns-delete) ¶删除当前列。
org-columns-move-left) ¶将当前列左移。
org-columns-move-right) ¶将当前列右移。
org-columns-move-row-up) ¶将当前行上移。
org-columns-move-row-down) ¶将当前行下移。
列视图只是缓冲区上的叠加层,无法直接导出或打印。若需要保存列视图内容,可使用 ‘columnview’ 动态块(参见 Dynamic Blocks)。该块结构如下:
* The column view #+BEGIN: columnview :hlines 1 :id "label" #+END:
该动态块支持以下参数:
最重要的参数。列视图通常作用于特定子树,而捕获块可能位于文件其他位置。要指定捕获哪个子树的视图,可使用四种取值:
使用捕获块所在的子树。
全局视图,包含文件所有标题。
在指定 FILENAME 顶层启用列视图。
在 ‘ID’ 属性为该标签 LABEL 的子树中启用列视图。可使用 M-x org-id-copy 为当前条目生成全局唯一 ID 并复制到剪贴板。
设置为字符串时,作为标签/属性匹配过滤器,仅筛选 :id 指定范围内的部分标题。
为 t 时每行后插入横线;为数字 N 时,在层级 <= N 的标题前插入横线。
非 nil 时强制显示列组竖线。
设置为数字时,不捕获该层级以下的条目。
非 nil 时,跳过仅 ‘ITEM’ 字段有内容的空行。
要排除的标签列表,带这些标签的条目不会出现在列视图表格中。
非 nil 时, ‘ITEM’ 字段按层级缩进。
非 nil 时,表格中的 ‘ITEM’ 标题会链接到原位置。
为动态块指定列属性(参见 Column attributes)。
用于格式化列视图数据并插入缓冲区的函数,参见选项 org-columns-dblock-formatter 。
以下命令用于插入或更新动态块:
org-columns-insert-dblock ¶插入捕获列视图的动态块,提示选择视图范围或 ID。
该命令可通过 org-dynamic-block-insert-dblock (C-c C-x x) 并选择 “columnview” 调用(参见 Dynamic Blocks)。
org-dblock-update) ¶更新光标处动态块,光标需位于 ‘#+BEGIN’ 行。
org-update-all-dblocks) ¶更新所有动态块(参见 Dynamic Blocks)。适用于缓冲区中有时程表、列视图捕获块等多个动态块的场景。
你可以为列视图表格添加公式,也可在表格前添加绘图指令,这些内容在块更新后会保留。若表格后有 ‘TBLFM’ 关键字,更新后会自动重算表格。
另一种捕获并处理属性值的方式由 Eric Schulte 的 ‘org-collector.el’ 提供,该包属于 ‘org-contrib’59。它提供通用 API 收集指定范围内条目的属性,并支持任意 Lisp 表达式处理数值后再插入表格或动态块。
为辅助项目规划,TODO 条目可以标注日期 和/或时间。在 Org mode 中,携带日期与 时间信息的特殊格式字符串称为 时间戳(timestamp) 。 这个叫法可能有点容易混淆,因为时间戳通常 用于表示某物的创建或最后修改时间。 但在 Org mode 中,该术语的含义要宽泛得多。
时间戳可用于安排约会、排定任务、设置截止日期、 记录工时等。后续章节将介绍 Org mode 提供的 时间戳格式与相关工具,用于处理时间和时间区间的常见场景。
时间戳是以特定格式表示的日期(可附带时间或时间区间), 形如 ‘<2003-09-16 Tue>’ 、 ‘<2003-09-16 Tue 09:39>’ 或 ‘<2003-09-16 Tue 12:00-12:30>’60。 时间戳可以出现在 Org 树形条目的标题或正文中的任意位置。 它会让对应条目显示在日程表中的指定日期(见 Weekly/daily agenda)。 主要分为以下几类:
普通时间戳仅为条目分配一个日期/时间, 就像在纸质日程本上记下约会或事件一样。 在日程视图中,带有普通时间戳的条目标题 会精确显示在对应日期上。一个条目可以包含多个时间戳。
* 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>
时间戳可以包含 重复周期(repeater interval) ,表示它不仅适用于指定日期, 还会在每隔 N 小时(h)、天(d)、周(w)、月(m) 或年(y)后重复出现。下例每周三都会在日程表中显示:
* Pick up Sam at school <2007-05-16 Wed 12:30 +1w>
对于更复杂的日期规则,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>
由 ‘--’ 连接的两个时间戳表示一个时间段。 在日程表中,条目标题会显示在区间的第一天、最后一天, 以及区间内所有被展示的日期上。第一个示例只指定日期区间, 第二个示例则为每一天指定了时间区间。
** 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>
格式与普通时间戳类似,但使用方括号而非尖括号。 这类时间戳为 非活动 状态, 不会 让条目显示在日程表中。
* Gillian comes late for the fifth time [2006-11-01 Wed]
要让 Org mode 识别时间戳,必须使用指定格式。 下面列出的所有命令都会生成符合规范的时间戳。
org-timestamp) ¶提示输入日期并插入对应时间戳。 若光标位于缓冲区中已有的时间戳上, 该命令会修改此时间戳而非新建。 连续使用两次该命令会插入一个时间区间。
带前缀参数调用时,使用包含日期和时间的备选格式。
默认时间可舍入为 5 分钟的倍数,
可查看选项 org-time-stamp-rounding-minutes 。
带两个前缀参数时,直接插入当前时间的活动时间戳,不进行提示。
org-timestamp-inactive) ¶功能与 C-c . 类似,但插入非活动时间戳, 不会生成日程条目。
规范化时间戳,补充或修正缺失/错误的星期名称。
org-date-from-calendar) ¶插入与日历中光标所在日期对应的时间戳。
org-goto-calendar) ¶打开 Emacs 日历并定位到当前日期。 若当前行存在时间戳,则跳转到对应日期。
org-open-at-point) ¶打开光标所在时间戳或时间区间对应日期的日程表(见 Weekly/daily agenda)。
org-timestamp-down-day), S-RIGHT (org-timestamp-up-day) ¶将光标所在日期调整一天。 该快捷键与选区切换等模式冲突(见 Packages that conflict with Org mode)。
org-timestamp-up), S-DOWN (org-timestamp-down) ¶若光标在时间戳开头或括号处,可切换时间戳类型。 若在时间戳内部,可调整光标所在项(年、月、日、时、分)。 当时间戳包含形如 ‘15:30-16:30’ 的时间区间时, 修改第一个时间会同步偏移第二个,保持时长不变; 若要修改时长,需调整第二个时间。 注意:若光标在标题中而非时间戳上, 这些按键会调整条目优先级(见 Priorities)。 该快捷键同样与选区切换等模式冲突(见 Packages that conflict with Org mode)。
org-evaluate-time-range) ¶计算时间区间的起止差值。带前缀参数时, 将结果插入时间区间后方(表格中则插入下一列)。
当 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 |
| ‘14’ | ⇒ 2006-06-14 |
| ‘12’ | ⇒ 2006-07-12 |
| ‘2/5’ | ⇒ 2007-02-05 |
| ‘Fri’ | ⇒ 最近的星期五(默认日期或之后) |
| ‘sep 15’ | ⇒ 2006-09-15 |
| ‘feb 15’ | ⇒ 2007-02-15 |
| ‘sep 12 9’ | ⇒ 2009-09-12 |
| ‘12:45’ | ⇒ 2006-06-13 12:45 |
| ‘22 sept 0:34’ | ⇒ 2006-09-22 0:34 |
| ‘w4’ | ⇒ 2006 年的 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-months 和 parse-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。
Org mode 使用 ISO 8601 标准的日期时间格式。
若不习惯该格式并希望使用其他显示方式,
可自定义变量 org-display-custom-times
和 org-timestamp-custom-formats 。
org-toggle-timestamp-overlays) ¶切换日期时间自定义格式的显示状态。
Org mode 需要默认格式用于解析, 因此自定义日期/时间格式不会 替换(replace) 默认格式, 而是通过文本属性覆盖在默认格式之上。这会带来以下影响:
时间戳前可添加特殊关键字以方便规划。 关键字与时间戳必须紧跟在对应任务后方。
含义:该任务(通常为 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 ,该提醒会被禁用。
含义:计划在指定日期开始处理该任务。
条目标题会列在指定日期下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-days
和 org-agenda-skip-scheduled-delay-if-deadline 。
Important: 在 Org 模式中对条目进行排期(scheduling), 不应 理解为我们平常所说的 安排会议(scheduling a meeting) 。为会议设定日期只是一个简单的预约,你应该用普通时间戳标记该条目,让它显示在对应的日期上。这是 Org 用户经常产生的一个误解。在 Org 模式中, 排期(scheduling) 指的是设定你打算开始处理某个行动项的日期。
排期与截止日期条目中可使用带重复规则的时间戳。 Org mode 会基于时间戳为 最近一次重复 的假设 发出提前与逾期提醒。但类似如下的日记表达式条目:
<%%(diary-float t 42)>
在排期与截止时间戳中的使用有限制。 Org mode 无法解析函数内部逻辑以发出提醒, 但会在表达式匹配的每一天显示该条目。
以下命令可快速插入截止日期或排期条目67:
org-deadline) ¶插入 ‘DEADLINE’ 关键字及时间戳,
插入位置紧跟在标题行下方,
并移除任何 ‘CLOSED’ 时间戳。
带前缀参数调用时,同时移除条目已有截止日期。
根据变量 org-log-redeadline 的设置,
修改已有截止日期时会记录日志68。
org-schedule) ¶插入 ‘SCHEDULED’ 关键字及时间戳,
插入位置紧跟在标题行下方,
并移除任何 ‘CLOSED’ 时间戳。
带前缀参数调用时,同时移除条目已有排期日期。
根据变量 org-log-reschedule 的设置,
修改已有排期时间时会记录日志69。
org-check-deadlines) ¶生成稀疏树,展示所有已逾期
或在 org-deadline-warning-days 内即将到期的截止日期。
带 C-u 前缀时显示文件中所有截止日期;
带数字前缀时检查对应天数,
如 C-1 C-c / d 显示所有明日到期的截止日期。
org-check-before-date) ¶生成稀疏树,展示指定日期前的截止日期与排期条目。
org-check-after-date) ¶生成稀疏树,展示指定日期后的截止日期与排期条目。
注意 org-schedule 和 org-deadline 支持相对时间设置日期,
例如 ‘+1d’ 设为次日, ‘--1w’ 设为当前时间戳前一周。
部分任务需要反复执行。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。
Org mode 允许你为项目中特定任务记录花费的时间。 开始处理某项内容时可以启动计时,停止处理该任务或将任务标记为完成时, 计时会停止并记录对应的时间区间。 它还会计算项目中每个子树73上花费的总时间,并保存最近计时任务的历史记录, 方便你在多个占用时间的任务之间快速切换。
要在 Emacs 会话之间保存计时历史,可使用:
(setq org-clock-persist 'history) (org-clock-persistence-insinuate)
重启 Emacs 后开始新任务计时时,未完成的计时74会被恢复(参见 Resolving idle time (1)),并提示你如何处理。
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 点击模式行中的计时项,会弹出包含计时相关选项的菜单。
org-clock-out) ¶停止计时(结束计时)。会在上次计时启动的相同位置插入另一个时间戳,
并直接计算耗时,以 ‘=>HH:MM’ 格式插入在时间区间后。
参见变量 org-log-note-clock-out ,可在结束计时的时间戳旁额外记录备注78。
org-clock-in-last) ¶为上一个计时任务重新计时。携带一层 C-u 前缀时,从计时历史中选择任务。 携带两层 C-u 前缀时,以上次计时结束时间为起点强制连续计时。
org-clock-modify-effort-estimate) ¶更新当前正在计时任务的预估耗时。
org-evaluate-time-range) ¶修改某个时间戳后重新计算时间区间。仅当你直接编辑时间戳时才需要此操作; 若通过 S-<cursor> 按键修改,更新会自动完成。
org-clock-timestamps-up), C-S-DOWN (org-clock-timestamps-down) ¶在 ‘CLOCK’ 日志行上,同时增大/减小两个时间戳,保持计时时长不变。
org-timestamp-up), S-M-DOWN (org-timestamp-down) ¶在 ‘CLOCK’ 日志行上,将光标处时间戳与上一条或下一条计时时间戳同步增减相同时长。 例如,按下 S-M-UP 将结束计时时间戳增加五分钟,下一条计时的开始时间戳也会同步增加五分钟。
调整前后时间戳时,仅考虑当前 Emacs 会话中创建的 ‘CLOCK’ 日志。
org-todo) ¶将条目的 TODO 状态改为 DONE 时,若该条目正在计时,会自动停止。
org-clock-cancel) ¶取消当前计时。适用于误启动计时或最终处理了其他任务的场景。
org-clock-goto) ¶跳转到当前正在计时任务的标题。携带 C-u 前缀时,从最近计时任务列表中选择目标任务。
org-clock-display) ¶在当前缓冲区显示每个子树的时间汇总。会在每个标题末尾添加覆盖层,
显示该标题下记录的总时间(包含所有子标题时间)。
你可以使用可见性循环查看结构,但修改缓冲区(参见变量 org-remove-highlights-with-change )
或按下 C-c C-c 后覆盖层会消失。
在日程表中(参见 Weekly/daily agenda)可使用 l 键, 查看当日处理或完成的任务。
重要: 注意 org-clock-out 和 org-clock-in-last 均可设置全局按键绑定,且不会改变窗口布局。
Org mode 可基于计时信息生成相当复杂的报表,这类报表称为 计时表(clock table) , 会以一个或多个 Org 表格的形式呈现。
org-clock-report ¶插入或更新计时表。携带前缀参数调用时,跳转到当前文档第一个计时表并更新。 计时表包含已归档的子树。
该命令可通过调用 org-dynamic-block-insert-dblock (C-c C-x x)
并选择 “clocktable” 触发(参见 Dynamic Blocks)。
org-dblock-update) ¶更新光标处的动态块。光标需位于动态块的 ‘BEGIN’ 行。
更新所有动态块(参见 Dynamic Blocks)。适用于缓冲区中包含多个计时表块的场景。
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 中配置。
首先是用于筛选计时条目的选项:
表格中时间明细展示的最大层级深度,更深层级的计时会汇总到上层。
统计范围,可设置为以下任意值:
| ‘nil’ | 当前缓冲区或缩小后的区域 |
| ‘file’ | 整个当前缓冲区 |
| ‘subtree’ | 计时表所在的子树 |
| ‘treeN’ | 所在的 N 级树,例如 ‘tree3’ |
| ‘tree’ | 所在的 1 级树 |
| ‘agenda’ | 所有日程文件 |
| ‘("file" ...)’ | 扫描指定文件 |
| ‘FUNCTION’ | 调用无参函数 FUNCTION 返回的文件 |
| ‘file-with-archives’ | 当前文件及其归档文件 |
| ‘agenda-with-archives’ | 所有日程文件(包含归档文件) |
要统计的时间块,可使用绝对时间或相对当前时间,支持格式:
| ‘2007-12-31’ | 2007 年除夕夜 |
| ‘2007-12’ | 2007 年 12 月 |
| ‘2007-W50’ | 2007 年第 50 周 |
| ‘2007-Q2’ | 2007 年第二季度 |
| ‘2007’ | 2007 全年 |
| ‘today’, ‘yesterday’, ‘today-N’ | 相对日期 |
| ‘thisweek’, ‘lastweek’, ‘thisweek-N’ | 相对周 |
| ‘thismonth’, ‘lastmonth’, ‘thismonth-N’ | 相对月 |
| ‘thisyear’, ‘lastyear’, ‘thisyear-N’ | 相对年 |
| ‘untilnow’79 | 所有历史计时时间 |
未设置该选项时,Org 会使用 org-clock-display-default-range 的值,默认为当前年份。
使用 S-LEFT 或 S-RIGHT 可偏移时间区间。
统计起始时间字符串,支持 ‘\"<-2w>\"’ 这类相对时间, 相对时间语法参见 Matching tags and properties。
统计结束时间字符串,支持 ‘\"<now>\"’ 这类相对时间, 相对时间语法参见 Matching tags and properties。
一周起始日期,默认 1 为周一。
一月起始日期,默认 1 为 1 号。
设置为 ‘day’ 、 ‘week’ 、 ‘semimonth’ 、 ‘month’ 、 ‘quarter’ 或 ‘year’ ,将表格按时间段拆分。 使用该选项时,必须指定 ‘:block=,或同时指定 =:tstart’ 与 ‘:tend’ 。
非 nil 时,不显示耗时为零的时间段。
非 nil 时,不显示无有效数据的文件对应的表格区段。
用于筛选条目标签匹配表达式,匹配语法参见 Matching tags and properties。
接下来是控制表格格式的选项,这些选项由函数 org-clocktable-write-default 解析,
你也可以通过 ‘:formatter’ 参数指定自定义函数。
非 nil 时,突出显示一级和二级条目。
用于“任务”等描述单元格的语言80。
将表格中的条目标题链接到原文位置。
限制 Org 表格中标题列宽度的整数。若写作 ‘50!’ ,导出时标题也会被缩短。
根据层级缩进标题字段。
若文件设有 ‘#+title’ ,在文件列显示标题。
由多个文件生成表格时,隐藏文件列。
时间数据所用列数。若小于 ‘:maxlevel’ ,更低层级会合并为一列。
是否包含层级号列。
包含排序列与排序类型的序对。例如 ‘:sort (1 . ?a)’ 表示对第一列按字母序排序。
等价于 ‘:level nil :indent t :narrow 40! :tcolumns 1’ , 除非显式指定 ‘:narrow’ ,否则相关设置均会被覆盖。
条目的时间戳(若有),按顺序查找 ‘SCHEDULED’ 、 ‘DEADLINE’ 、 ‘TIMESTAMP’ 和 ‘TIMESTAMP_IA’ 特殊属性(参见 Special Properties)。
该标记非 nil 时,显示标题的标签。
要在表格中显示的属性列表,每个属性占用一列。
该标记非 nil 时, ‘:properties’ 的值会沿层级继承。
要添加并计算的 ‘TBLFM’ 关键字内容。特殊用法 ‘:formula %’ 会添加一列百分比耗时。 若此处未指定公式,计时表下方已有的公式会在更新时保留并计算。
用于格式化计时数据并插入到缓冲区的函数。
如需获取当前一级树当日的计时汇总,可写作:
#+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:
如果你为某个工作项启动了计时,之后离开电脑—比如去接一通电话—你通常需要 “处理(resolve)” 这段离开的时间:要么从当前计时中扣除,要么把这段时间计入另一个任务。
通过将变量 org-clock-idle-time 自定义为某个整数(例如 10 或 15),Emacs 可以在你闲置这么多分钟 82 后回到电脑时提醒你,并询问你要如何处理这段闲置时间。当你返回时会出现一个提示,显示已经闲置的时长并持续更新当前数值,同时提供一组选项来修正时间偏差:
保留部分或全部分钟并继续当前计时,按 k。 Org 会询问保留的分钟数,按 RET 保留全部(即不做修改), 或输入数字保留指定分钟。
按住 Shift 按 K,会保留指定分钟数并立即结束当前任务计时。 若保留全部分钟,效果等同于直接结束当前任务计时。
不保留任何分钟,按 s 从计时中扣除全部离开时间, 并从返回时刻重新开始计时。
不保留任何分钟,并直接在离开开始时刻结束计时,按住 Shift 按 S。 注意使用 Shift 时无论选择哪项,最终都会处于未计时状态。
直接取消整个计时,按 C。 注意若未取消而是扣除离开时间后,计时时长不足一分钟, 计时仍会被取消,避免日志中出现空条目。
如果从当前计时中扣除了离开时间,现在想将其计入新任务? 只需在扣除后立即为任意任务启动计时。Org 会检测到你有已扣除的“记账时间”, 并询问是否将这段时间计入下一个计时任务。
这种计时处理逻辑还会出现在另一种场景: 假设你正在计时编辑内容,突然意外断电导致所有缓冲区丢失, 但得益于自动保存,你仍保留了最近的 Org 修改(包括最后一次计时启动)。
重启 Emacs 并为任意任务计时后,Org 会检测到上一会话中存在未正常结束的悬空计时。 以上次计时开始时间作为未统计时段起点,Org 会询问如何处理这段时间。 逻辑与行为和处理闲置离开时间完全一致,只是触发原因是异常恢复而非固定闲置时长。
你也可以随时通过 M-x org-resolve-clocks RET(或 C-c C-x C-z) 检查 Org 日程涉及的所有文件中的悬空计时。
你可能希望以上一个任务的结束时间作为新任务的计时起点。
要系统性启用该功能,将 org-clock-continuously 设为非 nil 。
每次启动计时时,Org 会读取本次会话中上一条计时的结束时间,
并从该时刻开始新计时。
若仅偶尔需要该功能,可在使用 org-clock-in 时携带三层通用前缀参数,
或在使用 org-clock-in-last 时携带两层 C-u C-u 前缀。
如果你经常忘记在闲置前结束计时,且不想手动调整计时时间,
可以将 org-clock-auto-clockout-timer 设为秒数,
并在 ‘.emacs’ 文件中添加 ‘(org-clock-auto-clockout-insinuate)’ 。
当计时正在运行且 Emacs 闲置超过该秒数时,会自动结束计时。
使用 ‘M-x org-clock-toggle-auto-clockout RET’ 可临时开启或关闭该功能。
若你需要非常细致地规划工作,或需要在报价中注明预估工作量, 可以为条目设置预估耗时。如果你同时记录实际工作时间, 后续可对比计划耗时与实际耗时,这是优化预估准确性的有效方式。
预估耗时存储在特殊属性 ‘EFFORT’ 中,支持多种格式, 如 ‘3:12’ 、 ‘1:23:45’ 或 ‘1d3h5min’ ; 格式详情参见文件 ‘org-duration.el’ 。
你可以通过以下命令为条目设置预估耗时:
org-set-effort) ¶为当前条目设置预估耗时。携带前缀参数时,设为下一个允许值—见下文。 该命令在日程表中也可通过 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-properties 和 org-columns-default-format 进行全局设置。
尤其当你希望在日程表中也使用该配置时,全局设置更为推荐。
为单个条目分配预估耗时的方式是切换到列模式, 使用 S-RIGHT 和 S-LEFT 修改数值。 输入的值会立即在层级结构中汇总,相邻列会显示对应计时时间。
在日/周日程表中切换到列视图时,预估耗时列会汇总每日的计划工作量83,
你可以据此在日程中安排时间。
如需查看当日已占用时间的整体情况,可设置选项 org-agenda-columns-add-appointments-to-effort-sum ,
当日指定时间段的日程会被计入当日负载预估。
预估耗时可用于日程表二次过滤,在日程表中按 / 键触发(参见 Commands in the Agenda Buffer)。 若你统一设置了预估耗时,只需按两三次键,即可筛选出符合可用时间段的任务。
Org 提供两种计时器:一种是正向递增的相对计时器, 适用于会议、视频观看等场景下记录笔记;另一种是倒计时计时器。
相对计时器与倒计时计时器由不同命令启动。
org-timer-start) ¶启动或重置相对计时器。默认计时器从 0 开始。 携带 C-u 前缀调用时,提示输入起始偏移量。 提示框会默认使用光标处的计时器字符串(若有), 方便在过程中断后重新开始记录笔记。 携带双层前缀参数 C-u C-u 调用时, 按指定数值批量修改选中区域内所有计时器字符串, 可用于修正因计时器未准时启动导致的时间偏差。
org-timer-set-timer) ¶启动倒计时计时器,提示输入时长。
org-timer-default-timer 设置默认倒计时值。
携带数字前缀参数可覆盖该默认值。
该命令在日程缓冲区中可通过 ; 触发。
启动后,相对计时器与倒计时计时器由相同命令控制。
org-timer) ¶向缓冲区插入当前相对时间。首次使用时启动计时器, 携带前缀参数可重置计时器。
org-timer-item) ¶插入带当前相对时间的描述列表项。携带前缀参数时,先将计时器重置为 0。
org-insert-heading) ¶计时器列表启动后,也可使用 M-RET 插入新的计时器项。
org-timer-pause-or-continue) ¶暂停计时器,若已暂停则恢复。
org-timer-stop) ¶停止计时器。停止后只能启动新计时器,无法恢复旧计时器。 该命令也会从模式行移除计时器显示。
当信息录入系统后,往往需要进行位置调整。 Org 为此提供了归位、复制与归档命令。归位和复制 用于移动和复制大纲结构,归档则能让系统保持简洁高效。
在查看已捕获的内容时,你可能需要将部分条目归位或复制 到其他列表中,例如归入某个项目。手动剪切、查找位置 再粘贴的操作十分繁琐,可通过以下专用命令简化流程:
org-refile) ¶归位光标所在的条目或选中区域。该命令会列出可归位的目标位置,
并支持通过补全功能进行选择。选中内容会作为子项放置在
目标标题下方,具体是首位还是末位子项,由
org-reverse-note-order 变量决定。
默认情况下,当前缓冲区的所有一级标题均可作为目标位置,
你也可以跨多个文件配置更复杂的规则,详情参见变量
org-refile-targets~。若想通过类似文件路径的大纲路径
补全选择位置,可查看 ~org-refile-use-outline-path
与 org-outline-path-complete-in-steps 。
若需要在归位时即时创建新的父级节点,
可配置变量 org-refile-allow-creating-parent-nodes 。
当设置 org-log-refile84后,
条目每次被归位时都会记录时间戳或备注信息。
通过归位界面跳转到指定标题位置。
org-refile-goto-last-stored) ¶跳转到上一次使用 org-refile 移动结构树的目标位置。
将条目归位到当前正在计时项目的子项位置。
归位条目并保留原位置副本。可通过 org-refile-keep
将此行为设为默认,注意该操作可能导致 ‘ID’ 属性重复。
org-refile-cache-clear) ¶清空归位目标缓存。可通过设置 org-refile-use-cache
启用缓存功能,若要让命令识别新增的目标位置,
需执行此命令清空缓存。
org-refile-copy) ¶复制操作与归位逻辑一致,区别是不会删除原条目。
org-refile-reverse) ¶功能与归位一致,区别在于它会临时反转 org-reverse-note-order 在当前缓冲区中的生效方式。因此,如果 org-refile 会将条目追加到目标标题下方作为最后一项, org-refile-reverse 就会将其插入作为第一项,反之亦然。
当由(子)结构树表示的项目完成后,你可能希望将该结构树移开,不再让它出现在日程中。归档功能对于保持工作文件简洁、并让日程视图生成等全局检索操作保持快速非常重要。
org-archive-subtree-default) ¶按照变量 org-archive-default-command 指定的方式
归档当前条目。
最常用的归档操作是将项目结构树移动到另一个文件, 该文件即为归档文件。
org-archive-subtree) ¶将光标所在的结构树归档到 org-archive-location 指定的位置。
检查当前标题的所有直接子项是否可归档。系统会遍历每个子树, 查看是否存在未完成的 TODO 条目,若无则提示将其移入归档位置。 若执行命令时光标 未 落在标题上,则会检查所有一级结构树。
操作同上,但会检查结构树中的时间戳而非 TODO 条目。 如果该结构树确实包含时间戳且时间已过期,命令会提示将其归档。
默认归档位置为当前文件同级目录下,文件名在原名称后追加 ‘_archive’ 的文件。
你也可以指定归档内容所属的标题,甚至将其归入文件内的日期树结构。
关于文件与标题的配置方式及示例,详见变量 org-archive-location 的说明文档。
同时也支持在缓冲区内部配置该变量,示例如下:
#+ARCHIVE: %s_done::
若需要为单个条目或结构树指定专属归档位置, 可为其设置 ‘ARCHIVE’ 属性并填入目标路径(参见 Properties and Columns)。
结构树被归档时,会自动添加若干特殊属性,用于记录来源文件、
大纲路径、归档时间等上下文信息。可通过配置
org-archive-save-context-info 调整记录的信息内容。
当 org-archive-subtree-save-file-p 不为 nil 时,
会自动保存目标归档缓冲区的修改。
如果只想在日程视图中屏蔽某些子树、而不将它们移到其他文件,可以使用 ‘ARCHIVE’ 标签。
标记了 ‘ARCHIVE’ 标签的标题(参见 Tags)会保留在大纲树中的原有位置,但行为如下:
org-cycle-open-archived-trees~。
此外,~org-fold-show-all 等常规大纲命令也可展开归档内容。
org-sparse-tree-open-archived-trees 配置。
org-agenda-skip-archived-trees 使其始终生效。
在日程视图中可按下 v a 临时显示归档内容。
org-export-with-archived-trees 调整导出规则。
org-columns-skip-archived-trees 设为 nil 。
以下命令用于管理 ‘ARCHIVE’ 标签:
org-toggle-archive-tag) ¶为当前标题切换归档标签。标签启用后, 标题会切换为阴影样式的文本的视觉样式,下方结构树自动隐藏。
检查当前标题的直接子项是否需要归档。遍历子树查看是否存在 未完成的 TODO 条目,若无则提示为该子项添加 ‘ARCHIVE’ 标签。 若光标不在标题上,则检查所有一级结构树。
org-cycle-force-archived) ¶强制展开带有 ‘ARCHIVE’ 标签的结构树。
org-archive-to-archive-sibling) ¶将当前条目移动至 归档同级节点(Archive Sibling) 。该节点是标题为 ‘Archive’ 且带有归档标签、与当前条目同级的节点。当前条目会成为该同级节点的子项,以此保留大量原有上下文信息,包括继承的标签以及在大纲中的大致位置。
任何整理系统的重要组成部分,都是能够快速捕获新想法与任务,并将参考资料与之关联。Org 通过名为 捕获(capture) 的流程实现这一功能。它还可以在专用目录中存储与任务相关的文件(/附件(attachments)/)。最后,它还能解析 RSS 提要以获取信息。如需了解如何让外部程序(如网页浏览器)触发 Org 捕获内容,请参见 Protocols for External Access。
捕获功能让你可以快速保存笔记,几乎不打断工作流程。Org 的新建内容捕获方式深受 John Wiegley 优秀的 Remember 扩展启发。
以下自定义设置用于指定笔记的默认目标文件。
(setq org-default-notes-file (concat org-directory "/notes.org"))
你也可以为捕获新内容定义全局快捷键(参见 Activation)。
org-capture) ¶显示捕获模板菜单。若已定义模板(参见 Capture templates),菜单会列出这些模板供选择。它会将模板插入目标文件,并切换到 narrowed 间接缓冲区以显示该新节点。之后你即可插入所需信息。
org-capture-finalize) ¶在捕获缓冲区完成信息输入后,C-c C-c 会恢复捕获前的窗口布局,让你不受干扰地继续工作。带前缀参数调用时,会完成保存并跳转到刚捕获的条目。
org-capture-refile) ¶通过将笔记重新归档到其他位置来完成捕获流程(参见 Refile and Copy)。请注意这是一条普通的重新归档命令,执行时光标位置很重要。若已插入包含父节点与子节点的树形结构,需先将光标移回父节点。该命令的任何前缀参数都会传递给 org-refile 命令。
org-capture-kill) ¶中止捕获流程并恢复到之前状态。
你也可以在日程视图中通过 k c 组合键特殊调用 org-capture 。通过这种方式调用时,所选捕获模板插入的时间戳默认使用日程视图中光标所在日期,而非当前日期。
如需查找最近保存的捕获内容位置,可使用带前缀命令的 org-capture :
跳转到某捕获模板的目标位置,按常规方式选择模板即可。
在其缓冲区中跳转到最近保存的捕获条目。
你也可以直接跳转到书签 org-capture-last-stored ,该书签会自动创建,除非你自定义了 org-bookmark-names-plist 。
如需在 Org 缓冲区的光标位置直接插入捕获内容,可使用 C-0 前缀参数调用 org-capture 。
你可以为不同类型的捕获内容、不同目标位置使用模板。创建此类模板最简单的方式是通过自定义界面。
自定义变量 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")))
现在来看模板定义的各个元素。 org-capture-templates 中的每个条目都是包含以下项的列表:
用于选择模板的按键字符串,仅支持字符,例如 ‘"a"’ 表示单键选择模板, ‘"bt"’ 表示双键选择。使用多个按键时,相同前缀的按键在列表中必须连续排列,并在前面用一个双元素条目说明该前缀按键,例如:
("b" "Templates for marking stuff to buy")
若未为 C 键定义模板,该键会打开此复杂变量的自定义缓冲区。
简短的模板描述字符串,在选择时显示。
条目类型,为符号。有效值包括:
entry带有标题的 Org 模式节点。将作为目标条目的子节点或顶层节点保存。目标文件应为 Org 文件。
item普通列表项,放置在目标位置的第一个普通列表中。目标文件同样应为 Org 文件。
checkitem复选框项。与普通列表项的区别仅在于默认模板不同。
table-line在目标位置的第一个表格中新建一行。具体插入位置取决于 :prepend 和 :table-line-pos 属性(见下文)。
plain按原样插入的纯文本。
指定捕获内容的保存位置。在 Org 文件中,目标通常指定一个节点,条目会成为该节点的子节点。其他类型内容会添加到该节点正文中的表格或列表中。大多数目标说明包含 ‘<file-spec>’ 。若为空字符串,则默认使用 org-default-notes-file 。文件也可以用变量或无参调用函数指定。若目标未指定绝对路径,则视为相对于 org-directory 。
有效值包括:
文本将放在该文件的开头或结尾。
作为该条目的子节点或在该条目正文中保存。
若目标标题在文件中唯一,可使用此快速配置。
对于非唯一标题,使用完整路径更安全。
使用正则表达式定位光标位置。
该目标85会在日期树86中为今日日期创建标题。若指定可选大纲路径,日期树会建立在该节点之下,而非顶层。更多选项可查看下方的 :time-prompt 与 :tree-type 属性。
用于在文件中查找正确位置的函数。
保存到当前正在计时的条目。
光标 ‘point’ 所在位置。
最通用的方式:自行编写函数,既打开文件又将光标移到正确位置。
用于创建捕获条目的模板。若留空,会使用合适的默认模板。否则为包含转义码的字符串,转义码会根据捕获调用的时间与上下文替换。你也可以从文件87或通过函数动态获取该模板字符串,语法如下:
(file "/path/to/template-file") (function FUNCTION-RETURNING-THE-TEMPLATE)
条目的剩余部分为附加选项的属性列表。支持的属性包括:
: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) 的任意子集按指定层级分组。若同时指定 month 与 week ,周会归属到包含周四的月份,以符合 ISO 年-周规则。若指定 quarter 与 week 但未指定 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 之前运行的无参函数或无参函数列表。
在模板内部,特殊的 “%-转义序列”88支持动态插入内容。模板按以下顺序展开:
插入 FILE 指定文件的内容。
执行 Elisp 表达式 (EXP) 并用结果替换。 (EXP) 必须返回字符串。只有模板中原有的占位符或通过 ‘%[file]’ 引入的占位符会以此方式展开。由于该操作在非交互式 “%-转义” 展开之后执行,因此可使用后者填充表达式。
示例: ‘%(org-id-new)’ 、 ‘%(eval default-directory)’
对 FORMAT 执行 format-time-string 的结果。
时间戳,仅日期。
时间戳,包含日期与时间。
与上述 ‘%t’ 、 ‘%T’ 类似,但为非激活时间戳。
初始内容,即捕获时选中的区域内容。若同一行中 ‘%i’ 前有文本(如缩进),且 ‘%i’ 不在 ‘%(exp)’ 内,该前缀会添加到插入文本的每一行前。
注释,通常是 org-store-link 创建的链接。
与 ‘%a’ 类似,但会提示输入描述部分。
与 ‘%a’ 类似,但仅插入原始链接。
与 ‘%l’ 类似,但不含括号(仅链接内容)。
当前剪切板首位内容。
X 剪切板内容。
当前计时任务的标题。
指向当前计时任务的链接。
用户名(取自 user-full-name )。
调用 org-capture 时当前缓冲区打开的文件。
当前缓冲区打开文件或目录的完整路径。
特定链接类型的专用信息,见下文。
提示输入标签,支持目标文件内标签补全。
提示输入标签,支持所有日程文件内标签补全。
与 ‘%t’ 类似,但提示选择日期。同理支持 ‘%^T’ 、 ‘%^u’ 、 ‘%^U’ 。可定义提示文字如 ‘%^{Birthday}t’ 。
交互式选择要使用的剪切或剪贴内容。
与 ‘%^C’ 类似,但作为链接插入。
提示用户输入属性 PROP 的值。可通过 ‘%^{PROP|default}’ 指定默认值。
按 ‘%^X’ 方式提示用户,但使用自定义提示字符串。可通过 ‘%^{PROMPT|default|completion1|completion2|completion3...}X’ 指定默认值与补全项。
提示用户输入字符串并替换该序列。可通过 ‘%^{prompt|default|completion2|completion3...}’ 指定默认值与补全表。方向键可访问提示专用历史记录。
插入第 N 个 ‘%^{PROMPT}’ (不含 ‘%^{PROMPT}X’ )中输入的文本,N 为从 1 开始的数字。
与 ‘%\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’ |
如需控制某捕获模板是否在特定上下文可用,可自定义 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")))))
更多信息请参见该变量的文档字符串。
将参考资料与标题或子树关联通常很有用。少量纯文本可以直接保存在项目的子树中。超链接(参见 Hyperlinks)可以与本地甚至远程计算机上的其他文件建立关联,例如属于项目的邮件或源代码文件。
另一种方法是使用 附件(attachments) ,即存放在对应标题/子树专属目录中的文件。Org 会使用标题的 ‘ID’ 属性或 ‘DIR’ 属性所指定的目录。
默认情况下,Org 附件在为标题添加附件时使用 ‘ID’ 属性。这使得附件的管理完全自动化,无需手动决定文件夹名称或位置。基于 ‘ID’ 的目录默认存放在 ‘data/’ 目录下,该目录与你的 Org 文件位于同一目录91。
使用 org-attach 添加附件时,会自动为该节点添加默认标签 ‘ATTACH’ 。
如需更精细地配置相关设置,请参见 Attachment options。
以下命令用于处理附件:
org-attach) ¶附件系统相关命令的调度器。按下该组合键后会显示命令列表,你需要再按一个键来选择具体命令:
org-attach-attach) ¶选择一个文件并将其移入任务的附件目录。文件会根据 org-attach-method 的设置进行复制、移动或链接。注意并非所有系统都支持硬链接。
分别使用复制/移动/链接方式附加文件。注意并非所有系统都支持硬链接。
org-attach-buffer) ¶选择一个缓冲区,并将其保存为文件存放到任务的附件目录中。
org-attach-new) ¶创建一个新附件,以 Emacs 缓冲区的形式打开。
org-attach-sync) ¶手动同步当前任务与其附件目录,适用于你自行添加了附件的情况。
org-attach-open) ¶打开当前任务的附件。若存在多个附件,会先提示选择文件名。打开方式遵循 org-file-apps 设置的规则。更多细节可参考超链接相关说明(参见 Handling Links)。
org-attach-open-in-emacs) ¶同样打开附件,但强制在 Emacs 内部打开文件。
org-attach-reveal) ¶打开当前任务的附件目录。
org-attach-reveal-in-emacs) ¶同样打开目录,但强制使用 Emacs 内的 Dired 模式。
org-attach-delete-one) ¶选择并删除单个附件。
org-attach-delete-all) ¶删除任务的所有附件。更安全的方式是在 Dired 中打开目录后手动删除。
org-attach-set-directory) ¶指定一个目录作为该条目的附件目录。实现方式是将目录路径存入 ‘DIR’ 属性。
org-attach-unset-directory) ¶移除附件目录设置。该命令会删除 ‘DIR’ 属性,并询问用户如何处理目录内容:若该节点已设置 ‘ID’ 属性,可将内容移入对应目录;或直接删除内容;或保留目录但不再与该标题关联。
附件相关有一些值得关注的配置项:
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 ,也可设为 dir 、 ask 或 nil 。
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’ 。
可以使用附件链接引用附加的文件和文件夹,这样可以方便地指向添加到标题/子树的资料,尤其是在使用标题唯一 ‘ID’ 附加文件时!
* TODO Some task :PROPERTIES: :ID: 95d50008-c12e-479f-a4f2-cc0238205319 :END: See attached document for more information: [[attachment:info.org]]
关于此类链接的更多信息,请参见 External Links。
如果标题关联的目录是一个 Git 仓库,可以配置 Org 在检测到变更时自动提交到该仓库。
要让 Org 自动管理附件的版本控制,可在 Emacs 配置中添加:
(require 'org-attach-git)
可以从 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))))))
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’ 标题下:
org-feed-update-all) ¶从 org-feed-alist 配置的所有订阅源收集内容并进行处理。
org-feed-goto-inbox) ¶提示选择订阅名称,并跳转到该订阅对应的收件箱位置。
Org 会在同一标题下创建名为 ‘FEEDSTATUS’ 的抽屉,用于保存订阅条目的状态信息,避免重复添加同一内容。
更多信息(包括如何读取 Atom 提要)可参考 ‘org-feed.el’ 及 org-feed-alist 的文档字符串。
由于 Org 的工作方式,待办事项、带时间戳的条目以及带标签的标题可能分散在单个文件甚至多个文件中。要概览待处理事项或特定日期的重要事件,必须将这些信息收集、排序并以有序方式显示。
Org 可以根据多种条件筛选条目,并在独立缓冲区中显示。系统提供六种不同的视图类型:
提取出的信息会显示在专用的 日程缓冲区(agenda buffer) 中。该缓冲区为只读,但提供命令可跳转到原 Org 文件的对应位置,甚至可以远程编辑这些文件。
默认情况下,报告忽略已注释(参见 Comment Lines)和已归档(参见 Internal archiving)的条目。你可以将 org-agenda-skip-comment-trees 和 org-agenda-skip-archived-trees 设为 nil 以覆盖该行为。
有两个变量控制日程缓冲区的显示方式以及退出日程时是否恢复窗口布局: org-agenda-window-setup 和 org-agenda-restore-windows-after-quit 。
需要显示的信息通常从所有 日程文件agenda files 中收集,即变量 org-agenda-files 中列出的文件92。如果列表中包含目录,则该目录下所有扩展名为 ‘.org’ 的文件均属于日程文件。
因此,即使你只使用单个 Org 文件,也应将其加入该列表93 。你可以自定义 org-agenda-files ,但更简便的维护方式是使用以下命令:
org-agenda-file-to-front) ¶将当前文件添加到日程文件列表,并移至列表开头。若已存在则直接移至开头。带前缀参数时,添加或移至列表末尾。
org-remove-file) ¶将当前文件从日程文件列表中移除。
org-cycle-agenda-files) ¶循环切换日程文件列表,依次打开每个文件。
使用类似 Iswitchb 的界面在 Org 缓冲区之间切换。
Org 菜单包含当前文件列表,可用于直接打开任意文件。
如果你希望临时将日程聚焦于列表外的某个文件、列表中的单个文件,甚至文件中的某个子树,可以通过多种方式实现。执行单次日程命令时,可在调度器中按一次或多次 <(参见 The Agenda Dispatcher)。若要长时间限制日程范围,使用以下命令:
org-agenda-set-restriction-lock) ¶将日程限制在当前子树。若光标位置已有限制则移除该限制。带通用前缀参数调用,或光标位于文件首个标题前时,将日程范围设为整个文件。该限制持续生效,直到通过 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) ¶移除限制。
视图通过调度器创建,可通过 M-x org-agenda 访问,更好的方式是绑定全局快捷键(参见 Activation)。调度器会显示菜单,需再按一个字母执行对应命令。调度器提供以下默认命令:
生成日历样式的日程(参见 Weekly/daily agenda)。
生成所有待办事项列表(参见 The global TODO list)。
生成匹配指定表达式的标题列表(参见 Matching tags and properties)。
根据关键词和/或正则表达式的布尔表达式筛选条目,生成列表。
在所有日程文件以及 org-agenda-text-search-extra-files 列出的文件中搜索正则表达式。使用 Emacs 命令 multi-occur 。前缀参数可指定每个匹配的上下文行数,默认为 1。
生成停滞项目列表(参见 Stuck projects)。
配置停滞项目列表规则(参见 Stuck projects)。
将日程命令限制在当前缓冲区94。若已启用 narrowing,则限制在 narrowed 区域。按下 < 后仍需按对应命令选择键。
若存在激活区域,将后续日程命令限制在该区域;否则限制在当前子树。按下 < < 后仍需按对应命令选择键。
切换粘性日程视图。默认情况下,Org 仅维护一个日程缓冲区,每次切换视图都会重建以保证内容最新。若频繁切换视图且构建时间较长,可开启粘性日程缓冲区(通过自定义变量 org-agenda-sticky 设为默认)。开启粘性后,调度器仅切换视图,需手动按 r 或 g 更新。可随时通过 org-toggle-sticky-agenda 切换粘性模式。
你也可以定义自定义命令,在调度器中与默认命令一样使用。这包括创建包含多个模块的扩展日程缓冲区,例如周日程、全局待办列表和多个特殊标签匹配结果。参见 Custom Agenda Views。
本节介绍内置的各类视图。
周/日 日程(agenda) 的作用类似于纸质日程本,显示当前周或当天的所有任务。
org-agenda-list) ¶从 Org 文件列表编译生成当前周的日程,按天显示条目。带数字前缀参数95(如 C-u 2 1 M-x org-agenda a)可设置显示天数。
日程默认显示天数由变量 org-agenda-span 设置。该变量可设为任意天数,或 day 、 week 、 month 、 year 等跨度名称。周日程默认从上周一(参见 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。
Emacs 内置由 Edward M. Reingold 编写的日历与日记功能。日历显示三月视图并包含各国节假日。日记可记录纪念日、月相、日出日落、周期性预约等。与 Org 形成良好互补。将 Org 内容与日记结合非常实用。
要将 Emacs 日记条目加入 Org 日程,只需自定义变量:
(setq org-agenda-include-diary t)
之后即可自动集成。所有日记条目(含节假日、纪念日等)都会出现在 Org 生成的日程缓冲区中。在日程缓冲区中可使用 SPC、TAB、RET 跳转到日记文件编辑已有条目。i 命令可在当前日期插入新条目,S、M、C 分别显示日出日落、月相和转换历法,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
若使用 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 天。
Org 可与 Emacs 预约提醒功能联动。使用命令 org-agenda-to-appt 可将日程文件中的预约加入提醒。该命令支持筛选,仅添加特定分类或匹配正则表达式的预约。同时读取 ‘APPT_WARNTIME’ 属性,覆盖该预约的 appt-message-warning-time 。详情参见文档字符串。
全局待办列表收集并格式化所有未完成待办事项。
org-todo-list) ¶显示全局待办列表。从所有日程文件(参见 Agenda Views)收集待办事项到单个缓冲区。默认列出非完成状态的条目。缓冲区处于日程模式,可直接查看和操作待办条目(参见 Commands in the Agenda Buffer)。
org-todo-list) ¶功能同上,但允许选择特定待办关键词。也可通过给 t 加前缀参数实现。系统提示输入关键词,可用 ‘|’ 作为或运算符分隔多个关键词。带数字前缀时选择 org-todo-keywords 中的第 N 个关键词。
日程缓冲区中的 r 键可重建列表,带前缀参数可切换所选待办关键词,例如 3 r。若经常需要搜索特定关键词,可定义自定义命令(参见 The Agenda Dispatcher)。
匹配特定待办关键词也可作为标签搜索的一部分(参见 Tag Searches)。
对待办事项的远程编辑支持单键修改状态。待办列表可用命令参见 Commands in the Agenda Buffer。
默认全局待办列表显示所有带待办关键词的标题,列表可能过长。有两种精简方式:
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 实现该行为。
若日程文件中的标题带有 标签(tags) (参见 Tags)或属性(参见 Properties and Columns),可根据这些元数据筛选标题并收集到日程缓冲区。此处描述的匹配语法同样适用于使用 C-c / m 创建稀疏树。
org-tags-view) ¶生成匹配指定标签集合的所有标题列表。命令提示输入筛选条件,为标签布尔表达式,如 ‘+work+urgent-withboss’ 或 ‘work|home’ (参见 Tags)。若经常需要特定搜索,可定义自定义命令(参见 The Agenda Dispatcher)。
org-tags-view) ¶与 m 类似,但仅筛选同时为待办事项的标题。排除规划/截止日期条目可参见变量 org-agenda-tags-todo-honor-ignore-options 。同时匹配特定待办关键词与标签也可实现,参见 Tag Searches。
标签列表可用命令参见 Commands in the Agenda Buffer。
搜索字符串可使用布尔运算符 ‘&’ (与)和 ‘|’ (或)。 ‘&’ 优先级高于 ‘|’ 。暂不支持括号。搜索中的每个元素可为标签、匹配标签的正则表达式,或 ‘PROPERTY OPERATOR VALUE’ 形式的属性比较表达式。元素前可加 ‘-’ 表示排除, ‘+’ 为正向选择的语法糖。存在 ‘+’ 或 ‘-’ 时,与运算符 ‘&’ 可省略。以下为仅使用标签的示例:
选择带 ‘work’ 标签但不带 ‘boss’ 标签的标题。
选择带 ‘work’ 或 ‘laptop’ 标签的行。
同上,但要求 ‘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’ 标签且状态为 ‘WAITING’ 的待办行。
工作与家庭中状态为等待的任务。
匹配属性时可使用多种比较运算符。复杂示例:
+work-boss+PRIORITY="A"+Coffee="unlimited"+Effort<*2
+With={Sarah\|Denny}+SCHEDULED>="<2008-10-11>"
比较类型取决于比较值的写法:
因此示例搜索字符串可找到:带 ‘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+TODO="WAITING"’ 。
选择带有 ‘work’ 标签、且状态既不是 ‘WAITING’ 也不是 ‘NEXT’ 的 TODO 条目。
选择带有 ‘work’ 标签、且状态为 ‘WAITING’ 或 ‘NEXT’ 的 TODO 条目。
该日程视图是 Org 条目的通用文本搜索工具,尤其适合查找笔记。
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 中列出的文件。
若使用 David Allen 的 GTD 等方法管理工作,定期 review 确保所有项目推进是重要任务。 停滞(stuck) 项目指未定义下一步行动的项目,因此不会出现在 Org 待办列表中。Review 时需识别此类项目并为其定义下一步行动。
org-agenda-list-stuck-projects) ¶列出停滞项目。
自定义变量 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\\>"))
注意:如果某个项目被判定为非停滞项目,仍会在该条目的子树中继续搜索停滞项目。
在日程视图中显示条目之前,Org mode 会对条目进行视觉上的整理并排序。每个条目占据单独一行。该行以一个 前缀(prefix) 开头,其中包含条目的 分类(category) (参见 Categories)及其他重要信息。你可以通过 org-agenda-tags-column 自定义标签显示的列数,也可以使用选项 org-agenda-prefix-format 自定义前缀格式。前缀之后是与条目关联的、经过精简的大纲标题。
分类是分配给每个日程项的宽泛标签。默认情况下,分类直接取自文件名,但你也可以在缓冲区中通过特殊行指定,例如:
#+CATEGORY: Thesis
如果想为单个条目或某个(子)树设置专用分类,可以为该条目设置 ‘CATEGORY’ 属性,并将所需分类作为属性值。
分类名称不超过 10 个字符时,在日程缓冲区中的显示效果最佳。你可以通过自定义变量 org-agenda-category-icon-alist 为分类设置图标。
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 进行配置。
条目在插入视图前会被排序,具体方式取决于视图类型。
org-agenda-files 给出的序列。在每个分类内部,条目按紧急程度排序,紧急程度由优先级(参见 Priorities)推导而来,逾期的计划或截止日期条目会额外加分。最低优先级计为 0,下一级为 1000,之后每级递增 1000,直至最高优先级,例如 ‘C’ 、 ‘B’ 、 ‘A’ 分别计为 0、1000、2000。
排序可通过变量 org-agenda-sorting-strategy 自定义,还可加入基于条目预估耗时的排序依据(参见 Effort Estimates)。
日程的内置或自定义命令是静态定义的,而日程过滤器与限制器允许灵活缩小日程条目范围。
过滤器(Filters) 仅改变条目的可见性,速度极快,且多用于交互式操作99。你可以在不同过滤器间快速切换,无需重新生成日程。与之相对, 限制器(Limits) 在日程缓冲区填充前生效,因此主要用于在自定义日程命令中作为局部变量定义。
通用过滤命令为 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)清除当前日程视图中的所有过滤。
若变量 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 来应用这种自适应过滤。
以下是可全局设置或在自定义日程视图中局部设置的选项列表(参见 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) ¶提示选择限制类型并输入对应值。
日程缓冲区中的条目会链接回其来源的 Org 文件或日记文件。你不能直接编辑日程缓冲区本身,但提供了相关命令用于显示并跳转到原始条目位置,以及从日程缓冲区 “远程(remotely)” 编辑 Org 文件。这样所有信息仅存储一份,避免日程与笔记文件内容不一致的风险。
部分命令可通过点击日程行执行,其他命令则需要将光标置于目标行。
org-agenda-next-line) ¶移动到下一行(与 DOWN 和 C-n 功能相同)。
org-agenda-previous-line) ¶移动到上一行(与 UP 和 C-p 功能相同)。
org-agenda-show-and-scroll-up) ¶在另一个窗口中显示条目原始位置。带前缀参数时,确保抽屉保持折叠状态。
org-agenda-recenter) ¶显示原始位置并将该窗口居中。
org-agenda-goto) ¶跳转到另一个窗口中的条目原始位置。
org-agenda-switch-to) ¶跳转到条目原始位置并关闭其他窗口。
org-agenda-follow-mode) ¶切换跟随模式(Follow mode)。在跟随模式下,当你在日程缓冲区中移动光标时,另一个窗口会始终显示 Org 文件中对应位置。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-follow-mode 设置。
org-agenda-tree-to-indirect-buffer) ¶在间接缓冲区中显示当前条目的完整子树。带数字前缀参数 N 时,向上跳转至 N 级标题并取该子树;若 N 为负数,则向上跳转对应级数。带 C-u 前缀时,不删除此前使用的间接缓冲区。
org-agenda-open-link) ¶打开条目中的链接。系统会列出所引用 Org 节点文本中的所有链接供选择;若仅有一个链接,则直接打开无需提示。
交互式选择另一个日程视图并追加到当前视图。
关闭其他窗口。
org-agenda-day-view) ¶切换到日视图。切换为日视图后,该设置会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到年内指定日期,例如 32 d 跳转到 2 月 1 日。设置日视图时,前缀参数中也可包含年份,例如 200712 d 跳转到 2007 年 1 月 12 日。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。
org-agenda-week-view) ¶切换到周视图。切换为周视图后,该设置会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到 ISO 周历指定周数,例如 9 w 跳转到第 9 个 ISO 周。设置周视图时,前缀参数中也可包含年份,例如 200712 w 跳转到 2007 年第 12 周。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。
org-agenda-month-view) ¶切换到月视图。由于月视图生成较慢,不会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到当月指定日期。设置月视图时,前缀参数中也可包含年份,例如 200712 m 跳转到 2007 年 12 月。若年份仅为一位或两位数字,会自动扩展为未来 30 年或过去 69 年内的对应年份。
org-agenda-year-view) ¶切换到年视图。由于年视图生成较慢,不会成为后续刷新日程的默认视图。可使用数字前缀参数直接跳转到年内指定日期。
org-agenda-reset-view) ¶将当前视图重置为 org-agenda-span 指定的默认视图。
org-agenda-later) ¶向后跳转时间,显示当前时段之后的内容。例如当前显示一周,则切换到下一周。带前缀参数时,重复跳转对应次数。
org-agenda-earlier) ¶向前跳转时间,显示更早日期的内容。
org-agenda-goto-today) ¶跳转到今天。
org-agenda-goto-date) ¶提示输入日期并跳转到该日期。
org-agenda-clock-goto) ¶跳转到 日程缓冲区中(in the agenda buffer) 当前正在计时的任务。
org-agenda-toggle-diary) ¶切换是否包含日记条目。参见 Weekly/daily agenda。
org-agenda-log-mode) ¶切换日志簿模式。在日志簿模式下,开启日志记录时标记为完成的条目(参见变量 org-log-done )以及当日有计时记录的条目会显示在日程中。你可以通过变量 org-agenda-log-mode-items 配置日志模式中包含的条目类型。带 C-u 前缀参数调用时,显示所有可用日志簿条目,包括状态变更;带双重前缀参数 C-u C-u 调用时,仅显示日志信息,不显示其他内容。v L 等价于 C-u v l。
org-agenda-manipulate-query-add) ¶在当前视图中包含非活动时间戳,仅适用于每周/每日日程。
org-agenda-archives-mode) ¶切换归档模式。在归档模式下,生成日程时也会扫描已归档的树(参见 Internal archiving)。再次按 v a 可退出归档模式。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-archives-mode 设置,其取值与 org-agenda-archives-mode 相同。
切换归档模式,同时包含所有归档文件。
org-agenda-clockreport-mode) ¶切换计时报表模式(Clockreport mode)。在计时报表模式下,每日/每周日程总会显示一个表格,包含当前日程视图覆盖时间范围与文件范围内的计时时长。新建日程缓冲区时该模式的初始状态可通过变量 org-agenda-start-with-clockreport-mode 设置。带前缀参数切换该模式时(即 C-u R),计时表格不会包含被日程过滤隐藏的条目100。另可参见变量 org-clock-report-include-clocking-task 与 org-agenda-clock-report-header 。
在当前日程范围内显示重叠计时条目、计时中断及其他计时问题,之后可跳转到计时行手动修正。可通过变量 org-agenda-clock-consistency-checks 自定义计时问题的判定规则。按 l 退出日志簿模式,返回正常日程显示。
org-agenda-entry-text-mode) ¶切换条目文本模式。在条目文本模式下,日程行下方会显示其所引用 Org 标题的若干行内容,最大行数由变量 org-agenda-entry-text-maxlines 指定。带数字前缀参数调用该命令时,会临时将该数值修改为前缀参数值。
org-agenda-toggle-time-grid) ¶切换时间网格显示。另可参见变量 org-agenda-use-time-grid 与 org-agenda-time-grid 。
org-agenda-redo), g ¶重新生成日程缓冲区,例如在使用 S-LEFT 与 S-RIGHT 修改条目时间戳后刷新显示。若缓冲区为全局 TODO 列表,前缀参数会用于生成特定 TODO 关键字的筛选列表。
org-save-all-org-buffers) ¶保存当前 Emacs 会话中所有 Org 缓冲区,同时保存 ID 位置。
org-agenda-columns) ¶在日程缓冲区中启用列视图(参见 Column View)。列视图格式取自光标所在条目,若无则取日程视图中第一个条目,即原始缓冲区中该条目的格式(来自属性、 ‘COLUMNS’ 关键字或默认变量 org-columns-default-format )会在日程中使用。
org-agenda-remove-restriction-lock) ¶解除日程的限制锁定(若当前限制为某个文件或子树,参见 Agenda Files)。
org-agenda-drag-line-backward) ¶将光标所在行向上拖动一行。带数字前缀参数时,向上拖动对应行数。
拖动日程行的效果在日程刷新后不会保留,也不会修改源 Org 文件。
org-agenda-drag-line-forward) ¶将光标所在行向下拖动一行。带数字前缀参数时,向下拖动对应行数。
数字参数。
org-agenda-undo) ¶撤销远程编辑命令带来的修改,同时在日程缓冲区与远程缓冲区中恢复变更。
org-agenda-todo) ¶修改条目 TODO 状态,同时更新日程与原始 Org 文件。前缀参数会传递给 org-todo 命令,例如 C-u 前缀会触发记录状态变更备注。
org-agenda-todo-nextset) ¶切换到下一组 TODO 关键字。
org-agenda-todo-previousset ¶切换到上一组 TODO 关键字。
org-agenda-kill) ¶删除当前日程项及其在原始 Org 文件中对应的完整子树。若远程删除的文本超过一行,需要用户确认删除操作。参见变量 org-agenda-confirm-kill 。
org-agenda-refile) ¶归栏光标所在条目。
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.
org-agenda-toggle-archive-tag) ¶为当前标题切换归档标签(参见 Internal archiving)。
org-agenda-archive-to-archive-sibling) ¶将当前条目对应的子树移动到其 归档兄弟节点(archive sibling) 。
org-agenda-archive) ¶归档当前标题对应的子树,即将条目移动到配置的归档位置,通常为另一个文件。
org-agenda-show-tags) ¶显示当前条目关联的所有标签。适用于已关闭 org-agenda-show-inherited-tags 但仍需临时查看标题全部标签的场景。
org-agenda-set-tags) ¶为当前标题设置标签。若日程中有活动区域,则为区域内所有标题统一修改标签。
org-agenda-priority) ¶为当前条目设置优先级。Org mode 会提示输入优先级字符,若输入 SPC,则移除条目中的优先级标记。
org-agenda-priority-up) ¶提高当前条目优先级。优先级会在原始缓冲区中修改,但日程不会重新排序,可按 r 键刷新。
org-agenda-priority-down) ¶降低当前条目优先级。
org-agenda-set-effort) ¶为当前条目设置耗时属性。
org-agenda-add-note) ¶为条目添加备注。备注会被记录,并保存到状态变更备注的相同位置。根据 org-log-into-drawer 的设置,备注可能保存在抽屉内。
org-attach) ¶所有附件相关命令的调度器。
org-agenda-schedule) ¶为该条目设置计划时间。带前缀参数时,移除计划时间戳。
org-agenda-deadline) ¶为该条目设置截止日期。带前缀参数时,移除截止日期。
org-agenda-do-date-later) ¶将当前行关联的时间戳向后调整一天。若日期已过,首次调用会将其改为今天。带数字前缀参数时,调整对应天数,例如 3 6 5 S-RIGHT 调整一年。带 C-u 前缀时,时间调整一小时;立即重复该命令,无需前缀也会继续按小时调整。带双重 C-u C-u 前缀时,按分钟调整。时间戳会在原始 Org 文件中修改,但不会直接反映在日程缓冲区,需按 r 或 g 更新。
org-agenda-do-date-earlier) ¶将当前行关联的时间戳向前调整一天。
org-agenda-date-prompt) ¶修改当前行关联的时间戳。选择 > 键是因为其在键盘上等价于 S-.。
org-agenda-clock-in) ¶为当前条目开始计时。若已有计时正在运行,会先停止该计时。
org-agenda-clock-out) ¶停止此前启动的计时。
org-agenda-clock-cancel) ¶取消当前正在运行的计时。
org-agenda-clock-goto) ¶在另一个窗口跳转到正在运行的计时项。
org-agenda-capture) ¶功能类似 org-capture ,但使用光标所在日期作为捕获模板的默认日期。可设置 org-capture-use-agenda-date 使其成为 org-capture 的默认行为。
org-agenda-bulk-mark) ¶标记光标所在条目以进行批量操作。若日程中有活动区域,则标记区域内条目;带数字前缀参数时,标记对应数量的连续条目。
org-agenda-bulk-mark-all) ¶标记所有可见日程条目以进行批量操作。
org-agenda-bulk-unmark) ¶取消条目批量操作标记。
org-agenda-bulk-unmark-all) ¶取消所有已标记条目的批量操作标记。
org-agenda-bulk-toggle) ¶切换光标所在条目的批量操作标记状态。
org-agenda-bulk-toggle-all) ¶切换所有条目的批量操作标记状态。
org-agenda-bulk-mark-regexp) ¶标记匹配正则表达式的条目以进行批量操作。
org-agenda-bulk-action) ¶批量操作:对日程中所有已标记条目执行操作。系统会提示输入另一个按键选择操作类型。B 的前缀参数会传递给 s 与 d 命令,用于批量移除这些特殊时间戳。默认情况下,批量操作后标记会清除;若想保留标记,可将 org-agenda-bulk-persistent-marks 设置为 t ,或在提示框中按 p。
切换标记持久化状态。
归档所有选中条目。
通过移动到对应归档兄弟节点的方式归档条目。
修改 TODO 状态。提示输入单个 TODO 关键字,并统一修改所有选中条目的状态,跳过阻塞检查且不记录日志备注—但保留时间戳。
为所有选中条目添加标签。
为所有选中条目移除标签。
为所有条目重新设置计划日期。若要将现有计划日期固定向后推移若干天,可在提示框中输入以双加号开头的格式,例如 ‘++8d’ 或 ‘++2w’ 。
设置截止日期为指定日期。
提示输入单个归栏目标并移动所有条目。这些条目会从日程中消失,刷新(g)后重新显示。
随机重新安排到未来 N 天内,N 由用户输入。带前缀参数(C-u B S)时,仅分散到工作日。
对标记条目应用自定义函数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"))))
org-agenda-goto-calendar) ¶打开 Emacs 日历并跳转到日程中光标所在日期。
org-calendar-goto-agenda) ¶在日历界面中,计算并显示光标所在日期的 Org 日程。
org-agenda-diary-entry) ¶使用光标所在日期(对于块条目则使用标记处日期)向日记中插入新条目,方式类似日历中的 i 命令,内容会添加到 Emacs 日记文件102。日记文件会在另一个窗口弹出,供你添加条目内容。
若将 org-agenda-diary-file 配置为某个 Org 文件,Org 会在该文件中创建条目。大多数条目会保存在基于日期的大纲树中,便于后续归档过往月份/年份的日程。该树构建在带有 ‘DATE_TREE’ 属性的条目下,若无则以年份作为顶级条目。Emacs 会提示输入条目文本——若直接输入内容,会在 org-agenda-diary-file 中自动创建条目无需额外操作;若在提示框中直接按 RET,目标文件会在另一个窗口显示,供你手动完成编辑。另可参见 k r 命令。
org-agenda-phases-of-moon) ¶显示当前日期前后三个月的月相。
org-agenda-sunrise-sunset) ¶显示日出日落时间。需通过日历变量设置地理位置,参见 Emacs 日历文档。
org-agenda-convert-date) ¶将光标所在日期转换为多种其他文化与历史历法日期。
org-agenda-holidays) ¶显示光标所在日期前后三个月的节假日。
org-agenda-quit) ¶退出日程,关闭日程缓冲区。
org-agenda-exit) ¶退出日程,关闭日程缓冲区及所有为编译日程而加载的缓冲区,但不会关闭用户手动打开的 Org 文件缓冲区。
自定义日程命令有两个用途:保存并快速访问常用的 TODO 与标签搜索,以及创建专用的复合日程缓冲区。自定义日程命令可通过调度器调用(见 The Agenda Dispatcher),用法与默认命令一致。
自定义搜索的第一种用途是为常用搜索设置快捷键,既可生成日程缓冲区,也可生成稀疏树(后者仅作用于当前缓冲区)。
自定义命令通过变量 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。第二个参数为搜索类型,其后为匹配用的字符串或正则表达式。上述示例定义了:
全局搜索本周/本日计划的日程条目104。
搜索范围同上,但仅包含带具体时间(如 ‘[h]h:mm’ )的条目,可视为约会类事项。
全局搜索 TODO 关键字为 ‘WAITING’ 的条目。
搜索范围同上,但仅作用于当前缓冲区并以稀疏树展示结果。
全局标签搜索,匹配带有 ‘boss’ 标签但不含 ‘urgent’ 标签的标题。
搜索条件同上,但仅限定为 TODO 类型条目。
搜索条件同上,但仅作用于当前缓冲区并以稀疏树展示结果。
在当前缓冲区生成稀疏树,列出所有包含 ‘FIXME’ 单词的条目。
作为 ‘HOME’ 标签搜索的前缀命令,需再按一个键(l、p 或 k)选择人名(Lisa、Peter 或 Kim)作为附加匹配标签。
注意 *-tree 类日程视图必须从 Org 缓冲区调用,因其仅作用于当前缓冲区。
另一种用法是构建由 多条(several) 命令结果组成的日程视图,每条命令在日程缓冲区中生成一个区块。可用命令包括 agenda (每日/每周日程,对应 a)、 alltodo (全局 TODO 列表,对应 t)、 stuck (停滞项目列表,对应 #),以及前文提到的 todo 、 tags 、 tags-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 则提供办公相关的同类视图。
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"))))
更多说明见该变量的文档字符串。
不在电脑前时,打印日程视图会很方便。Org mode 可将自定义日程视图导出为纯文本、HTML105、Postscript、PDF106 与 iCalendar 文件。偶尔导出可使用以下命令:
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) 自动生成导出文件以避免开销。需通过专用命令一次性生成 所有 指定文件:
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。
列视图(见 Column View)通常用于查看与编辑 Org 文件层级结构内的属性。在按条件汇总条目的日程中使用列视图也十分实用。
org-agenda-columns) ¶在日程中启用列视图。
正确使用需明确:日程中的条目已脱离原大纲环境,由此带来以下问题:
org-overriding-columns-format ,若是则使用该格式(建议仅在自定义日程命令的 局部设置段 配置,见 Custom Agenda Views);若无则检查 org-columns-default-format-for-agenda 、日程首个条目关联的格式(通过缓冲区属性或 ‘#+COLUMNS’ 设置),最后使用 org-columns-default-format 。
需注意:同一条目可能在日程中出现 两次 (如同时为计划与截止日期),或出现同层级的父子条目,此类情况会导致重复计算,汇总结果不准确。
Org 主要用于组织和检索纯文本笔记。同时,它也提供一套轻量但强大的标记语言,用于富文本格式化等更多场景。例如,你可能希望文本居中或强调显示,或是在写作中插入公式、图片。Org 为所有这些需求提供了相应语法。配合导出框架(见 Exporting)使用,你可以用 Org 编写精美的文档—就像你正在阅读的这份手册。
段落之间至少用一个空行分隔。如果需要在段落内强制换行,在行尾使用 ‘\\’ 。
若要保留某一区域内的换行、缩进和空行,其余部分则使用常规格式,可以使用以下结构,该结构也可用于排版诗歌。
#+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
你可以将文字设置为 ‘*粗体(bold)*’ 、 ‘/斜体(italic)/’ 、 ‘_下划线(underlined)_’ 、 ‘=逐字文本(verbatim)=’ 和 ‘~代码(code)~’ ,必要时还可以使用 ‘+删除线+’ 。代码与逐字字符串中的文本不会被 Org 专用语法处理,会原样导出。Org 提供单一命令作为插入标记字符的入口。
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。
‘^’ 和 ‘_’ 分别用于表示上标和下标。为提升 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-superscripts 和 org-export-with-sub-superscripts 。例如, ‘#+OPTIONS: ^:{}’ 会将两个选项设为 {} ,仅允许花括号形式的上下标。
你还可以切换上下标的视觉显示:
org-toggle-pretty-entities) ¶该命令以 所见即所得(WYSIWYM) 的方式格式化上下标。
将 org-pretty-entities 和 org-pretty-entities-include-sub-superscripts 均设为 t ,可在打开文件时就按 org-use-sub-superscripts 的设置 视觉上(visually) 解析上下标。
你可以使用类 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 中导出为 ‘α’ ,在 LaTeX 中导出为 ‘\(\alpha\)’ 。同理, ‘\nbsp’ 在 HTML 中为 ‘ ’ ,在 LaTeX 中为 ‘~’ 。
若希望实体以 UTF-8 字符显示,可使用以下命令111:
org-toggle-pretty-entities) ¶切换实体为 UTF-8 字符显示。此操作不会改变缓冲区内容(仍为纯 ASCII),仅在显示时覆盖为 UTF-8 字符。
除上述常规实体外,Org 还会对以下常用字符组合进行特殊导出112: ‘\-’ 视为可选连字符, ‘--’ 和 ‘---’ 转换为短横线与长横线, ‘...’ 变为紧凑省略号。
纯 ASCII 通常足以满足绝大多数笔记需求,例外情况是科研笔记,这类内容常需要数学符号与公式。LaTeX113 是广泛用于排版科技文档的工具。Org mode 支持嵌入 LaTeX 代码,一方面因为许多科研人员习惯读写 LaTeX 源码,另一方面它可被轻松处理,为多种导出后端生成精美输出。
Org mode 可包含 LaTeX 数学片段,并支持为多种导出后端处理这些内容。导出为 LaTeX 时,代码原样保留;导出为 HTML 时,Org 可使用 MathJax(见 Math formatting in HTML export)或将数学公式转为图片(见 Previewing LaTeX fragments)。
LaTeX 片段无需任何特殊标记,以下代码片段会被识别为 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 等 |
若你已正确安装 LaTeX 及 ‘dvipng=、=dvisvgm’ 或 ‘convert’115,LaTeX 片段可被处理为排版公式图片,用于 HTML 导出(见 LaTeX fragments)或 Org mode 内行预览。
你可以自定义变量 org-format-latex-options 和 org-format-latex-header 调整预览效果。特别是前者的 :scale (HTML 导出为 :html-scale )属性可用于调整预览图片大小。
org-latex-preview) ¶为光标处的 LaTeX 片段生成预览图片并覆盖在源码上。若光标处无片段,则处理当前条目(两个标题之间)的所有片段。
单前缀参数调用时,清除当前条目所有图片;双前缀参数为缓冲区所有片段生成预览;三前缀参数清除缓冲区所有预览图片。
你可以通过以下设置在打开文件时自动预览所有 LaTeX 片段:
#+STARTUP: latexpreview
禁用则使用:
#+STARTUP: nolatexpreview
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 文档):
插入环境模板。
若光标位于 LaTeX 片段内116,TAB 可展开模板。例如,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 片段内生效,片段外为普通单引号。
你可以插入无需标记处理的字面示例,这类示例以等宽字体排版,非常适合展示源码及类似内容。
#+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)。
org-edit-special) ¶在对应原生模式下编辑光标处的源码示例。该操作会切换到临时缓冲区编辑源码,完成后按 C-c ' 退出,编辑后的内容会替换 Org 缓冲区中的旧内容。等宽区域(每行以冒号加空格开头)会使用 Artist 模式122编辑,方便绘制 ASCII 图形。在空行使用该命令会新建一个等宽区域。
在通过 C-c ' 创建的临时缓冲区中编辑源码示例时,调用 org-store-link (见 Handling Links)会提示输入标签。确保其在当前缓冲区唯一,并以 ‘(ref:label)’ 格式插入当前行尾。随后该标签会以 ‘(label)’ 形式存储为链接,可通过 C-c C-l 调用。
Org mode 可在 Org 缓冲区中显示超链接预览(见 Hyperlinks)。默认情况下,仅图片链接123支持行内预览,图片会直接显示在链接路径位置。
你可以按照 Adding Hyperlink preview 中的说明自定义预览效果。链接预览不必只显示图片,可使用任意形式的显示装饰(见 (elisp)Overlay Properties)。
你可以通过以下命令在整个缓冲区、当前章节、活动区域或光标处预览支持的链接类型:
org-link-preview) ¶为活动区域(若有)、光标处链接(若有)或当前章节的外部链接创建行内预览。带前缀参数时,清除光标处或当前条目的链接预览;双前缀参数时,预览缓冲区所有链接;三前缀参数时,隐藏缓冲区所有链接预览。
默认情况下,仅无描述的链接会被预览。使用数值参数 1 可强制为所有支持的链接(含带描述的链接)显示预览,切换活动区域、光标处或当前章节的所有预览。数值前缀参数 11 会切换整个缓冲区的预览。
Org mode 可在打开缓冲区时自动显示链接预览。可自定义 org-startup-with-link-previews ,或在文件中使用 ‘#+STARTUP: linkpreviews’ 关键字为该缓冲区启用预览; ‘#+STARTUP: nolinkpreviews’ 则在启动时禁用预览。
org-link-preview-refresh) ¶确保整个缓冲区的外部链接预览正常显示并刷新。
org-link-preview-refresh) ¶确保整个缓冲区的外部链接预览正常显示并刷新。
为活动区域或缓冲区的外部链接创建行内预览。带前缀参数时,同时预览带文本描述的链接。
清除活动区域或缓冲区的外部链接预览。
折叠状态切换时也可显示链接预览。当自定义选项 org-cycle-link-previews-display 启用时,子树下支持的链接类型(含图片)会自动显示。
图片是不带描述部分的图片文件链接124,例如:
./img/cat.jpg
若要为图片定义标题(见 Captions)及内部交叉引用标签(见 Internal Links),确保链接独占一行,并在其前添加 ‘CAPTION’ 和 ‘NAME’ 关键字:
#+CAPTION: This is the caption for the next figure link (or table) #+NAME: fig:SED-HR4049 [[./img/a.jpg]]
当链接预览以图片显示时,可进一步自定义图片尺寸与对齐方式。
默认情况下,Org mode 按图片实际宽度显示行内图片,但最大宽度不超过 fill-column 字符数。
你可以通过变量 org-image-actual-width (全局)或 ‘ORG-IMAGE-ACTUAL-WIDTH’ 属性(子树级别)125调整显示宽度,取值如下:
nil :插入图片时使用实际宽度,若过宽则按 org-image-max-width 限制。
#+ATTR_HTML: :width 300px
未找到则使用该数字。
nil :优先从 ‘#+ATTR.*’ 关键字获取宽度,未找到则使用原始宽度或 org-image-max-width 。
org-image-max-width 限制图片最大显示宽度,仅在未显式设置图片宽度时生效。可选设置:
fill-column 字符数。
window :限制宽度为当前窗口宽度。
nil :不限制宽度。
Org mode 可对行内图片左对齐、居中或右对齐,该设置由 org-image-align (全局)控制,仅影响独立图片(段落中除空白外无周围文本的链接)。取值如下:
left :在链接所在位置显示图片。
center :在 Emacs 窗口中居中预览链接。
right :在 Emacs 窗口中右对齐预览链接。
行内图片对齐方式可通过 ‘#+ATTR.*’ 关键字为单个链接指定,例如:
#+ATTR_HTML: :align center
Org 会读取任意 ‘#+ATTR.*’ 关键字的对齐设置,如 ‘#+ATTR_HTML’ 或 ‘#+ATTR_LATEX’ ,而 ‘#+ATTR_ORG’ (若存在)会覆盖其他设置。例如以下链接:
#+ATTR_HTML: :align right #+ATTR_ORG: :align center [[/path/to/image/file.png]]
在 Emacs 中居中显示,导出为 HTML 时右对齐。
若未设置 ‘#+ATTR_ORG’ ,行内图片对齐方式也会读取部分导出后端(如 HTML、LaTeX 和 Beamer)支持的 ‘:center’ 属性。
可以在文档特定内容前直接插入 ‘CAPTION’ 关键字,为其指定标题:
#+CAPTION: 这是下一个表格(或链接)的标题 | ... | ... | |-----+-----|
标题也可以选用如下格式:
#+CAPTION[Short caption]: Longer caption. #+CAPTION[简短标题]: 完整详细标题。
尽管图片和表格是最常见的带标题结构,但同一套标题机制也适用于其他多种内容—例如 LaTeX 公式、源代码块等。具体是否支持,取决于导出后端。
脚注以位于行首(第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) 与可选的行内定义。合法的引用格式如下:
命名脚注引用,其中 NAME 为唯一标识词,也可使用数字以便自动生成。
匿名脚注,在引用位置直接给出定义。
带名称的行内脚注定义。由于 Org 支持对同一脚注的多次引用,之后可直接使用 ‘[fn:NAME]’ 追加引用。
脚注标签可自动生成,也可手动命名。该行为由变量 org-footnote-auto-label 及对应的 ‘STARTUP’ 关键字控制,详见该变量的文档字符串。
以下命令用于操作脚注:
脚注操作命令。
光标位于脚注引用处时,跳转到对应定义;位于定义处时,跳转到第一个引用。
其他情况下则新建脚注。根据变量 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-x f 相同。
脚注标签同时也是指向对应定义或引用的链接,可使用常规链接跳转命令访问。
有时你可能需要打印笔记、将其发布到网页,或与不使用 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)
导出调度器是 Org 导出功能的主界面。它以层级菜单展示当前已配置的导出格式,选项以直观开关形式在同一界面显示。
Org 还为导出调度器提供极简提示界面。当变量 org-export-dispatch-use-expert-ui 设为非 nil 值时,Org 会在小缓冲区进行提示。按 ? 可切回层级菜单。
org-export-dispatch) ¶调用导出调度器界面,选项显示为默认设置。C-u 前缀会保留上一次导出的选项,包括子树选择范围。
Org 默认导出整个缓冲区。若 Org 缓冲区中有激活区域,则只导出该区域。
在调度器界面内,以下组合键可进一步调整导出内容与方式。
切换异步导出。异步导出使用外部 Emacs 进程及专用初始化文件在后台完成导出,不阻塞当前 Emacs。导出长文档时尤其有用。
异步导出的输出会保存在 导出栈(export stack) 中。使用双重 C-u 前缀调用导出调度器可查看该栈;若已在导出菜单中,按 & 可显示栈内容。
可以通过设置 org-export-in-background ,将异步导出设为默认行为。
可通过 org-export-async-init-file 设置后台进程使用的初始化文件。
切换仅导出正文。常用于在导出时排除页眉页脚,仅对 HTML 中 ‘<head>...</head>’ 等带头部区域的格式生效。
将 org-export-body-only 设为默认可永久开启仅导出正文。
切换强制发布导出。发布功能通常只发布变更文件(见 Triggering Publication);强制发布会忽略时间戳,直接发布所有文件。
将 org-export-force-publishing 设为默认可永久开启强制发布(与 org-publish-use-timestamps-flag 类似,但仅影响导出调度器)。
切换仅导出子树。开启后,Org 只导出调用调度器时光标所在位置起始的子树,并以该子树顶层标题作为文档标题。若光标不在标题上,使用最近的上层标题;若在文档前言部分则报错并中止导出。
将 org-export-initial-scope 设为默认可永久开启子树导出。
切换仅导出可见内容。通过调整标题可见性,只导出文档特定部分,非常实用。另见 Sparse Trees。
将 org-export-visible-only 设为默认可永久开启仅导出可见内容。
导出选项可在多处设置:全局变量;单个文件内通过缓冲区局部变量设置(见 Summary of In-Buffer Settings);单独设置关键字或用 ‘OPTIONS’ 关键字紧凑设置;子树级别通过属性设置(见 Properties and Columns)。低层级设置会覆盖高层级设置。
缓冲区设置可出现在文件任意位置,可直接书写或通过 ‘#+SETUPFILE: filename or URL’ 语法引入外部文件。针对特定后端的选项关键字集可在导出调度器(见 The Export Dispatcher)中按 # 使用 ‘插入模板(Insert template)’ 命令生成。逐个插入关键字时,建议输入 ‘#+’ 后按 M-TAB128 补全以确保正确。
所有后端通用的导出关键字及对应全局变量包括:
文档作者 (user-full-name) 。
生成输出内容的程序标识
(org-export-creator-string)。
日期或时间戳129。
邮箱地址 (user-mail-address)。
导出时用于翻译固定字符串的语言 (org-export-default-language)。例如 ‘#+LANGUAGE: fr’ 会将 ‘Table of contents’ 译为法语 ‘Table des matières’130。
选中导出的标签列表,默认 org-export-select-tags ‘("export")’ 。子树带有 ‘export’ 标签时,该子树及其下级会被导出,其余无此标签的部分忽略。
按 ‘export’ 标签选择性导出时,第一个标题前的文本不会导出。
无 ‘export’ 标签的文件会导出全部内容。
如需自定义导出标签,可全局修改 org-export-select-tags 或在文档中添加 ‘#+SELECT_TAGS: tag1 tag2’ 。
排除导出的标签列表,默认 org-export-exclude-tags ‘("noexport")’ 。子树带有 ‘noexport’ 标签时,该子树及其下级会被排除。
标记 ‘noexport’ 的条目无条件排除,即使同时带有 ‘export’ 标签。子树即使不导出,其中代码块仍会执行。
如需自定义排除标签,可全局修改 org-export-exclude-tags 或在文档中添加 ‘#+EXCLUDE_TAGS: tag1 tag2’ 。
文档标题。长标题可使用多行 ‘#+TITLE’ 。
指定输出文件名。未指定时,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-keywords 非 nil ,可通过 ‘BIND’ 关键字在导出时将 Emacs 变量设为缓冲区局部变量,语法为 ‘#+BIND: variable value’ ,适用于无法通过关键字修改的缓冲区设置。
目录包含文档中所有标题,深度与文件标题层级一致。如需修改深度或关闭目录,可设置 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’ 属性可指定目录中显示的不同名称。
导出过程中 可以插入其他文件内容。例如插入 ‘.emacs’ 文件可使用:
#+INCLUDE: "~/.emacs" src emacs-lisp
INCLUDE 关键字后有三个位置参数:
org-escape-code-in-string 转义。可使用任意块名,但以 ‘:’ 开头的块名需要加引号,如 ‘":name"’ 。
如果插入的文件未指定标记语言,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
以下命令可跳转到插入文件:
org-edit-special) ¶访问光标处的插入文件。
宏在导出时替换文本片段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(TITLE)}}}’ 、 ‘{{{keyword(AUTHOR)}}}’ 、 ‘{{{keyword(EMAIL)}}}’ 的简写。
该宏对应 ‘DATE’ 关键字。FORMAT 是 ‘date’ 宏的可选参数,仅当 ‘DATE’ 为单个时间戳时生效。FORMAT 必须是 format-time-string 能够识别的格式字符串。
这些宏分别对应文档的导出日期时间和修改日期时间。FORMAT 是 format-time-string 可以识别的字符串。如果 modification-time 宏的第二个参数不为 nil ,Org 会通过 ‘vc.el’ 从版本控制系统中获取文档的修改时间;否则,Org 将读取文件属性。
指向当前导出文件的文件名。
该宏返回当前条目中 PROPERTY-NAME 属性的值。如果 SEARCH-OPTION(见 Search Options in File Links)指向一个外部条目,则使用该外部条目的属性。
该宏用于实现自定义计数器,返回导出当前缓冲区时该宏已被展开的次数。你可以使用不同的 NAME 值创建多个计数器。若 ACTION 为 ‘-’ ,则保持计数器上一次的值不变,即不递增指定计数器。若该值为数字,则将对应计数器设为该数值。若为其他非空字符串,则将对应计数器重置为 1。你可以留空 NAME 以重置默认计数器。
此外,行内代码块(见 Structure of Code Blocks)使用专用 ‘results’ 宏标记输出,不建议用户重新定义,除非明确知晓后果。
将 org-hide-macro-markers 设为非 nil 可隐藏宏两侧的括号。
Org 在导出流程最开始执行宏展开。
以任意空白字符开头、后跟 ‘#’ 和空格的行视为注释,不会导出。
同样,注释块 ‘#+BEGIN_COMMENT’ … ‘#+END_COMMENT’ 不会导出。135
最后,在条目开头、其他关键字或优先级标记之后放置 ‘COMMENT’ 关键字,可将整个子树标记为注释。这种情况下,该子树不会被导出,其内部的代码块也不会被执行或 tangle 136。下面的命令可用于切换标题的注释状态。
org-toggle-comment) ¶切换条目开头的 ‘COMMENT’ 关键字。
ASCII 导出生成仅含纯 ASCII 字符的输出文件,是最简单直接的纯文本输出,不包含任何 Org 标记。Latin-1 和 UTF-8 导出使用对应编码标准中的额外字符与符号。三种格式均为最基础文本输出,兼容性最强。
导出时 Org 会根据 org-ascii-text-width 设置的文本宽度自动换行与对齐。
Org 以类脚注样式导出链接:描述文本保留在正文中,链接地址放在下一个标题前的注释中,详见 org-ascii-links-to-notes 。
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’ 避免数据丢失。
org-ascii-export-to-ascii), C-c C-e t L, C-c C-e t U ¶导出到临时缓冲区,不生成文件。
ASCII 导出后端额外支持一个关键字用于自定义输出,设置方式与通用选项类似(见 Export Settings)。
文档副标题。长副标题可使用多行 ‘#+SUBTITLE’ ,Org 会连续打印并自动换行。
ASCII 导出时前三层大纲转为标题,更低层级转为列表。修改层级分界点见 Export Settings。
在 Org 文件中插入仅 ASCII 后端识别的文本,可使用行内、关键字或导出块写法:
段落内的行内文本 @@ascii:and additional text@@。 #+ASCII: Some text #+BEGIN_EXPORT ascii 仅在使用 ASCII 后端导出时输出此块内容 #+END_EXPORT
ASCII 后端仅识别一个属性 ‘:width’ ,用于 指定水平分隔线的字符宽度。设置宽度的关键字与语法为:
#+ATTR_ASCII: :width 10 -----
除 ‘#+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
Org 通过 Beamer 导出功能将 Org 文件树形结构转换为高质量的交互式演示幻灯片(presentations)。 Beamer 是一种 LaTeX 文档类,用于创建 PDF、HTML 等常用格式的演示文稿。
强烈建议在阅读本章其余内容前先熟悉 Beamer 相关术语。 参见 https://en.wikipedia.org/wiki/Beamer_(LaTeX) 及其引用资料。
org-beamer-export-to-latex) ¶导出为扩展名为 ‘.tex’ 的 LaTeX 文件。若原文件为 ‘myfile.org’ , Org 将导出为 ‘myfile.tex’ ,并直接覆盖且无提示。
org-beamer-export-as-latex) ¶导出至临时缓冲区,不生成文件。
org-beamer-export-to-pdf) ¶导出为 LaTeX 文件并转换为 PDF 格式。
导出为 LaTeX 文件并转换为 PDF 格式,随后打开该 PDF 文件。
Beamer 导出后端提供若干额外关键字用于自定义 Beamer 输出。 这些关键字的用法与常规导出选项设置类似(见 Export Settings)。
Beamer 布局主题 (org-beamer-theme)。使用方括号指定选项。示例:
#+BEAMER_THEME: Rochester [height=20pt]
Beamer 字体主题。
Beamer 内部主题。
Beamer 外部主题。
插入到导言区、恰好位于 ‘hyperref’ 设置之前的任意代码行。
文档描述。长描述可使用多行 ‘DESCRIPTION’ 关键字。
默认情况下, ‘hyperref’ 会将 ‘DESCRIPTION’ 作为元数据插入。
可通过 org-latex-hyperref-template 配置文档元数据,
通过 org-latex-title-command 配置将描述排版至封面部分。
定义文档内容的关键词。必要时可使用多行 ‘KEYWORDS’ 。
默认情况下, ‘hyperref’ 会将 ‘KEYWORDS’ 作为元数据插入。
可通过 org-latex-hyperref-template 配置文档元数据,
通过 org-latex-title-command 配置将关键词排版至封面部分。
文档副标题。排版格式可通过 org-beamer-subtitle-format 字符串设置。
可通过 org-latex-hyperref-template 配置文档元数据,
通过 org-latex-title-command 配置将副标题排版至封面部分。
Org 会将标题层级转换为 Beamer 的章节元素、框架与块。 任何嵌套层级不太深的 Org 树形结构原则上均可导出为 Beamer 演示文稿。
org-beamer-frame-level 或 ‘OPTIONS’ 行中的 ‘H’ 值时(见 Export Settings),
Org 标题会转为 Beamer 框架。
若 Org 遇到 ‘BEAMER_ENV’ 属性被设为 ‘frame’ 或 ‘fullframe’ ,
则会忽略该标题所在子树的 org-beamer-frame-level 设置,
强制将对应标题转为框架。在 Beamer 术语中,全屏框架是不带标题的框架。
org-beamer-environments-default ,如需添加更多类型可参考 org-beamer-environments-extra 。
设为 ‘ignoreheading’ 时,导出时会忽略标题但保留内容, 常用于在框架之间插入内容,也可用于正确关闭 ‘column’ 环境。
若设置 ‘BEAMER_SUBTITLE’ ,其值会作为该标题对应框架的副标题导出。 该属性对未导出为框架的标题无效。
为标题设置 ‘BEAMER_ACT’ 后,导出时会将其转为叠加或动作说明。 若用方括号包裹,则作为默认叠加说明。 使用 ‘BEAMER_OPT’ 可设置适用于当前 Beamer 框架或块的任意选项, 导出后端会自动添加合适的尖括号或方括号,并对可能需要逐字环境的代码自动添加 ‘fragile’ 选项。
要在 Beamer 幻灯片中创建列,可在 Org 文件的对应标题上使用 ‘BEAMER_COL’ 属性。 将其值设为表示总文本宽度占比的小数,导出时会据此设置列宽并以该 Org 条目内容填充列。 若该条目未定义特定环境,则导出时忽略该标题;若已定义环境,则将标题作为列标题。 Beamer 导出会自动处理相邻标题对应的 LaTeX 列间距。如需手动调整特殊布局,可使用 ‘BEAMER_ENV’ 属性。
由于 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.
类似上面最后一种的行内语法,可用于为 bold 、 item 、 link 、 radio-target 、 target 等类型对象添加叠加说明。
将值用尖括号包裹并放在对象开头,示例如下:
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$.
Org Beamer 模式是专门用于快速编辑 Beamer 文档的次要模式。
#+STARTUP: beamer
org-beamer-select-environment) ¶Org Beamer 模式提供该快捷键,用于快速选择 Beamer 标准环境并设置 ‘BEAMER_COL’ 属性。
以下是一个可直接用于 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!
Org mode 包含一款 HTML 导出器,支持丰富的 HTML 格式,兼容 XHTML 1.0 严格标准。
org-html-export-to-html) ¶导出为后缀为 ‘.html’ 的 HTML 文件。对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.html’ ,覆盖时不会提示。C-c C-e h o 会导出 HTML 并在网页浏览器中打开该文件。
org-html-export-as-html) ¶导出到临时缓冲区,不会创建文件。
HTML 导出提供了若干关键字,用法与 Export Settings 中介绍的常规选项设置类似。
文档描述信息,HTML 导出器会将其作为 HTML meta 标签插入到 HTML 文件中。描述内容较长时可使用多行 ‘DESCRIPTION’ ,导出器会自动处理换行。
导出器还会包含其他若干 meta 标签,可通过修改 org-html-meta-tags 进行自定义。
指定文档类型,例如 HTML5 (org-html-doctype)。
指定用于包裹章节与元素的 HTML 容器,例如 ‘div’ (org-html-container-element)。
主页链接对应的 URL (org-html-link-home)。
已导出 HTML 页面的上级链接 URL (org-html-link-up)。
MathJax 相关选项 (org-html-mathjax-options)。MathJax 用于在 HTML 文档中排版 LaTeX 数学公式。示例见 Math formatting in HTML export。
追加到 HTML 文档头部的自定义内容
(org-html-head)。
追加到 HTML 文档头部的更多自定义内容
(org-html-head-extra)。
用于描述文档内容的关键词。HTML 导出器会将这些关键词作为 HTML meta 标签插入。关键词较长时可使用多行 ‘KEYWORDS’ 。
追加到导言区的自定义内容;在将 LaTeX 片段转码为图片时,HTML 导出器会一并使用该内容(见 Math formatting in HTML export)。
文档副标题。当文档类型为 ‘HTML5’ 且 CSS 中包含 ‘subtitle’ 类时,HTML 导出器会对副标题进行格式化。
本手册后续章节会对其中部分关键字做更详细说明。
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’ 属性。
HTML 导出器支持分别设置页眉与页脚。 org-html-preamble 默认值为 t ,表示导出器会插入页眉。格式字符串见变量 org-html-preamble-format 。
将 org-html-preamble 设置为字符串可覆盖默认格式;若设置为函数,HTML 导出器会执行该函数并将返回字符串作为页眉内容。若设为 nil ,则不生成页眉。
上述规则同样适用于 org-html-postamble 与 org-html-postamble-format 。此外, org-html-postamble 可设为 auto (默认值),导出器会自动根据作者姓名、邮箱、创建工具与日期生成页脚。
如需输出不含 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)
HTML 导出后端会将 ‘<’ 与 ‘>’ 分别转换为 ‘<’ 与 ‘>’ 。如需在 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
标题会导出为 ‘<h1>’ 、 ‘<h2>’ 等标签。每个标题的 ‘id’ 属性取自 ‘CUSTOM_ID’ 属性,若无则自动生成唯一值,详见 Internal Links。
标题可包含指向自身的链接,启用方式如下:
org-html-self-link-headlines 设置为非 nil
html-self-link-headlines 选项
#+OPTIONS: html-self-link-headlines:t
启用后,标题文本会被包裹在 ‘<a>’ 标签中,标签的 ‘href’ 属性指向标题自身,实现自链接。
HTML 导出后端会将 Org 内部链接(见 Internal Links)转换为对应的 HTML 链接,同样也会处理由无线电目标生成的自动链接(见 Radio Targets)。对于指向外部文件的 Org 链接,后端会转换为 相对路径(relative path) 。
对于指向其他 ‘.org’ 文件的链接,后端会自动将文件后缀改为 ‘.html’ 并使用相对路径。若对应 ‘.org’ 文件在同路径下存在 ‘.html’ 版本,转换后的链接可直接使用。如需禁用该自动路径转换,可将 org-html-link-org-files-as-html 设为 nil ,此时 HTML 导出后端会在输出中使用基于 ID 的链接。关于发布到目录时的文件链接详情,见 Publishing links。
Org 文件还可通过特定指令控制 HTML 导出后端。例如使用 ‘#+ATTR_HTML’ 行为 <a> 或 <img> 标签指定格式属性。下例演示了修改链接标题与样式:
#+ATTR_HTML: :title The Org mode website :style color:red; [[https://orgmode.org]]
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 时将表格首列使用表头标签格式化。
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’ 行。下例将图片右对齐,并添加 alt 与 title 属性以适配文本阅读器与现代网页无障碍标准。
#+CAPTION: A black cat stalking a spider #+ATTR_HTML: :alt cat/spider image :title Action! :align right [[./img/a.jpg]]
HTML 导出后端会原样保留 Org 文件中的 ‘http’ 链接。
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
在 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
可自定义导出文件的 CSS 样式。HTML 导出器会为文档相应部分分配以下专用 CSS 类140,你可修改这些样式,也可使用标题、表格等标准类。
p.author | 作者信息(含邮箱) |
p.date | 发布日期 |
p.creator | 创建工具信息(含 Org mode 版本) |
.title | 文档标题 |
.subtitle | 文档副标题 |
.todo | TODO 关键字,所有未完成状态 |
.done | DONE 关键字,所有已完成状态 |
.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 常量,建议使用上述更简便的自定义方式。
Sebastian Rose 专门为 Org 生成的 HTML 文件编写了一款 JavaScript 脚本,支持两种浏览方式。一种是类 Info 模式,每次只单独显示一个章节,可通过 n 与 p 等按键导航,按 ? 查看可用按键说明。另一种是折叠视图,与 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 头部会自动加入调用该脚本所需代码。选项设置语法如上,支持的选项如下:
脚本路径。默认从 https://orgmode.org/org-info.js 加载,也可使用本地副本,例如 ‘../scripts/org-info.js’ 。
页面初始显示模式,可选值:
| ‘info’ | 类 Info 界面,每页一个章节 |
| ‘overview’ | 折叠界面,初始仅显示顶层章节 |
| ‘content’ | 折叠界面,初始显示所有标题 |
| ‘showall’ | 折叠界面,显示所有标题与正文 |
Info 模式与折叠模式中独立章节的最大标题层级。默认取自 org-export-headline-levels ,即 ‘OPTIONS’ 中的 ‘H’ 开关。若该值小于 org-export-headline-levels ,单个 Info/折叠章节仍可包含子标题。
目录是否 初始 可见。即使设为 ‘nil’ ,也可通过 i 显示目录。
目录层级。默认取自变量 org-export-headline-levels 与 org-export-with-toc 。
页面 CSS 是否为 “目录(toc)” 设置固定定位?若是,目录会以章节形式展示。
是否在每个章节内显示简短子内容?设为 ‘above’ 可将该内容置于章节正文上方。
鼠标悬停在标题上时的高亮效果,默认为 ‘underline’ ,也可使用背景色如 ‘#cccccc’ 。
是否在各处显示视图切换按钮?默认 ‘nil’ ,仅显示一个切换按钮。
可通过自定义 org-infojs-options 变量设置上述选项的默认值。若希望所有页面都启用该脚本,可配置 org-export-html-use-infojs 变量。
LaTeX 导出后端可处理复杂文档,支持加载标准或自定义 LaTeX 文档类,使用不同的 LaTeX 编译引擎生成文件,并输出包含索引、参考文献与目录的完整超链接 PDF 文件,适用于在线交互式查看或高质量印刷出版。
本节会详细介绍相关细节,急于上手的用户可快速参考以下变量:编译引擎参见 org-latex-compiler ;编译流程参见 org-latex-pdf-process ;宏包相关参见 org-latex-default-packages-alist 与 org-latex-packages-alist 。
关于 LaTeX 导出后端的重要说明:其对 Org 文档中的空行敏感,因为 LaTeX 本身依靠空行区分段落等语法结构。
后续小节默认用户熟悉常用 LaTeX 术语。可访问 https://tug.org/begin.html 了解 LaTeX 基础。已安装 LaTeX 的用户也可在终端执行 ‘texdoc latex’ 打开 LaTeX 入门文档141。
org-latex-export-to-latex) ¶导出为扩展名为 ‘.tex’ 的 LaTeX 文件。若原文件为 ‘myfile.org’ ,Org 会直接导出为 ‘myfile.tex’ ,无提示覆盖已有文件。
org-latex-export-as-latex) ¶导出到临时缓冲区,不创建实际文件。
org-latex-export-to-pdf) ¶先导出为 LaTeX 文件,再转换为 PDF 文件。
导出为 LaTeX 文件并转换为 PDF,随后使用默认阅读器打开该 PDF。
将选定区域按 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。
LaTeX 导出后端提供若干额外关键字用于自定义 LaTeX 输出,使用方式与通用选项类似(参见 Export Settings)。
文档描述信息。hyperref 宏包会将描述、作者名、关键词及相关文件元数据插入输出文件。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面部分。长描述可使用多个 ‘DESCRIPTION’ 关键字。
文档主语言的语言代码。未指定 ‘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 文档类,如 article 、 report 、 book 等,包含预设导言区与标题层级映射,供 LaTeX 导出后端使用。后端从 org-latex-default-class 变量读取默认类名,Org 默认文档类为 article 。合法的默认类必须是 org-latex-classes 中的元素。
LaTeX 导出后端调用文档类时使用的选项参数。
用于生成 PDF 的编译器,如 ‘pdflatex’ 、 ‘xelatex’ 、 ‘lualatex’ ,参见 org-latex-compiler 。
向文档导言区添加的任意代码行,位于 hyperref 设置之前。可通过 org-latex-classes 调整 LaTeX 导言区的结构与顺序。
在 LaTeX 导言区前添加的任意代码行。
文档关键词。hyperref 宏包会将关键词与作者名、描述等元数据一同插入输出文件。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面。必要时可使用多行 ‘KEYWORDS’ 。
文档副标题,按 org-latex-subtitle-format 格式排版。若 org-latex-subtitle-separate 非 nil ,副标题会排在 \title 宏之外。可通过 org-latex-hyperref-template 自定义元数据项,通过 org-latex-title-command 将描述排版到文档封面。
后续小节会提供更详细说明。
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-alist 与 org-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
当现有 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
LaTeX 导出后端支持为表格内容与布局指定多种 LaTeX 属性。除设置标签(参见 Internal Links)与标题(参见 Captions)外,其他合法 LaTeX 属性包括:
LaTeX 导出后端会根据模式对表格进行不同包裹,以正确渲染数学符号。模式可选 ‘table’ 、 ‘math’ 、 ‘inline-math’ 、 ‘verbatim’ 或 ‘tabbing’ 。
若为 ‘math’ 或 ‘inline-math’ 模式,表格会被包裹在数学环境中,但单元格内容原样导出。若为 ‘tabbing’ 则使用 LaTeX tabbing 环境,并使用正确的制表符 ‘\>’ 。
LaTeX 导出后端根据 org-latex-default-table-mode 确定默认模式,并会将同一模式下的连续表格合并为单个环境。
设置 LaTeX 导出后端导出 Org 表格时使用的默认表格环境。常用 LaTeX 表格环境由以下宏包提供:tabularx、longtable、array、tabu、bmatrix。如需使用 tabularx、tabu 等宏包或其替代宏包,需将其加入 org-latex-packages-alist 变量,以便 LaTeX 导出后端在生成的 LaTeX 文件中插入对应加载语句。如需为 LaTeX 片段预览配置这些宏包,可查看 org-latex-packages-alist 的文档字符串。
使用 ‘CAPTION’ 关键字为表格设置简单标题(参见 Captions)。自定义标题可使用 ‘:caption’ 属性,直接接受原始 LaTeX 代码。 ‘:caption’ 的值会覆盖 ‘CAPTION’ 的值。
LaTeX 中的表格环境默认非浮动体。如需设为浮动对象,可将 ‘:float’ 设置为以下值之一: ‘t’ (使用默认 ‘table’ 环境)、 ‘sideways’ (使用 ‘sidewaystable’ 环境)、 ‘multicolumn’ (使用 ‘table*’ 环境使表格跨多栏)以及 ‘nil’ 。 除此之外, ‘:float’ 也可传入任意值,例如通过 LaTeX 的 ‘float’ 宏包定义的自定义浮动类型。
LaTeX 浮动体可额外设置 ‘:placement’ 布局属性,即常用的 ‘[h t b p ! H]’ 方括号内参数。注意 ‘:float sideways’ 类型的表格会忽略 ‘:placement’ 属性。
LaTeX 导出后端使用这些属性设置普通表格的对齐方式、字体与宽度。
‘:options’ 属性允许添加可选参数列表(LaTeX 导出中放在方括号内),部分表格环境(如 tabularray 宏包的 longtblr)支持该结构。示例: ‘:options remark{Note}={note},remark{Source}={source}’ 。
当 ‘:spread’ 非 nil 时,LaTeX 导出后端会针对 tabu 与 longtabu 环境按 ‘:width’ 拉伸或压缩表格。未设置 ‘:width’ 时 ‘:spread’ 无效。
三个属性均为开关。 ‘:booktabs’ 为普通表格启用现代排版增强效果,需通过 org-latex-packages-alist 加载 booktabs 宏包。 ‘:center’ 用于表格居中。 ‘:rmlines’ 仅对“table.el”表格生效,移除除首条水平线外的所有 ASCII 横线。
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}
| ... | ... |
| ... | ... |
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’ 属性设为以下值之一:
使用默认 ‘figure’ 环境。
使图片跨页面多栏,后端使用 ‘figure*’ 环境包裹。
文字环绕在图片右侧,图片占据页面左半部分。
在新页面以旋转 90 度的横向方式显示,使用 ‘sidewaysfigure’ 环境,会覆盖 ‘:placement’ 设置。
即使使用标题,也避免 ‘: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’ 宏注释掉。
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
LaTeX 导出后端根据 org-latex-src-block-backend 的值提供多种代码块渲染方式。默认值 ‘verbatim’ 以原样格式输出代码,无额外样式。其他值支持更丰富的彩色高亮,但需要额外 LaTeX 宏包( ‘listings’ 、 ‘minted’ )、系统工具( ‘minted’ )或 Emacs 包( ‘engraved’ )。详细说明参见 org-latex-src-block-backend 文档字符串。
LaTeX 导出后端可通过 ‘:float’ 与 ‘:options’ 属性将代码块设为浮动对象。 ‘:float’ 取值:
将代码块设为浮动体;默认情况下带标题的代码块均为浮动体。
使代码块跨页面多栏显示。
即使使用标题也不启用 ‘: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-options 与 org-latex-minted-options 变量。
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}
对于 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
LaTeX 导出后端根据指定的 ‘:width’ 与 ‘:thickness’ 属性转换水平线。示例:
#+ATTR_LATEX: :width .6\textwidth :thickness 0.8pt -----
LaTeX 导出后端为诗歌块支持五个属性: ‘:lines’ 、 ‘:center’ 、 ‘:versewidth’ 、 ‘:latexcode’ 与 ‘:literal’ 。前三个需要外部 LaTeX 宏包 ‘verse.sty’ ,该宏包是标准 LaTeX verse 环境的扩展。
为诗歌添加行号标注,值为整数,指定行号递增步长。
值为 ‘t’ 时,所有诗歌按排版惯例光学居中,以最长行为基准,最长行需通过 ‘:versewidth’ 属性指定。
值为文本字符串,即诗歌中最长的一行。
接受可插入 LaTeX ‘verse’ 环境内的任意 LaTeX 代码。
值为 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
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}
导出为 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:
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。
org-md-export-to-markdown) ¶导出为 Markdown 语法的文本文件。对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.md’ ,且直接覆盖不做提示。
org-md-export-as-markdown) ¶导出至临时缓冲区,不创建文件。
导出为 Markdown 语法的文本文件并打开。
依据 org-md-headline-style 的设置,Markdown 导出可生成 atx 与 setext 两种类型的标题。 setext 仅支持两级标题,而 atx 支持六级标题。 mixed 模式会将一级、二级标题以 setext-样式导出,三至六级标题以 atx-样式导出。超出上述层级限制时,导出后端会将标题转换为列表。可在绝对限制之前设置层级上限(参见 Export Settings)。
ODT 导出后端用于生成开放文档文本(ODT)格式文件。该导出器创建的文档遵循 OpenDocument-v1.2 specification144,且与 LibreOffice 3.4 兼容。
ODT 导出后端依赖 zip 程序生成最终的压缩 ODT 输出。请检查本地是否存在可用且可执行的 ‘zip’ 工具,缺少该工具则导出无法完成。
org-odt-export-to-odt) ¶导出为开放文档文本文件。
若指定了 org-odt-preferred-output-format ,ODT 导出后端会自动将导出文件转换为该格式。
对于 ‘myfile.org’ ,Org 会导出为 ‘myfile.odt’ ,直接覆盖不做提示。仅当选中区域时,ODT 导出后端才会只导出该区域。
若选中区域为单个树形结构,ODT 导出后端会将该树形结构的标题设为文档标题。顺带一提,C-c @ 可选中当前子树。若该树形结构标题拥有或继承 ‘EXPORT_FILE_NAME’ 属性,ODT 导出后端会使用该属性值作为文件名。
导出为开放文档文本文件并打开生成的文件。
若指定了 org-export-odt-preferred-output-format ,则打开转换后的文件。参见 Automatically exporting to other formats。
ODT 导出后端提供若干额外关键字用于自定义 ODT 输出。这些关键字的设置方式与通用选项类似(参见 Export Settings)。
文档描述信息,ODT 导出后端会将其作为文档元数据插入。长描述可使用多行以 ‘DESCRIPTION’ 开头的内容。
文档关键词。ODT 导出后端会将描述、作者名、关键词及相关文件元数据一同插入输出文件的元数据中。必要时可使用多行 ‘KEYWORDS’ 。
ODT 导出后端默认使用 org-odt-styles-file 。详细说明参见 Applying custom styles。
文档副标题。
ODT 导出后端可借助专用 ODT 转换程序,生成除 ODT 外的其他格式文档。其通用接口可对接主流转换工具,生成 ‘doc’ 等格式,或将文档从一种格式(如 ‘csv’ )转换为另一种格式(如 ‘xls’ )。
可自定义 org-odt-convert-process 变量指向 ‘unoconv’ ,这是 ODT 推荐的转换工具。正常安装的 LibreOffice 通常已自带 ‘unoconv’ ,也可替换为其他转换工具。参见 Configuring a document converter。
若 ODT 格式仅作为生成 ‘doc’ 、 ‘docx’ 、 ‘rtf’ 、 ‘pdf’ 等格式的中间步骤,可扩展 ODT 导出后端直接生成目标格式。在 org-odt-preferred-output-format 变量中指定最终格式即可,这是扩展方式之一(参见 ODT export commands)。
Org 导出后端可与各类文本文档格式转换工具协同工作。新一代转换工具如 LibreOffice、Pandoc 可同时支持数百种格式,Org 能与已安装的任意转换工具保持一致的交互方式。以下是通用命令:
将现有文档从一种格式转换为另一种格式。携带前缀参数时,会打开新生成的文件。
ODT 导出后端内置多种开放文档样式(参见 Working with OpenDocument style files)。如需扩展或进一步自定义内置样式表,可直接编辑样式表,或使用 LibreOffice 等应用生成。以下示例展示通过 LibreOffice 创建样式的方法。
#+OPTIONS: H:10 num:t
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"))
ODT 导出后端依赖大量模板与样式名称,使用第三方样式和模板可能导致不兼容。基于内置 ODT 模板与样式衍生的模板通常问题更少。
ODT 导出器会为内部链接创建原生交叉引用,为其他所有链接创建互联网风格链接。
无描述且指向常规非项目符号大纲标题的链接,会被替换为该标题的交叉引用与章节编号。
指向图片、表格等的 ‘\ref{label}’ 格式引用,会被替换为对应标注对象的交叉引用与序号。参见 Labels and captions 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。
ODT 导出后端会处理 Org 文件中不含描述的图片链接,例如 ‘[[file:img.jpg]]’ 或 ‘[[./img.jpg]]’ , 在最终输出中直接插入图片。以下两种写法均可生效:
[[file:img.png]]
[[./img.png]]
若要创建可点击的图片,需使用一个链接,其描述部分为指向图片文件的另一个链接。 例如,插入图片 ‘org-mode-unicorn.png’ ,点击后跳转到 https://orgmode.org 网站,写法如下:
[[https://orgmode.org][./org-mode-unicorn.png]]
通过 ‘ATTR_ODT’ 属性控制嵌入图片的尺寸与缩放比例。
ODT 导出后端会先确定图片在最终文档中的尺寸,该尺寸以厘米为单位。
随后后端会查询图片文件的像素尺寸,此过程依赖 ImageMagick 的 identify 程序,
或 Emacs 的 create-image 与 image-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]]
ODT 导出后端支持将图片锚定到 ‘as-char’ 、 ‘paragraph’ 或 ‘page’ 。 可通过 ‘ATTR_ODT’ 行中的 ‘:anchor’ 属性设置锚定方式。
创建锚定到页面的图片:
#+ATTR_ODT: :anchor page [[./img.png]]
ODT 导出工具对数学公式有专门支持。
LaTeX 数学公式片段(见 LaTeX fragments)可通过以下方式嵌入 ODT 文档:
在 Org 文件中添加以下行,该选项按单个文件生效。
#+OPTIONS: tex:t
启用该选项后,LaTeX 片段会先通过外部 LaTeX 转 MathML 转换工具转为 MathML 片段, 再以开放文档公式形式嵌入导出文档。
可通过自定义变量 org-latex-to-mathml-convert-command 与 org-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")
或改用 LaTeXML146:
(setq org-latex-to-mathml-convert-command
"latexmlmath %i --presentationmathml=%o")
快速验证 LaTeX 转 MathML 工具可靠性的命令:
将 LaTeX 数学公式片段转换为开放文档公式( ‘.odf’ )文件。
将 LaTeX 数学公式片段转换为开放文档公式( ‘.odf’ )文件, 并使用系统默认应用打开该文件。
在 Org 文件中添加以下行,该选项按单个文件生效。
#+OPTIONS: tex:dvipng
#+OPTIONS: tex:dvisvgm
或
#+OPTIONS: tex:imagemagick
该模式下,LaTeX 片段会被处理为 PNG 或 SVG 图片并嵌入导出文档, 此方法需要安装 dvipng、dvisvgm 或 ImageMagick 工具。
若直接在 ODT 文档中嵌入 LaTeX 数学公式不稳定,可尝试另一种方式: 通过链接引入公式对应的 MathML( ‘.mml’ )源码或开放文档公式( ‘.odf’ )文件,示例如下:
[[./equation.mml]]
或
[[./equation.odf]]
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
ODT 导出后端支持原样示例(见 Literal Examples)并完整保留语法高亮。 内部实现上,ODT 导出后端依赖 ‘htmlfontify.el’ 生成精美代码清单所需的样式定义, 自动生成的样式以 ‘OrgSrc’ 为前缀,并继承 Emacs 语法高亮库对对应语言所用文本的视觉样式的颜色。
如需自定义语法高亮样式,可自定义 org-odt-create-custom-styles-for-srcblocks 选项。
如需关闭原样示例的语法高亮,可自定义 org-odt-fontify-srcblocks 选项。
ODT 导出后端提供丰富功能,适用于高级用户与高频 ODT 格式使用场景。
ODT 导出后端可直接适配主流转换工具,几乎无需额外配置(见 Extending ODT export)。 以下内容适用于不被支持的转换工具或调整默认配置的场景。
将转换工具名称添加到变量 org-odt-convert-processes ,
同时需指定该工具的命令行调用方式,详见该变量文档字符串。
通过自定义变量 org-odt-convert-capabilities 指定转换工具可处理的格式,
可参考该变量默认值配置新工具,详情见其文档字符串。
通过自定义选项 org-odt-convert-process ,将新添加的转换工具设为首选工具。
本节介绍 ODT 导出工具的内部实现:生成带样式文档的方式,以及自动样式与自定义开放文档样式的使用。
ODT 导出工具生成输出依赖两个文件,
这些文件随发行版一同分发,存放路径由变量 org-odt-styles-dir 指定。两个文件分别为:
该文件内容会并入最终 ODT 文档的 =styles.xml=, 会在以下场景被修改:
该文件内容会并入最终 ODT 文档的 ‘content.xml’ , Org 大纲内容会插入到文件的 ‘<office:text>’ … ‘</office:text>’ 元素之间。
除作为最终 ‘content.xml’ 的模板外,该文件还用于:
以下两个变量控制 ODT 导出工具读取自定义样式与内容模板文件的路径, 自定义这些变量可覆盖导出工具的默认样式。
org-odt-styles-fileODT 导出后端使用该变量指向的文件(如 ‘styles.xml’ )生成最终输出, 可接受以下取值:
使用该文件替代默认 ‘styles.xml’ 。
使用指定开放文档文本或模板文件中包含的 ‘styles.xml’ 。
使用指定开放文档文本或模板文件中的 ‘styles.xml’ , 同时提取指定成员文件并嵌入最终 ODT 文档。
当 ‘styles.xml’ 引用页眉、页脚图片等附加文件时适用此选项。
nil使用默认 ‘styles.xml’ 。
org-odt-content-template-file使用该变量指定最终输出中使用的空白 ‘content.xml’ 。
ODT 导出后端可读取 Org 文件中嵌入的原生开放文档 XML 代码, 此类直接格式化方式适用于临时单次使用场景。
使用 ‘@@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>
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>
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
通过 ‘#+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’ 部分找到。 添加新模板需在此处定义新样式。
使用该功能的步骤:
表格模板是针对以下表格单元格类别的 ‘table-cell’ 与 ‘paragraph’ 样式集合:
上述样式名称需根据表格模板名称按固定规则命名。
以名为 ‘Custom’ 的表格模板为例,所需样式名称如下表:
| 单元格类型 | 单元格样式 | 段落样式 |
|---|---|---|
| Body | ‘CustomTableCell’ | ‘CustomTableParagraph’ |
| First column | ‘CustomFirstColumnTableCell’ | ‘CustomFirstColumnTableParagraph’ |
| Last column | ‘CustomLastColumnTableCell’ | ‘CustomLastColumnTableParagraph’ |
| First row | ‘CustomFirstRowTableCell’ | ‘CustomFirstRowTableParagraph’ |
| Last row | ‘CustomLastRowTableCell’ | ‘CustomLastRowTableParagraph’ |
| Even row | ‘CustomEvenRowTableCell’ | ‘CustomEvenRowTableParagraph’ |
| Odd row | ‘CustomOddRowTableCell’ | ‘CustomOddRowTableParagraph’ |
| Even column | ‘CustomEvenColumnTableCell’ | ‘CustomEvenColumnTableParagraph’ |
| Odd column | ‘CustomOddColumnTableCell’ | ‘CustomOddColumnTableParagraph’ |
创建名为 ‘Custom’ 的表格模板,需在内容模板文件(见 默认样式) 的 ‘<office:automatic-styles>’ … ‘</office:automatic-styles>’ 元素中定义上述样式。
定义表格样式需在变量 org-odt-table-styles 中添加条目,并指定:
例如下方条目基于同一模板 ‘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))))))
在 ‘ATTR_ODT’ 行中指定步骤 (2) 中创建的表格样式,示例如下:
#+ATTR_ODT: :style TableWithHeaderRowAndColumn | Name | Phone | Age | | Peter | 1234 | 17 | | Anna | 4321 | 25 |
有时 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 。
org 导出后端会在当前缓冲区中生成 Org 文档的标准化版本。 导出器会执行 Babel 代码(参见 Evaluating Code Blocks),并移除专属于其他后端的内容。
org-org-export-to-org) ¶导出为扩展名为 ‘.org’ 的 Org 文件。若原文件为 ‘myfile.org’ , 则会导出为 ‘myfile.org.org’ ,且无提示直接覆盖。
导出为 Org 文件并打开该文件。
org-texinfo-export-to-texinfo) ¶导出为扩展名为 ‘.texi’ 的 Texinfo 文件。若原文件为 ‘myfile.org’ , 则会导出为 ‘myfile.texi’ ,且无提示直接覆盖。
org-texinfo-export-to-info) ¶先导出为 Texinfo 格式,再处理生成 Info 文件。
若要生成 DocBook 等其他格式,可自定义 org-texinfo-info-process 变量。
Texinfo 导出后端提供若干额外关键字,用于自定义 Texinfo 输出内容。 这些关键字的设置方式与通用选项类似(参见 Export Settings)。
文档副标题。
文档的其他作者。
Texinfo 文件名。
默认文档类 (org-texinfo-default-class),
该值必须是 org-texinfo-classes 中的成员。
在文件头部末尾插入的任意内容行。
在文件头部结束后插入的任意内容行。
文档在目录中的分类,默认为 Misc 。
文档在目录中的名称。
该名称为短名称,在主 Info 目录中可通过 m 命令查找到对应手册。
默认使用 Texinfo 文件的基础名。
Texinfo 条目的完整格式为 * DIRNAME: NODE. ,其中 NODE 通常为 (FILENAME) 。
该选项一般只设置 DIRNAME 部分;如需更精细控制,也可直接填写完整条目
(通过包含括号或开头的 ~* ~ 识别)。
文档在目录中的描述,默认使用文档标题。
文档打印版标题。
Texinfo 后端在生成文件头部后,会自动为 Info 文件生成名称与目标路径。 如需指定更合理的路径与名称以覆盖默认设置,可使用 ‘TEXINFO_FILENAME’ 关键字。
除输出文件名外,Texinfo 头部还包含语言信息(参见 Export Settings)
与 org-texinfo-coding-system 变量设定的编码系统。
如需在头部添加其他命令,可插入 ‘TEXINFO_HEADER’ 关键字,示例如下:
#+TEXINFO_HEADER: @synindex
若不想重复设置同一组命令,可在 org-texinfo-classes 中定义一次类,
然后在文档中通过 ‘TEXINFO_CLASS’ 关键字指定该类以启用。
纸质输出的默认模板包含带有 ‘TITLE’ 与 ‘AUTHOR’ 关键字的标题页(参见 Export Settings)。 如需为打印版替换默认标题,可使用 ‘TEXINFO_PRINTED_TITLE’ 与 ‘SUBTITLE’ 关键字。 两者均需填写原始 Texinfo 代码来设置值。
若一行 ‘AUTHOR’ 不足以列出所有作者,可添加多个 ‘SUBAUTHOR’ 关键字, 其值同样需为原始 Texinfo 代码。
#+AUTHOR: Jane Smith
#+SUBAUTHOR: John Doe
#+TEXINFO_PRINTED_TITLE: This Long Title@@inlinefmt{tex,@*} Is Broken in @TeX{}
版权声明内容需在带有非 nil ‘COPYING’ 属性的专用标题下定义。
导出后端会将该部分内容放入文档开头的 ‘@copying’ 命令中,
该标题本身不会出现在文档结构中。
版权信息会打印在标题页背面。
* Legalese :PROPERTIES: :COPYING: t :END: This is a short example of a complete Texinfo file, version 1.0. Copyright \copy 2016 Free Software Foundation, Inc.
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
Texinfo 导出后端使用预设规则将 Org 标题转换为对应 Texinfo 结构命令。
该规则会将顶层标题映射为标记为 @chapter 的带编号章节,
将下级标题映射为标记为 @unnumbered 的无编号章节。
如需覆盖该映射并使用 @part 或其他 Texinfo 结构命令,
可在 org-texinfo-classes 中定义新类,并通过 ‘TEXINFO_CLASS’ 关键字启用。
若未定义并启用新类,则默认使用 org-texinfo-default-class 。
若某个 Org 标题级别未关联对应的 Texinfo 结构命令, 或低于指定阈值(参见 Export Settings), Texinfo 导出后端会将其转换为列表项。
Texinfo 导出后端会将任意带有非 nil ‘APPENDIX’ 属性的标题转为附录,
该行为与 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。
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:
可使用以下三种方式之一插入或转义原始 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
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
括号中的命令为可选内容,写法如上所示。
导出表格时,Texinfo 导出后端会使用每一列中最宽单元格的宽度。若要覆盖该行为,改用行宽比例指定列宽,可使用 ‘:columns’ 属性。示例如下。
#+ATTR_TEXINFO: :columns .5 .5 | a cell | another cell |
在 Org 文件中插入图片的文件链接,Texinfo 导出后端便会嵌入该图片。链接需使用常规支持的图片扩展名,且不附带描述。如需缩放图片,可使用 ‘:width’ 与 ‘:height’ 属性。替代文本可通过 ‘:alt’ 属性指定,文本内容使用 Texinfo 代码编写,示例如下:
#+ATTR_TEXINFO: :width 1in :alt Alternate @i{text}
[[ridt.pdf]]
可在引用块中编写引用文本(见 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
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}}.
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
以下是更完整的 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:
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-deadline 、 org-icalendar-use-scheduled 与 org-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 唯一,同时便于同步程序追溯关联关系。
org-icalendar-export-to-ics) ¶从当前 Org 缓冲区生成 iCalendar 条目,并保存至同一目录下,文件扩展名为 ‘.ics’ 。
org-icalendar-export-agenda-files) ¶从 org-agenda-files 中的 Org 文件生成 iCalendar 条目,并为每个 Org 文件单独保存为 iCalendar 文件。
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 标准定义了三种可见级别:
条目公开可见(默认值)。
仅限定客户端可访问该事件。
仅所有者可获取该条目。
服务器应将未知类别属性视为 ‘PRIVATE’ 。
导出的 iCalendar 文件可告知客户端检查更新的频率。该时长可通过变量 org-icalendar-ttl 全局设置,或通过 ‘ICAL-TTL’ 关键字为单个文档设置。该选项需使用 iCalendar 时长格式配置,更多细节参见 org-icalendar-ttl 的文档字符串。
导出为 iCalendar 格式在很大程度上依赖目标应用的支持能力,不同应用的兼容程度存在差异。特定应用的使用建议可参考 Org 模式常见问题解答。
Org 内置的其他导出后端包括:
如需激活此类后端,可自定义 org-export-backends ,或通过 ‘(require 'ox-man)’ 直接加载。加载成功后,后端会在导出调度器中添加新按键(见 The Export Dispatcher)。
使用方法与配置细节可参考对应文件的注释部分,例如 ‘ox-man.el’ 。
导出过程会在实际导出开始前执行两个钩子。第一个钩子 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)
过滤器是应用于指定后端特定部分的函数列表。过滤器中第一个函数的输出会传递给下一个函数,最终输出为过滤器中最后一个函数的结果。
Org 导出过程拥有许多适用于不同类型对象、纯文本、语法树、导出选项和最终输出格式的过滤器集。过滤器以元素类型或对象类型命名:~org-export-filter-TYPE-functions~ ,其中 TYPE 为过滤器的目标类型。有效类型包括:
| body | bold | babel-call |
| center-block | clock | code |
| diary-sexp | drawer | dynamic-block |
| entity | example-block | export-block |
| export-snippet | final-output | fixed-width |
| footnote-definition | footnote-reference | headline |
| horizontal-rule | inline-babel-call | inline-src-block |
| inlinetask | italic | item |
| keyword | latex-environment | latex-fragment |
| line-break | link | node-property |
| options | paragraph | parse-tree |
| plain-list | plain-text | planning |
| property-drawer | quote-block | radio-target |
| section | special-block | src-block |
| statistics-cookie | strike-through | subscript |
| superscript | table | table-cell |
| table-row | target | timestamp |
| underline | verbatim | verse-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 )。
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
Org 模式导出是一个多步骤过程,基于缓冲区的临时副本进行操作。导出过程包含 4 个主要步骤:
处理源 Org 缓冲区的临时副本 151:
org-export-before-processing-functions (见 Export hooks);
org-export-replace-macros 为 nil;
org-export-use-babel 非空(默认值)时,处理代码块:
解析临时缓冲区,创建 AST:
org-export-before-parsing-functions (见 Export hooks)。钩子函数仍可修改缓冲区;
org-org-with-cite-processors 非空(默认值)时,确定相关参考文献并记录到导出选项中(见 Citations)。整个缓冲区都会被纳入考量;
org-export-filter-options-functions ;
(org-data ... (heading (section (paragraph (plain-text) (bold (plain-text)))) (heading) (heading (section ...))))
在此步骤之后,对临时缓冲区的修改将不再影响导出;Org 导出仅基于 AST 进行操作;
:with-special-rows 导出选项设为非空(见 Column Width and Alignment);
org-export-filter-parse-tree-functions 。这些函数可通过副作用修改 AST;
org-org-with-cite-processors 非空(默认值)时,根据所选引用导出处理器的规则替换引用 AST 节点和 ‘#+print_bibliography’ 关键字 AST 节点(见 Citation export processors)。
通过深度优先遍历 AST 节点,将 AST 转换为文本:
对导出文本进行后处理:
org-export-filter-body-functions ;
org-org-with-cite-processors 非空(默认值)时,根据引用导出处理器规则添加参考文献元数据;
org-export-filter-final-output-functions 。
转换过程的部分内容可针对特定元素进行扩展,以引入新的或修改后的转换规则。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。
部分导出后端包含将 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。
Org 包含一套发布管理系统,可让你配置由相互关联的 Org 文件组成的 项目(projects) ,实现自动转换为 HTML。你还可以配置 Org,将导出的 HTML 页面及相关附件(如图片、源代码文件)自动上传至网页服务器。
你也可以使用 Org 将文件转换为 PDF,甚至同时进行 HTML 与 PDF 转换,让文件在服务器上以两种格式提供。
该发布功能由 David O’Toole 贡献给 Org。
发布需要进行大量配置,以指定项目的文件、目标路径及诸多其他属性。
org-publish-project-alistorg-publish-project-alist ¶发布的配置几乎完全通过设置一个名为 org-publish-project-alist 的变量完成。该列表中的每一项配置一个项目,可采用以下两种形式之一:
("project-name" :property value :property value ...)
即格式规范、键值交替出现的属性列表;或者:
("project-name" :components ("project-name" "project-name" ...))
两种形式均通过指定属性值来配置项目。一个项目定义了待发布的文件集合,以及发布这些文件时使用的发布配置。
当项目采用上述第二种形式时, :components 属性中的各个成员视为子项目,用于归类需要不同发布选项的文件。
发布此类 “元项目(meta-project)” 时,所有子组件会按给定顺序一并发布。
大部分属性为可选,但部分属性建议始终设置。尤其需要让 Org 知晓源文件的查找位置,以及发布文件的存放位置。
:base-directory存放发布源文件的目录。
:publishing-directory输出文件的发布目录。你可以使用 Emacs tramp 包适用的文件名语法,直接发布至网页服务器;也可以先发布到本地目录,再通过外部工具上传网站(参见 Uploading Files)。
:preparation-function发布流程开始前调用的函数或函数列表,例如运行 ‘make’ 更新待发布文件。每个预处理函数均接收单个参数:项目属性列表。
:completion-function发布流程结束后调用的函数或函数列表,例如修改生成文件的权限。每个完成函数均接收单个参数:项目属性列表。
默认情况下,基础目录下所有扩展名为 ‘.org’ 的文件均视为项目的一部分。可通过设置以下属性修改该行为:
:base-extension源文件的扩展名(不含点),实际为正则表达式。若需包含 :base-directory 下所有文件(包括无扩展名文件),可将其设为符号 any 。
:exclude用于匹配不应发布的文件名的正则表达式,即便这些文件符合扩展名筛选条件。
:include无论 :base-extension 与 :exclude 如何设置,均强制包含的文件列表。
:recursive非 nil 表示递归遍历基础目录,查找待发布文件。
发布指将文件复制到目标目录,并可在过程中进行格式转换。默认转换是将 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.html’154。
图片等其他文件仅需复制至发布目标,可使用 org-publish-attachment 实现。对于非 Org 文件,必须指定发布函数:
:publishing-function执行文件发布的函数,也可以是函数列表,所有函数会依次调用。
:htmlized-source非 nil 表示发布源文件的网页化版本。
该函数必须接收三个参数:至少包含 :publishing-directory 属性的属性列表、待发布文件名,以及输出文件的发布目录路径。
函数需读取指定文件,按需执行转换,并将结果写入目标文件夹。
属性列表可用于为 HTML 与 LaTeX 导出器设置多项导出选项。多数情况下,这些属性对应 Org 中的用户变量。 下表列出这些属性及其关联的变量,详情参见对应变量的文档字符串。
当在 org-publish-project-alist 中为属性赋值时,发布过程中该设置会覆盖对应用户变量的值(若存在)。
而文件内部设置的选项(参见 Export Settings)优先级最高,会覆盖所有其他设置。
:author | user-full-name |
:email | user-mail-address |
:language | org-export-default-language |
:select-tags | org-export-select-tags |
:exclude-tags | org-export-exclude-tags |
:creator | org-export-creator-string |
:headline-levels | org-export-headline-levels |
:preserve-breaks | org-export-preserve-breaks |
:section-numbers | org-export-with-section-numbers |
:time-stamp-file | org-export-timestamp-file |
:with-archived-trees | org-export-with-archived-trees |
:with-author | org-export-with-author |
:expand-links | org-export-expand-links |
:with-broken-links | org-export-with-broken-links |
:with-clocks | org-export-with-clocks |
:with-creator | org-export-with-creator |
:with-date | org-export-with-date |
:with-drawers | org-export-with-drawers |
:with-email | org-export-with-email |
:with-emphasize | org-export-with-emphasize |
:with-entities | org-export-with-entities |
:with-fixed-width | org-export-with-fixed-width |
:with-footnotes | org-export-with-footnotes |
:with-inlinetasks | org-export-with-inlinetasks |
:with-latex | org-export-with-latex |
:with-planning | org-export-with-planning |
:with-priority | org-export-with-priority |
:with-properties | org-export-with-properties |
:with-smart-quotes | org-export-with-smart-quotes |
:with-special-strings | org-export-with-special-strings |
:with-statistics-cookies | org-export-with-statistics-cookies |
:with-sub-superscript | org-export-with-sub-superscripts |
:with-toc | org-export-with-toc |
:with-tables | org-export-with-tables |
:with-tags | org-export-with-tags |
:with-tasks | org-export-with-tasks |
:with-timestamps | org-export-with-timestamps |
:with-title | org-export-with-title |
:with-todo-keywords | org-export-with-todo-keywords |
:with-cite-processors | org-export-process-citations |
:cite-export | org-cite-export-processors |
:ascii-bullets | org-ascii-bullets |
:ascii-caption-above | org-ascii-caption-above |
:ascii-charset | org-ascii-charset |
:ascii-global-margin | org-ascii-global-margin |
:ascii-format-drawer-function | org-ascii-format-drawer-function |
:ascii-format-inlinetask-function | org-ascii-format-inlinetask-function |
:ascii-headline-spacing | org-ascii-headline-spacing |
:ascii-indented-line-width | org-ascii-indented-line-width |
:ascii-inlinetask-width | org-ascii-inlinetask-width |
:ascii-inner-margin | org-ascii-inner-margin |
:ascii-links-to-notes | org-ascii-links-to-notes |
:ascii-list-margin | org-ascii-list-margin |
:ascii-paragraph-spacing | org-ascii-paragraph-spacing |
:ascii-quote-margin | org-ascii-quote-margin |
:ascii-table-keep-all-vertical-lines | org-ascii-table-keep-all-vertical-lines |
:ascii-table-use-ascii-art | org-ascii-table-use-ascii-art |
:ascii-table-widen-columns | org-ascii-table-widen-columns |
:ascii-text-width | org-ascii-text-width |
:ascii-underline | org-ascii-underline |
:ascii-verbatim-format | org-ascii-verbatim-format |
:headline-levels | org-beamer-frame-level |
:beamer-subtitle-format | org-beamer-subtitle-format |
:beamer-column-view-format | org-beamer-column-view-format |
:beamer-theme | org-beamer-theme |
:beamer-environments-extra | org-beamer-environments-extra |
:beamer-frame-default-options | org-beamer-frame-default-options |
:beamer-outline-frame-options | org-beamer-outline-frame-options |
:beamer-outline-frame-title | org-beamer-outline-frame-title |
:html-doctype | org-html-doctype |
:html-container | org-html-container-element |
:html-content-class | org-html-content-class |
:html-html5-fancy | org-html-html5-fancy |
:html-link-use-abs-url | org-html-link-use-abs-url |
:html-link-home | org-html-link-home |
:html-link-up | org-html-link-up |
:html-equation-reference-format | org-html-equation-reference-format |
:html-postamble | org-html-postamble |
:html-preamble | org-html-preamble |
:html-head | org-html-head |
:html-head-extra | org-html-head-extra |
:html-head-include-default-style | org-html-head-include-default-style |
:html-head-include-scripts | org-html-head-include-scripts |
:html-allow-name-attribute-in-anchors | org-html-allow-name-attribute-in-anchors |
:html-divs | org-html-divs |
:html-checkbox-type | org-html-checkbox-type |
:html-extension | org-html-extension |
:html-footnote-format | org-html-footnote-format |
:html-footnote-separator | org-html-footnote-separator |
:html-footnotes-section | org-html-footnotes-section |
:html-format-drawer-function | org-html-format-drawer-function |
:html-format-headline-function | org-html-format-headline-function |
:html-format-inlinetask-function | org-html-format-inlinetask-function |
:html-home/up-format | org-html-home/up-format |
:html-indent | org-html-indent |
:html-infojs-options | org-html-infojs-options |
:html-infojs-template | org-html-infojs-template |
:html-inline-image-rules | org-html-inline-image-rules |
:html-link-org-files-as-html | org-html-link-org-files-as-html |
:html-mathjax-options | org-html-mathjax-options |
:html-mathjax-template | org-html-mathjax-template |
:html-metadata-timestamp-format | org-html-metadata-timestamp-format |
:html-postamble-format | org-html-postamble-format |
:html-preamble-format | org-html-preamble-format |
:html-prefer-user-labels | org-html-prefer-user-labels |
:html-self-link-headlines | org-html-self-link-headlines |
:html-table-align-individual-fields | org-html-table-align-individual-fields |
:html-table-caption-above | org-html-table-caption-above |
:html-table-data-tags | org-html-table-data-tags |
:html-table-header-tags | org-html-table-header-tags |
:html-table-use-header-tags-for-first-column | org-html-table-use-header-tags-for-first-column |
:html-tag-class-prefix | org-html-tag-class-prefix |
:html-text-markup-alist | org-html-text-markup-alist |
:html-todo-kwd-class-prefix | org-html-todo-kwd-class-prefix |
:html-toplevel-hlevel | org-html-toplevel-hlevel |
:html-use-infojs | org-html-use-infojs |
:html-validation-link | org-html-validation-link |
:html-viewport | org-html-viewport |
:html-inline-images | org-html-inline-images |
:html-table-attributes | org-html-table-default-attributes |
:html-table-row-open-tag | org-html-table-row-open-tag |
:html-table-row-close-tag | org-html-table-row-close-tag |
:html-xml-declaration | org-html-xml-declaration |
:html-wrap-src-lines | org-html-wrap-src-lines |
:html-klipsify-src | org-html-klipsify-src |
:html-klipse-css | org-html-klipse-css |
:html-klipse-js | org-html-klipse-js |
:html-klipse-selection-script | org-html-klipse-selection-script |
:creator | org-html-creator-string |
:with-latex | org-html-with-latex |
:latex-class | org-latex-default-class |
:latex-active-timestamp-format | org-latex-active-timestamp-format |
:latex-caption-above | org-latex-caption-above |
:latex-classes | org-latex-classes |
:latex-default-figure-position | org-latex-default-figure-position |
:latex-default-table-environment | org-latex-default-table-environment |
:latex-default-quote-environment | org-latex-default-quote-environment |
:latex-default-table-mode | org-latex-default-table-mode |
:latex-default-footnote-command | org-latex-default-footnote-command |
:latex-diary-timestamp-format | org-latex-diary-timestamp-format |
:latex-engraved-options | org-latex-engraved-options |
:latex-engraved-preamble | org-latex-engraved-preamble |
:latex-engraved-theme | org-latex-engraved-theme |
:latex-footnote-defined-format | org-latex-footnote-defined-format |
:latex-footnote-separator | org-latex-footnote-separator |
:latex-format-drawer-function | org-latex-format-drawer-function |
:latex-format-headline-function | org-latex-format-headline-function |
:latex-format-inlinetask-function | org-latex-format-inlinetask-function |
:latex-hyperref-template | org-latex-hyperref-template |
:latex-image-default-scale | org-latex-image-default-scale |
:latex-image-default-height | org-latex-image-default-height |
:latex-image-default-option | org-latex-image-default-option |
:latex-image-default-width | org-latex-image-default-width |
:latex-images-centered | org-latex-images-centered |
:latex-inactive-timestamp-format | org-latex-inactive-timestamp-format |
:latex-inline-image-rules | org-latex-inline-image-rules |
:latex-link-with-unknown-path-format | org-latex-link-with-unknown-path-format |
:latex-src-block-backend | org-latex-src-block-backend |
:latex-listings-langs | org-latex-listings-langs |
:latex-listings-options | org-latex-listings-options |
:latex-listings-src-omit-language | org-latex-listings-src-omit-language |
:latex-minted-langs | org-latex-minted-langs |
:latex-minted-options | org-latex-minted-options |
:latex-prefer-user-labels | org-latex-prefer-user-labels |
:latex-subtitle-format | org-latex-subtitle-format |
:latex-subtitle-separate | org-latex-subtitle-separate |
:latex-table-scientific-notation | org-latex-table-scientific-notation |
:latex-tables-booktabs | org-latex-tables-booktabs |
:latex-tables-centered | org-latex-tables-centered |
:latex-text-markup-alist | org-latex-text-markup-alist |
:latex-title-command | org-latex-title-command |
:latex-toc-command | org-latex-toc-command |
:latex-compiler | org-latex-compiler |
:latex-use-sans | org-latex-use-sans |
:md-footnote-format | org-md-footnote-format |
:md-footnotes-section | org-md-footnotes-section |
:md-headline-style | org-md-headline-style |
:md-toplevel-hlevel | org-md-toplevel-hlevel |
:md-link-org-files-as-md | org-md-link-org-files-as-md |
:odt-styles-file | org-odt-styles-file |
:odt-with-forbidden-chars | org-odt-with-forbidden-chars |
:odt-content-template-file | org-odt-content-template-file |
:odt-display-outline-level | org-odt-display-outline-level |
:odt-fontify-srcblocks | org-odt-fontify-srcblocks |
:odt-format-drawer-function | org-odt-format-drawer-function |
:odt-format-headline-function | org-odt-format-headline-function |
:odt-format-inlinetask-function | org-odt-format-inlinetask-function |
:odt-inline-formula-rules | org-odt-inline-formula-rules |
:odt-inline-image-rules | org-odt-inline-image-rules |
:odt-pixels-per-inch | org-odt-pixels-per-inch |
:odt-table-styles | org-odt-table-styles |
:odt-use-date-fields | org-odt-use-date-fields |
:with-latex | org-odt-with-latex |
:texinfo-class | org-texinfo-default-class |
:texinfo-classes | org-texinfo-classes |
:texinfo-format-headline-function | org-texinfo-format-headline-function |
:texinfo-node-description-column | org-texinfo-node-description-column |
:texinfo-active-timestamp-format | org-texinfo-active-timestamp-format |
:texinfo-inactive-timestamp-format | org-texinfo-inactive-timestamp-format |
:texinfo-diary-timestamp-format | org-texinfo-diary-timestamp-format |
:texinfo-link-with-unknown-path-format | org-texinfo-link-with-unknown-path-format |
:texinfo-tables-verbatim | org-texinfo-tables-verbatim |
:texinfo-table-scientific-notation | org-texinfo-table-scientific-notation |
:texinfo-table-default-markup | org-texinfo-table-default-markup |
:texinfo-text-markup-alist | org-texinfo-text-markup-alist |
:texinfo-format-drawer-function | org-texinfo-format-drawer-function |
:texinfo-format-inlinetask-function | org-texinfo-format-inlinetask-function |
:texinfo-compact-itemx | org-texinfo-compact-itemx |
:with-latex | org-texinfo-with-latex |
在 Org 文件间创建链接时,通常使用 ‘[[file:foo.org][The foo]]’ 或简写 ‘[[file:foo.org]]’ (参见 External Links)。 发布后,该链接会自动指向 ‘foo.html’ 。因此你可以为 “Org 网站” 项目的页面建立互联链接,发布为 HTML 后可正常跳转。 若同时发布 Org 源文件并希望链接指向它,应使用 ‘http’ 链接而非 ‘file:’ 链接,因为 file 链接会被转换为对应 ‘.html’ 文件的链接。
指向加密 Org 文件的链接(如 ‘[[file:foo.org.gpg]]’ )同样受支持。
你也可以链接至图片等相关文件。只要合理使用相对文件名,并配置 Org 上传相关附件,这些链接即可正常工作。 使用示例参见 Example: complex publishing configuration。
已发布文档间的链接可包含部分搜索选项(参见 Search Options in File Links),这些选项会被解析为目标文件中的对应位置。 例如,发布为 HTML 后,以下链接均指向 ‘foo.html’ 中的指定锚点:
[[file:foo.org::*heading]] [[file:foo.org::#custom-id]] [[file:foo.org::target]]
可使用以下属性控制指定项目的站点地图发布。
:auto-sitemap非 nil 时,在执行 org-publish-current-project 或 org-publish-all 时自动发布站点地图。
:sitemap-filename站点地图输出文件名,默认为 ‘sitemap.org’ ,发布后变为 ‘sitemap.html’ 。
:sitemap-title站点地图页面标题,默认为文件名。
:sitemap-style可选 list (站点地图仅为相关文件标题的项目列表)或 tree (站点地图体现源文件的目录结构),默认为 tree 。
:sitemap-format-entry ¶该选项用于设置站点地图条目的格式。它是一个接收三个参数的函数:相对于项目基础目录的文件或目录名、
站点地图样式、当前项目,函数应返回一个字符串。默认值会将文件名转为链接,并使用文档标题作为链接描述。
如需特殊格式,可使用 org-publish-find-date 、 org-publish-find-title 与 org-publish-find-property
获取已发布文档的附加信息。
:sitemap-function用于生成站点地图的插件函数。该函数接收两个参数:站点地图标题、项目涉及的文件与目录构成的嵌套列表,
该列表可通过 org-list-to-generic 、 org-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 。
Org 可以为发布项目的所有文件生成跨文档索引。
:makeindex非 nil 时,在 ‘theindex.org’ 中生成索引并发布为 ‘theindex.html’ 。
该文件在首次发布设置了 :makeindex 的项目时自动创建,文件仅包含 ‘#+INCLUDE: "theindex.inc"’ 语句。
你可以围绕该包含语句添加标题、样式等内容。
索引条目通过 ‘INDEX’ 关键字指定。包含感叹号的条目会创建子项。
*** Curriculum Vitae #+INDEX: CV #+INDEX: Application!CV
对于已经在使用 Rsync、Unison 等第三方同步工具的用户,可能更倾向于不使用 Org 模式中高度依赖 Tramp 的内置远程发布功能。Tramp 虽然实用且功能强大,但在批量传输多个文件时效率不高,且在高负载使用场景下已知会出现问题。
专业的同步工具具备多项优势。除了对比时间戳,它们还会校验文件内容与权限/属性。因此你可以选择先将网站发布到本地目录—甚至直接与 Org 文件放在 同一位置—再通过 Unison 或 Rsync 与远程主机完成同步。
以 Unison 为例,它可以配置仅向指定远程目标传输哪些文件,能大幅简化项目发布的配置逻辑。只需将所有文件放在正确位置,通过 org-publish 处理 Org 文件,后续同步工作交由同步工具完成即可。这种场景下无需在项目配置中包含 JPG、CSS、PNG 等附件文件,第三方工具会自动同步这些内容。
发布到本地目录的速度也远快于远程发布,因此可以更轻松地重新发布整个项目。若将 org-publish-use-timestamps-flag 设置为 nil ,还能确保重新包含所有已修改的外部文件,例如通过 ‘INCLUDE’ 关键字引入的示例源码文件。Org 内置的时间戳机制无法智能检测被引入文件是否发生修改。
下面提供两组配置示例。第一个是仅发布一组 Org 文件的简单项目,第二个则是包含多个组件的复杂项目。
该示例将一组 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\"/>")))
这个更复杂的示例用于发布完整网站,包含转换为 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"))))
配置完成后,可通过以下命令执行 Org 发布操作:
org-publish) ¶提示选择指定项目并发布该项目下所有文件。
org-publish-current-project) ¶发布当前文件所属的项目。
org-publish-current-file) ¶仅发布当前文件。
org-publish-all) ¶发布所有项目。
Org 使用时间戳追踪文件修改状态。上述命令默认仅发布已修改的文件。可通过为任意命令添加前缀参数,或自定义变量 org-publish-use-timestamps-flag 来覆盖该行为,强制发布所有文件。当文件通过 ‘SETUPFILE’ 或 ‘INCLUDE’ 关键字引入其他文件时,通常需要执行此操作。
虽然链接(参见 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-processor 、 org-cite-follow-processor 、 org-cite-insert-processor 和 org-cite-export-processors ,为不同引用功能指定对应处理器:
语法高亮、悬浮提示预览等。
通过 org-open-at-point 对光标处引用执行操作。
通过 org-cite-insert 添加和编辑引用。
依托不同库适配各类目标导出格式。
添加引用前,需先设置一个或多个文献库,可通过 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:@key]
[cite:see @key p. 123]
[cite:@key1;@key2;@key3]
[cite/style:common prefix ;prefix @key suffix; ... ; common suffix]
若未指定 ‘style’ ,则使用以下两种默认样式之一:
#+cite_export: basic numeric noauthor/bare [cite:@key] 等同于 [cite/noauthor/bare:@key]
[cite:@key] 等同于 [cite/nil:@key]
引用的必填要素仅有:
Org 目前包含以下导出处理器:
基础导出处理器,适用于无需向后兼容、格式化需求较低的场景;
该导出处理器通过 citeproc-el 库,使用基于 引文样式语言 编写的格式文件;
该导出处理器使用 LaTeX 经典文献工具 BibTeX,可兼容其文献数据与样式文件(含大量出版社专用样式),仅支持 LaTeX 的 ‘\cite’ 与 ‘\nocite’ 命令。
功能与 ‘bibtex’ 处理器类似,但使用 LaTeX 宏包 ‘natbib’ ,相比原生 ‘\cite’ 命令支持更多样式变体。
该后端支持 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 格式。
‘PRINT_BIBLIOGRAPHY’ 关键字用于指定参考文献的打印位置(注意冒号):
#+print_bibliography:
基于 LaTeX 的导出处理器 ‘bibtex’ 、 ‘natbib’ 、 ‘biblatex’ 生成的参考文献默认带有章节标题,而 ‘basic’ 与 ‘csl’ 处理器生成的参考文献列表无标题。
一个文档可包含多个 ‘PRINT_BIBLIOGRAPHY’ 关键字,每个关键字都会触发参考文献打印。
该关键字可搭配附加选项使用,例如仅打印指定分类的文献条目或控制格式。不同引用导出处理器支持的 ‘PRINT_BIBLIOGRAPHY’ 选项及含义各不相同,部分处理器不支持传递选项。
‘biblatex’ 与 ‘csl’ 导出处理器通过 ‘PRINT_BIBLIOGRAPHY’ 关键字附带的属性列表支持参考文献选项,示例:
#+print_bibliography: :keyword algebra :type book
包含空格的取值需用双引号包裹。若需重复使用某个键,可使用逗号分隔多个取值,中间不可加空格:
#+print_bibliography: :keyword "algebraic logic" :nottype article,book
‘biblatex’ 导出处理器支持 BibLaTeX 中 \printbibliography 命令的全部选项。
‘csl’ 处理器支持以下选项:
仅输出其关键字字段包含所有指定关键字的条目。
仅输出其关键字字段不包含任意一个指定关键字的条目。
仅输出类型为 ‘<entrytype>’ 的条目。条目类型优先使用 BibTeX/BibLaTeX 条目类型(当该信息可用,即条目从 BibTeX/BibLaTeX 参考文献读取时),否则使用 CSL 条目类型。
仅输出类型不在指定条目类型范围内的条目。条目类型判定规则与 ‘:type’ 一致。
仅输出其 CSL 条目类型(可能基于 BibTeX/BibLaTeX 到 CSL 的转换)为 ‘<entrytype>’ 的条目。
仅输出其 CSL 条目类型(可能基于 BibTeX/BibLaTeX 到 CSL 的转换)不在所列类型范围内的条目。
仅输出使指定 Emacs Lisp 谓词返回非 nil 值的条目。
此处的源代码指以人类可读编程语言编写的纯文本计算机指令集合,可包含注释。只要源代码用起止标记标识,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 处理源代码的各项功能。
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 模式将文本、数据、代码、执行环境配置、运行结果,以及相关论述、结论、引用、内外链接统一保存在单个文档中,实现了可复现研究的便捷验证与维护。
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>}
可选。为代码块命名,使其可像函数一样被其他代码块或行内代码调用执行并捕获结果。其他代码块、外部文件及表格公式(参见 The Spreadsheet)均可通过名称引用该代码块,作用与命名 Org 表格一致。Org 模式要求名称唯一,重名时行为未定义,行内代码块不支持命名。
必选。标记代码块的起止边界, ‘#+BEGIN_SRC’ 行可携带后续所述的附加参数。
可选。代码块所用编程语言的标识符,支持的语言标识符参见 Languages。
若省略 ‘<language>’ 标识符,则代码块不可包含 ‘<switches>’ 与 ‘<header arguments>’ ,否则首个开关/参数会被识别为语言。
当 org-src-fontify-natively 设置为非 nil 时,语言标识符还用于在 Org 缓冲区中对代码块进行语法高亮,参见 Editing Source Code。
可选。用于精细控制代码的执行、导出与格式(参见 Literal Examples 中关于开关的说明)。
可选。用于控制代码块执行、导出与代码提取的多项行为(参见 Using Header Arguments)。借助 Org 属性功能,可将头部参数选择性应用于整个缓冲区或文档特定子树。
对应指定编程语言的源代码内容。
Org 内置了适用于所有语言的通用头部参数。随着各语言在源代码块中逐步支持,也会为特定语言新增专属头部参数。头部参数以英文冒号开头,后接小写的参数名进行指定。
由于头部参数可通过多种方式设置,当出现重复或冲突时,Org 遵循 局部设置优先级更高 的原则。例如函数调用中的头部参数值,会覆盖全局默认的参数值。
可通过自定义变量 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/。
如需对整个缓冲区生效头部参数,可在 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 p 的 org-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’ 的设置。
最常用的方式是在源代码块的 ‘#+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
函数调用中的头部参数优先级最高,出现冲突时会覆盖所有其他设置。下面展示两个 ‘#+CALL:’ 示例。 ‘CALL’ 关键字的完整语法见 Evaluating Code Blocks。
本示例中, ‘:exports results’ 头部参数作用于 ‘#+CALL:’ 行的执行过程:
#+CALL: factorial(n=5) :exports results
本示例中, ‘:session special’ 头部参数作用于 ‘factorial’ 代码块的执行:
#+CALL: factorial[:session special](n=5)
使用 ‘var’ 向源代码块传递参数。代码块中变量的具体用法因语言而异,详见各语言专属文档,但 ‘var’ 的语法对所有语言统一,包括变量声明与默认值赋值。
使用 ‘var’ 头部参数向代码块传递参数的语法格式为:
:var NAME=ASSIGN
NAME 为代码块主体中绑定的变量名。ASSIGN 可以是字面量(字符串、数字)、表格引用、列表、字面量示例、其他代码块(可带参数),或是某代码块的执行结果。ASSIGN 也可通过冒号分隔文件名与引用目标,指定外部文件中的元素。
:var NAME=FILE:REFERENCE
若 ‘FILE’ 不存在,则直接在当前文件中按原引用名称查找。因此 ‘:var table=tbl:example’ 会在当前缓冲区中查找对应表格。
以下为按引用传递值的示例:
使用 ‘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’ 。
简单的命名列表。
#+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)
两个代码块可共享同一运行环境。 ‘session’ 头部参数用于让多个源代码块在同一会话中运行,同名会话的代码块会在同一个解释器进程中执行。
默认值。每个代码块启动独立解释器进程,执行完毕后进程终止。
除 ‘none’ 外的任意字符串作为会话名称。例如 ‘:session STRING’ 会将会话命名为 ‘STRING’ 。若 ‘session’ 未设值,会话名由源代码语言标识符生成。后续同语言代码块复用该会话。根据语言不同,状态变量、其他块代码与整体解释环境可能共享。部分解释型语言支持通过修改会话名创建并发会话。
仅支持交互式执行的语言可使用会话功能,C、ditaa 等语言不支持。即使是 Python、Haskell 这类支持交互的语言,也对可交互式运行的语法结构有限制,Org 会话中的代码块会继承这些限制。
‘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 以规避底层兼容性问题。
‘prologue’ 头部参数用于在代码块执行前追加内容,常用于执行重置指令。例如可在 Gnuplot 代码块中使用 ‘:prologue "reset"’ ,或全局配置:
(add-to-list 'org-babel-default-header-args:gnuplot
'((:prologue . "reset")))
同理, ‘epilogue’ 头部参数的值会在代码块执行末尾追加执行。
安全提示:执行代码存在安全风险。Org 提供保护机制,执行任何代码前都会请求用户授权。自定义或关闭该保护机制见 Code Evaluation and Security Issues。
Org 会捕获代码块执行结果,并插入到 Org 文件中代码块的后方,位置在换行与 ‘RESULTS’ 关键字之后。若不存在 ‘RESULTS’ 关键字则自动创建。详细说明见 Results of Evaluation。
默认仅启用 Emacs Lisp 代码块执行,启用其他语言见 Languages。
Org 提供多种执行代码块的方式。将光标定位在代码块上按下 C-c C-c 或 C-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=" ,生成适合标记的原样文本。
待执行的当前文档内代码块名称(见 Structure of Code Blocks)。若块位于其他文件, ‘<name>’ 以文件名加冒号开头。例如执行 ‘file.org’ 中名为 ‘clear-data’ 的块:
#+CALL: file.org:clear-data()
Org 使用标准函数调用语法向代码块传递参数。例如,在 ‘#+CALL:’ 行中将 ‘4’ 传递给名为 ‘double’ 、且声明了头部参数 ‘:var n=2’ 的代码块,写法如下:
#+CALL: double(n=4)
注意该函数调用语法与头部参数语法的区别。
Org 使用头部参数语法向已命名的代码块传递内部头部参数。内部头部参数作用于代码块的执行过程。例如, ‘[:results output]’ 会收集该代码块执行期间输出到标准输出的结果。注意该头部参数语法与函数调用语法的区别。
尾部头部参数会影响代码块返回的结果。例如, ‘:results html’ 会在将结果插入到 Org 缓冲区之前,把结果包裹在 ‘#+BEGIN_EXPORT html’ 块中。
‘eval’ 头部参数可限制特定代码块与 ‘CALL’ 关键字的执行,用于防范不受信任代码,可设置为执行前确认。
Org 执行源代码,是否询问权限由 org-confirm-babel-evaluate 决定。
永不执行源代码。
每次执行前均询问用户权限。
导出时不执行,但用户可交互式执行。
导出时询问用户是否执行。
若未设置 ‘eval’ ,是否执行由 org-confirm-babel-evaluate 变量决定(见 Code Evaluation and Security Issues)。
‘cache’ 头部参数用于缓存代码块执行结果,避免重复执行未修改的代码块。使用缓存需满足:缓冲区中已有结果,且头部参数(含 ‘var’ 引用值)与代码块内容自上次计算后未变更。该功能可大幅减少耗时计算,但部分极端场景下缓存结果可能不可靠。
缓存功能最适合纯函数代码块:相同输入始终返回相同结果(见 Environment of a Code Block)、无副作用、不依赖输入以外的外部变量。依赖计时器、文件系统、随机数的函数不适合缓存。
警告:在会话中使用 ‘cache’ 可能产生意外结果。
缓存机制检测代码变更时,不会展开 noweb 引用(见 Noweb Reference Syntax)。
‘cache’ 可取 ‘yes’ 或 ‘no’ :
默认值。不缓存结果,每次均重新执行。
是否运行代码或返回缓存结果,取决于对代码块整体及其传入参数组合后的 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
Org 对代码块执行结果的处理方式取决于多个共同作用的头部参数。不过,最主要的决定因素是 ‘results’ 头部参数。它支持四类选项,每个代码块在每类中只能选用一个:
用于指定如何从代码块中收集结果;
用于指定代码块返回的结果类型;影响 Org 处理结果并将其插入 Org 缓冲区的方式;
用于指定结果格式;影响 Org 处理结果的方式;
用于在结果完成格式化后执行插入操作。
收集选项用于指定结果,各选项互斥,只能选择其一。
大多数 Babel 库的默认行为157。函数式模式。Org 会将代码包裹在源块对应语言的函数定义中以获取返回值。这也是使用 ‘:results value’ 时,代码应像函数一样执行并返回值的原因。对于 Python 等语言,使用 ‘:results value’ 时必须显式使用 return 语句。结果为代码块中最后一条语句的返回值。
在会话中执行代码块时(参见 Environment of a Code Block),Org 将代码传递给以 Emacs 交互式子进程运行的解释器,并从源代码解释器的最后一条语句输出中获取值。Org 需要使用语言特定的方法获取该值,例如 Ruby 中的变量 _ ,以及 R 中的 .Last.value 。
脚本模式。Org 将代码传递给运行解释器的外部进程,并将标准输出流的内容以文本形式返回。
在会话模式下,Org 将代码传递给以 Emacs 交互式子进程运行的解释器,拼接解释器输出的所有文本并作为结果返回。
类型用于指定代码块执行后预期的结果类型,各选项互斥,只能选择其一。
默认行为为自动判断结果类型。结果类型的检测依赖于代码块所用语言,具体可参考各语言的单独文档,参见 Languages。
将结果解析为 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 |
将结果解析为 Org 列表。若结果为单个值,则创建只含一个元素的列表。
按字面解析并以引用文本形式插入,不创建表格。使用示例:=:results value verbatim= 。
将结果解析为文件名。将代码块的执行结果保存到该文件,然后插入指向该文件的链接。可同时控制文件名和链接附带的描述。
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
格式与代码块返回的结果类型相关,各选项互斥,只能选择其一。默认值由上述指定的类型决定。
按原始 Org 模式解析,直接插入缓冲区。若为表格则自动对齐。使用示例: ‘:results value raw’ 。
将结果包裹在代码块中,便于解析。使用示例: ‘:results value code’ 。
结果与 ‘raw’ 一样直接添加到 Org 文件中,但会被包裹在 ‘RESULTS’ 抽屉或结果宏(用于行内代码块)中,方便后续脚本与自动化处理。使用示例: ‘:results value drawer’ 。
将结果包裹在 ‘BEGIN_EXPORT html’ 块中。使用示例: ‘:results value html’ 。
将结果包裹在 ‘BEGIN_EXPORT latex’ 块中。使用示例: ‘:results value latex’ 。
与 ‘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’ 头部参数,则将源块结果解析为文件路径。
将结果包裹在 ‘BEGIN_SRC org’ 块中。如需逗号转义,可在块内使用 TAB 或导出文件。使用示例: ‘:results value org’ 。
将结果转换为美化打印的源代码并包裹在代码块中。支持的语言: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
结果收集后的处理选项,各选项互斥,只能选择其一。
默认行为。将结果插入 Org 缓冲区并覆盖之前的结果。使用示例: ‘:results output replace’ 。
不将结果插入 Org 缓冲区,但在迷你缓冲区中回显。使用示例: ‘:results output silent’ 。
计算结果但不做任何处理,既不插入 Org 缓冲区也不在迷你缓冲区回显。该结果仍可被其他代码块引用使用。使用示例: ‘:results none’ 。
完全忽略结果。该选项与 ‘none’ 类似,但不对返回值执行任何处理。以编程方式调用代码块(参见 How to evaluate source code)或通过引用调用(参见 Passing arguments 与 Noweb Reference Syntax)时始终返回 nil 。
将结果追加到 Org 缓冲区,最新结果在底部,不覆盖原有结果。使用示例: ‘:results output append’ 。
将结果前置到 Org 缓冲区,最新结果在顶部,不覆盖原有结果。使用示例: ‘:results output prepend’ 。
‘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 |
可以选择只导出代码块的 代码 、代码块的执行 结果 、同时导出代码与结果,或都 不 导出。Org 对大多数语言默认导出 代码 ,对行内代码块默认导出 结果 。对于 ditaa 等部分语言,无论普通源块还是行内源块均默认导出 结果 。若仅导出代码块主体,参见 Literal Examples;若要选择性导出 Org 文档的子树,参见 Exporting。
‘exports’ 头部参数用于指定该部分 Org 内容是否导出为 HTML、LaTeX 等格式。
默认值。将代码主体加入导出文件。示例: ‘:exports code’ 。
将代码执行结果加入导出文件。示例: ‘:exports results’ 。
将代码与执行结果同时加入导出文件。示例: ‘:exports both’ 。
代码与执行结果均不加入导出文件。代码是否执行取决于其他选项。示例: ‘: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 执行代码块:
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)。
从代码块中提取源代码是文学编程的基础任务,Org 提供了便捷的实现方式。在文学编程术语中,文档在创作时将代码与文档 编织(woven) 在一起,导出时则将代码 缠绕(tangled) 分离以供计算机执行。Org 支持编织与缠绕操作,便于创建、维护、共享与导出文学编程文档,并提供丰富的自定义选项用于提取源代码。
Org 在缠绕代码块时会对其展开、合并与转换,再根据选项配置重新组合为一个或多个独立文件。在此缠绕过程中,Org 会展开源代码中的变量,并解析所有 noweb 风格引用(参见 Noweb Reference Syntax)。
‘tangle’ 头参数用于指定是否将代码块导出到源码文件。
将代码块导出到源码文件。源码文件名由当前 Org 文件名派生,文件扩展名由代码语言标识符决定。 示例: ‘:tangle yes’ 。
默认值。不将代码提取到源码文件中。 示例: ‘:tangle no’ 。
将代码块导出到文件名由 ‘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
该代码块会导出到四个文件:
‘tangle-directory’ 头参数用于指定一个或多个基础目录,作为 tangle 相对路径的根目录。用法与 ‘tangle’ 类似,支持相同类型的值。
此外,位于注释子树内的代码块(见 Comment Lines)永远不会被导出。
‘mkdirp’ 头参数用于在导出文件时自动创建不存在的父目录。 ‘yes’ 表示启用创建, ‘no’ 表示禁用。
‘comments’ 头参数用于控制在导出文件中插入额外注释,这些注释独立于代码块本身已有的注释。
默认值。导出时不插入任何额外注释。
用注释包裹代码块,并添加指向 Org 文件中对应代码位置的链接。
注意 Org 会使用 org-store-link (Handling Links)生成指向代码块的链接。如果父标题重复或在导出后被修改,该链接可能不唯一。建议将 org-id-link-to-org-use-id 设为 t,确保链接指向正确标题。
为兼容旧版本保留,效果与 ‘link’ 相同。
将 Org 文件中最近的标题文本作为注释插入,具体文本取自代码块所在的上层上下文。
同时启用 ‘link’ 和 ‘org’ 两种注释。
启用 ‘link’ 功能,展开 noweb 引用(见 Noweb Reference Syntax),并在代码块内部用链接注释包裹展开内容。
‘padline’ 头参数用于控制是否在导出文件中为代码块前后添加空行。
默认值。在导出文件中每个代码块前后各插入一个空行。
不为导出的代码块添加空行。
‘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)。部分展开可能导致提前赋值,因此提供该选项。该选项仅对导出生效,对导出无影响,因为执行用的代码块必须展开。
org-babel-tangle ¶导出当前文件。快捷键绑定为 C-c C-v t。
带前缀参数时仅导出当前代码块。
org-babel-tangle-file ¶选择一个文件进行导出。快捷键绑定为 C-c C-v f。
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 缓冲区。
调试器通常会将错误信息关联到源码文件。但对导出文件,我们希望关联到 Org 文件而非导出后的源码文件。为实现这一跳转,Org 使用 org-babel-tangle-jump-to-org 函数,并依赖两个额外代码块头参数:
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)
使用 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"))))
代码块可使用 noweb158 风格语法引用其他代码块:
<<CODE-BLOCK-ID>>
其中 CODE-BLOCK-ID 可以是单个代码块的 ‘NAME’ ,或是一组共享相同 ‘noweb-ref’ 头参数的代码块集合(见 Using Header Arguments)。Org 可将此类引用替换为被引用块的代码;若为具名 ‘NAME’ 的单个代码块,也可替换为该块的执行结果。
‘noweb’ 头参数控制 noweb 语法引用的展开行为,展开发生在代码块执行、导出或导出时。
默认值。在执行、导出、导出时均不展开代码中的 noweb 引用。
在执行、导出、导出时均展开代码中的 noweb 引用。
仅在导出时展开 noweb 引用,执行和导出时不展开。
在执行和导出时展开 noweb 引用,导出时移除引用。
在执行和导出时展开 noweb 引用,导出时不展开。
在执行或导出前展开 noweb 引用,导出时移除引用。
仅在执行前展开代码中的 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")
如不确定代码块展开后的结果,可使用以下命令预览
org-babel-expand-src-block) ¶根据头参数展开当前代码块,并在预览缓冲区中显示结果。
“Babel 库” 是一组代码块集合。与函数库类似,这些代码块可在其他 Org 文件中调用。Worg 网站提供了一批实用代码块库 Worg。远程代码块执行语法见 Evaluating Code Blocks。
用户如需将代码加入库中,先将代码保存为 Org 文件中的普通代码块,再通过 org-babel-lob-ingest 加载该文件,其快捷键为 C-c C-v i。
许多常用 Org 快捷键会根据上下文重新绑定。
代码块内有效快捷键:
| Key binding | Function |
|---|---|
| C-c C-c | org-babel-execute-src-block |
| C-c C-o | org-babel-open-src-block-result |
| M-UP | org-babel-load-in-session |
| M-DOWN | org-babel-pop-to-session |
Org 缓冲区有效快捷键:
| Key binding | Function |
|---|---|
| C-c C-v p or C-c C-v C-p | org-babel-previous-src-block |
| C-c C-v n or C-c C-v C-n | org-babel-next-src-block |
| C-c C-v e or C-c C-v C-e | org-babel-execute-maybe |
| C-c C-v o or C-c C-v C-o | org-babel-open-src-block-result |
| C-c C-v v or C-c C-v C-v | org-babel-expand-src-block |
| C-c C-v u or C-c C-v C-u | org-babel-goto-src-block-head |
| C-c C-v g or C-c C-v C-g | org-babel-goto-named-src-block |
| C-c C-v r or C-c C-v C-r | org-babel-goto-named-result |
| C-c C-v b or C-c C-v C-b | org-babel-execute-buffer |
| C-c C-v s or C-c C-v C-s | org-babel-execute-subtree |
| C-c C-v d or C-c C-v C-d | org-babel-demarcate-block |
| C-c C-v t or C-c C-v C-t | org-babel-tangle |
| C-c C-v f or C-c C-v C-f | org-babel-tangle-file |
| C-c C-v c or C-c C-v C-c | org-babel-check-src-block |
| C-c C-v j or C-c C-v C-j | org-babel-insert-header-arg |
| C-c C-v l or C-c C-v C-l | org-babel-load-in-session |
| C-c C-v i or C-c C-v C-i | org-babel-lob-ingest |
| C-c C-v I or C-c C-v C-I | org-babel-view-src-block-info |
| C-c C-v z or C-c C-v C-z | org-babel-switch-to-session-with-code |
| C-c C-v a or C-c C-v C-a | org-babel-sha1-hash |
| C-c C-v h or C-c C-v C-h | org-babel-describe-bindings |
| C-c C-v x or C-c C-v C-x | org-babel-do-key-sequence-in-edit-buffer |
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))))
" "$@"
yank-mediaOrg 内置缓冲区补全功能。与适用于快速命令交互的小缓冲区补全不同,Org 的缓冲区补全更适合在 Org 文档中进行内容创作。输入一个或多个字母并触发快捷键,即可在当前位置补全文本。 根据上下文和按键不同,Org 会提供不同类型的补全,全程无需使用小缓冲区。这类针对特定模式的快捷键已成为 Emacs 的重要组成部分,Org 也提供了多项快捷操作。
补全光标处的单词。
org-tag-alist 或当前缓冲区中使用过的所有标签中提取标签列表。
只需少量按键,即可插入空的结构块(如 ‘#+BEGIN_SRC’ … ‘#+END_SRC’ ),或将已有文本包裹在这类块中。
org-insert-structure-template) ¶提示选择块结构类型,并在光标处插入对应块。若选中区域有效,则将该区域包裹在块内。首先提示用户输入按键,用于从下方变量中查找结构类型。若按键为 TAB、RET 或 SPC,则提示输入块类型。
可用的结构类型在 org-structure-template-alist 中定义,添加或修改值可参考其文档字符串。
Org Tempo 可将代码片段展开为 org-structure-template-alist 和 org-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’ |
在 Org 文件中,当光标位于标题上时,单键即可执行自定义命令。无需额外使用 Meta 或修饰键,快捷按键可提升导航速度或执行自定义命令。除了加快导航外,快捷按键在没有完整键盘的小型移动设备上也很实用。在输入 Emacs 组合键存在问题的 TTY 设备上,快捷按键同样适用。
默认情况下,Org 禁用快捷按键。将变量 org-use-speed-commands 设置为非 nil 值即可启用。触发快捷按键时,光标必须位于 Org 标题开头,星号之前。
Org 内置预定义的快捷按键列表。添加或修改快捷按键可自定义选项 org-speed-commands ,详细说明参见变量文档字符串。启用快捷按键后,执行 M-x org-speed-command-help,或在 Org 标题开头按下 ?,即可显示当前生效的快捷按键(包括用户自定义按键)。
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) 实际使用硬空格按所需缩进量缩进每一行并隐藏前导星号。
通过执行 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-stars 和 org-indent-mode-turns-off-org-adapt-indentation 。
要为所有文件全局启用 Org 缩进模式,请自定义变量 org-startup-indented 。
如需对单个文件进行控制,请按如下方式使用 ‘STARTUP’ 关键字:
#+STARTUP: indent #+STARTUP: noindent
若希望纯 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-levels 和 M-x org-convert-to-oddeven-levels 可在文件的单星号与双星号布局间转换。
在 Org 缓冲区且选中区域有效时,部分命令会应用于选中区域内的所有子树。例如,选中区域包含多个标题时按下 C-c C-s,会依次提示设置新的计划日期和时间。将选项 org-loop-over-headlines-in-active-region 设置为非 t 可禁用该功能,此时选中区域后正常执行命令即可。
org-agenda-loop-over-headlines-in-active-region 是日程缓冲区的对应选项,在日程缓冲区中还可使用 批量编辑选中条目。
并非所有命令都能在选中区域中循环执行,生效的子树或标题范围可进一步细化:更多细节参见这些选项的文档字符串。
通过 M-x org-num-mode 切换 Org 编号次要模式,可在标题上方显示大纲编号,并在文档结构变更时自动更新。
默认情况下所有标题都会编号。可根据标题层级、标签、 ‘COMMENT’ 关键字或 ‘UNNUMBERED’ 属性限制编号范围,相应设置 org-num-max-level 、 org-num-skip-tags 、 org-num-skip-commented 、 org-num-skip-unnumbered 或 org-num-skip-footnotes 。
若 org-num-skip-footnotes 为非 nil ,脚注章节(参见 Creating Footnotes)也不会编号。
通过设置 org-num-face 和 org-num-format-function 可控制编号的显示样式。
将选项 org-startup-numerated 设置为 ‘t’ 可全局为所有 Org 文件启用该模式,单个文件可使用 ‘#+startup: num’ 本地启用。
Org 中的 C-c C-c 按键根据上下文可执行多种功能,是 Org 中用途最多、功能最复杂的组合键。本手册各处均有详细说明,此处汇总列表方便查阅。
缓冲区设置以 ‘#+’ 开头,后接关键字、冒号、一个或多个空格,再为每个设置对应的单词。Org 支持同一行设置多个选项,也支持同一关键字使用多行。本手册各处均有相关说明,此处汇总如下。
C-c C-c 可使缓冲区设置的修改生效,在 Emacs 中关闭并重新打开 Org 文件也可生效。
设置日程文件的归档位置,对应变量为 org-archive-location 。
设置日程文件的分类,应用于整个文档。
设置列视图的默认格式,该格式在无 ‘COLUMNS’ 属性的位置调用列视图时生效。
为表格公式可用的常量设置文件本地值,该行设置本地变量 org-table-formula-constants-local ,全局版本为 org-table-formula-constants 。
设置文件中所有条目(包括顶层条目)继承的标签。
每行定义一个链接缩写,多个缩写可使用多个 ‘LINK’ 关键字(参见 Link Abbreviations),对应变量为 org-link-abbrev-alist 。
设置优先级的上下限与默认值,三者均为 A–Z 字母或 0–64 数字,最高优先级的 ASCII 码必须小于最低优先级。
为当前缓冲区条目设置默认继承值,常用于指定属性的允许取值。
设置文件或对应 URL 用于额外的缓冲区设置。Org 打开主文件时会加载并解析该文件中的设置。若指定 URL,会下载内容并缓存至临时文件。在设置行执行 C-c C-c 可重新解析加载文件并重置临时文件缓存。
Org 正常导出时也会解析并加载设置文件中的缓冲区设置,如同其包含在当前 Org 缓冲区中,设置文件的其余内容会被忽略。
光标在设置文件名行时,按下 C-c ' 可打开设置文件(非 URL)。
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-done 、 org-log-note-clock-out 和 org-log-repeat )。
| ‘logdone’ | 事项标记为完成时记录时间戳。 |
| ‘lognotedone’ | 完成时记录时间戳与备注。 |
| ‘nologdone’ | 不记录事项完成状态。 |
| ‘logrepeat’ | 重置循环事项时记录时间。 |
| ‘lognoterepeat’ | 重置循环事项时记录备注。 |
| ‘nologrepeat’ | 不记录循环事项重置。 |
| ‘lognoteclock-out’ | 时钟退出时记录备注。 |
| ‘nolognoteclock-out’ | 时钟退出时不记录备注。 |
| ‘logreschedule’ | 计划时间变更时记录时间戳。 |
| ‘lognotereschedule’ | 计划时间变更时记录备注。 |
| ‘nologreschedule’ | 不记录计划时间变更。 |
| ‘logredeadline’ | 截止时间变更时记录时间戳。 |
| ‘lognoteredeadline’ | 截止时间变更时记录备注。 |
| ‘nologredeadline’ | 不记录截止时间变更。 |
| ‘logrefile’ | 重新归档时记录时间戳。 |
| ‘lognoterefile’ | 重新归档时记录备注。 |
| ‘nologrefile’ | 不记录重新归档操作。 |
以下选项用于隐藏大纲标题前导星号与设置大纲缩进,对应变量为 org-hide-leading-stars 和 org-odd-levels-only ,默认均为 nil (即 ‘showstars’ 和 ‘oddeven’ )。
| ‘hidestars’ | 标题仅显示一个星号,其余隐藏。 |
| ‘showstars’ | 显示标题所有前导星号。 |
| ‘indent’ | 按大纲层级虚拟缩进。 |
| ‘noindent’ | 不按大纲层级虚拟缩进。 |
| ‘odd’ | 仅使用奇数大纲层级(1、3…)。 |
| ‘oddeven’ | 使用所有大纲层级。 |
开启时间戳自定义格式覆盖(变量 org-display-custom-times 和 org-timestamp-custom-formats )可使用:
| ‘customtime’ | 覆盖自定义时间格式。 |
以下选项影响表格电子表格(变量 constants-unit-system )。
| ‘constcgs’ | ‘constants.el’ 使用厘米-克-秒单位制。 |
| ‘constSI’ | ‘constants.el’ 使用国际单位制。 |
以下关键字用于设置脚注,对应变量为 org-footnote-define-inline 、 org-footnote-auto-label 和 org-footnote-auto-adjust 。
| ‘fninline’ | 行内定义脚注。 |
| ‘fnnoinline’ | 在独立章节定义脚注。 |
| ‘fnlocal’ | 在首次引用附近定义脚注,非行内。 |
| ‘fnprompt’ | 提示输入脚注标签。 |
| ‘fnauto’ | 自动创建 ‘[fn:1]’ 格式标签(默认)。 |
| ‘fnconfirm’ | 提供自动标签供编辑或确认。 |
| ‘fnadjust’ | 自动重编号并排序脚注。 |
| ‘nofnadjust’ | 不自动重编号排序脚注。 |
| ‘fnanon’ | 使用 ~org-footnote-new= 创建匿名脚注。 |
以下关键字用于启动时隐藏块或抽屉,对应变量为 org-hide-block-startup 和 org-hide-drawer-startup 。
| ‘hideblocks’ | 启动时隐藏所有起止块。 |
| ‘nohideblocks’ | 启动时不隐藏块。 |
| ‘hidedrawers’ | 启动时隐藏所有抽屉。 |
| ‘nohidedrawers’ | 启动时不隐藏抽屉。 |
实体以 UTF-8 字符显示由变量 org-pretty-entities 及以下关键字控制:
| ‘entitiespretty’ | 尽可能以 UTF-8 字符显示实体。 |
| ‘entitiesplain’ | 保持实体原始格式。 |
该行(支持多行)指定文件中有效的标签及(可选)对应的 快速标签选择 按键,对应变量为 org-tag-alist 。
设置当前文件中的 TODO 关键字及其解析规则,对应变量为 org-todo-keywords 。
Org 作为 Emacs 模式,使用 Elisp 正则表达式进行搜索、匹配和过滤。Elisp 正则表达式语法与部分通用标准略有差异,最明显的是或关系用 ‘\|’ 表示,匹配组用 ‘\(...\)’ 表示。例如字符串 ‘home\|work’ 可匹配 ‘home’ 或 ‘work’ 。
更多信息参见 Regular Expressions in Emacs。
由 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 | 按光标所在列排序结果 |
在 Org 文件中按下 C-c C-x I,会根据光标处语法打开 Org 手册对应章节。例如在标题上使用该按键,会显示 “文档结构(Document Structure)” 章节。
按下 q 关闭 Info 框架。
有时需要编写形似 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’ 代表零宽空格字符。
与纯文本不同,运行代码存在风险,每个代码块的风险等同于可执行文件。因此 Org 默认添加多项确认提示,提醒普通用户避免意外运行不受信任的代码。
不常运行或编写代码块的用户,Org 默认设置已足够。部分用户可能希望调整提示以减少中断,以下是代码执行的相关风险说明。
Org 在以下场景执行代码:
Org 导出时会执行 Org 文件中的源代码块,按下 C-c C-c 也可执行代码块。导出或运行代码块的用户仅应加载受信任来源的文件,谨慎自定义移除或修改默认安全措施的变量。
为 t 时,执行每个代码块前提示用户确认;为 nil 时,直接执行代码块不提示。若设置为自定义函数,Org 会以源代码语言和代码块内容为参数调用该函数,函数返回 t 或 nil 决定是否提示,可通过该参数分别处理不同源代码语言。
以下示例实现不提示直接执行 ditaa 代码块:
(defun my-org-confirm-babel-evaluate (lang body) (not (string= lang "ditaa"))) ; 不提示 ditaa (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate)
Org 有两种可直接执行代码的链接类型(参见 External Links)。由于代码不可见,这类链接存在潜在风险,因此 Org 遇到此类链接时会提示用户,相关自定义变量为:
执行 shell 链接前提示用户的函数。
执行 Emacs Lisp 链接前提示用户的函数。
表格中的公式(参见 The Spreadsheet)由 Calc 解释器或 Emacs Lisp 解释器执行。
本文档说明 Org 与其他 Emacs 包的兼容性及交互程度。
Org 使用 Calc 包在表格中实现电子表格功能(参见 The Spreadsheet)。Org 也使用 Calc 进行嵌入式计算。详见 GNU Emacs Calc Manual。
Org 允许在表格公式中使用常量名称,也支持使用计算后缀表示单位,例如用 ‘M’ 表示兆(Mega)。如需使用标准常量集合,请安装 ‘constants’ 包。请安装该包的 2.0 版本,可从 https://github.com/cdominik/constants-for-Emacs 获取。Org 会检查函数 constants-get 是否已自动加载。安装说明位于 ‘constants.el’ 文件中。
Org 模式可借助 CDLaTeX 包在 Org 文件中高效输入 LaTeX 片段。参见 Using CDLaTeX to enter math。
Imenu 基于文件中的条目索引创建动态菜单。Org 模式支持 Imenu 菜单,可通过模式钩子启用,示例如下:
(add-hook 'org-mode-hook
(lambda () (imenu-add-to-menubar "Imenu")))
默认索引深度为两级,可通过选项 org-imenu-depth 修改该深度。
Org 仅在加载 Imenu 库之后打开的缓冲区中启用 Imenu 支持。如需在已打开的 Org 缓冲区中启用 Imenu,请重新加载 Org。
Speedbar 包创建一个专用的 Emacs 框架,用于显示文件及文件中的索引项。Org 模式支持 Speedbar,用户可直接从 Speedbar 中深入浏览 Org 文件。在 Speedbar 框架中按下 <,可将日程相关命令作用于当前文件或指定子树。
使用 Takaaki Ota 开发的 Emacs 表格包,可创建支持自动换行、跨列、跨行及对齐的复杂 ASCII 表格。Org 模式可识别此类表格并正确导出。按下 C-c ' 可在专用缓冲区中编辑这些表格,用法与 Org 代码块类似。由于与 Org 其他功能存在冲突,Takaaki Ota 格式的表格无法直接在 Org 缓冲区中编辑。
Emacs 中的 Shift 选择通过 Shift 键配合光标移动扩大选中区域,为默认设置。该功能与 Org 使用 S-<cursor> 修改时间戳、TODO 关键字、优先级、项目符号等冲突。由于 S-<cursor> 在特定上下文外无操作,Org 提供变量 org-support-shift-select 供自定义。Org 模式适配 Shift 选择的方式为:(i) 在特殊命令上下文外启用 Shift 选择;(ii) 即使光标跨越特殊上下文,也可扩展已有选中区域。
Org 快捷键绑定与 CUA 模式使用的 S-<cursor> 方向键存在冲突。若要让 Org 将这些按键让渡给 CUA 模式,可配置变量 org-replace-disputed-keys 。启用该配置后,Org 会在 Org 文件及日程缓冲区中重新映射下列按键,但日期选择过程中除外。
| S-UP ⇒ M-p | S-DOWN ⇒ M-n |
| S-LEFT ⇒ M-- | S-RIGHT ⇒ M-+ |
| C-S-LEFT ⇒ M-S-- | C-S-RIGHT ⇒ M-S-+ |
遗憾的是,这些新按键更难记忆。若想使用其他替代按键,可查看变量 org-disputed-keys 。
Ecomplete 可在邮件缓冲区的地址标题行中提供 “智能(electric)” 地址补全功能。但 Orgtbl 模式会影响其正常工作:若邮件缓冲区中启用了 Orgtbl 模式,在地址标题行输入文本时将无法触发补全。如需使用 Ecomplete,请勿按照建议在邮件缓冲区中自动启用 Orgtbl 模式(参见 The Orgtbl Minor Mode),而应在填写完邮件标题后,根据需要在邮件正文手动开启 Orgtbl 模式。
Org 模式在对段落、列表项及其他元素进行填充时会尝试执行合理处理。许多用户反馈同时使用 ‘filladapt.el’ 与 Org 模式时会出现问题,因此较为稳妥的做法是按如下方式禁用 filladapt:
(add-hook 'org-mode-hook 'turn-off-filladapt-mode)
Viper 使用了 C-c / 按键,导致该按键无法触发 Org 模式对应的命令 org-sparse-tree 。你需要为该命令另行绑定按键,或通过以下配置在 viper-vi-global-user-map 中覆盖该按键:
(define-key viper-vi-global-user-map "C-c /" 'org-sparse-tree)
该包同样使用 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)
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)))
Org 为无法对光标执行移动指令,以及无法使用带修饰键按键绑定的终端和现代移动设备,提供了备用按键绑定。其中部分替代方案可能会略显繁琐。用户可根据自身使用需求进一步自定义这些设置。例如,编辑时间戳常用的 S-<cursor>,改用组合键 C-c . 会更合适。
| Default | Alternative 1 | Speed key | Alternative 2 |
|---|---|---|---|
| S-TAB | C-u TAB | C | |
| M-LEFT | C-c C-x l | l | Esc LEFT |
| M-S-LEFT | C-c C-x L | L | |
| M-RIGHT | C-c C-x r | r | Esc RIGHT |
| M-S-RIGHT | C-c C-x R | R | |
| M-UP | C-c C-x u | Esc UP | |
| M-S-UP | C-c C-x U | U | |
| M-DOWN | C-c C-x d | Esc DOWN | |
| M-S-DOWN | C-c C-x D | D | |
| S-RET | C-c C-x c | ||
| M-RET | C-c C-x m | Esc RET | |
| M-S-RET | C-c C-x M | ||
| S-LEFT | C-c LEFT | ||
| S-RIGHT | C-c RIGHT | ||
| S-UP | C-c UP | ||
| S-DOWN | C-c DOWN | ||
| C-S-LEFT | C-c C-x LEFT | ||
| C-S-RIGHT | C-c C-x RIGHT | ||
| C-c C-, | C-c C-x s |
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 定义自定义协议。
store-link protocol ¶使用 store-link 处理器可复制链接,之后可通过 M-x org-insert-link 或粘贴操作插入。具体来说,执行命令:
emacsclient "org-protocol://store-link?url=URL&title=TITLE"
会存储如下格式的链接:
[[URL][TITLE]]
此外,URL 会被存入剪切板环(kill-ring)以供粘贴。 如果 URL 和 TITLE 中包含斜杠,则需要对其进行编码,并且通常还需要为 Shell 环境添加引号。
若要从浏览器中使用该功能,请新建一个书签并指定任意名称,例如 ‘Org: store-link’ ,然后将以下内容填入地址 Location 栏:
javascript:location.href='org-protocol://store-link?' +
new URLSearchParams({url:location.href, title:document.title});void(0);
标题为可选参数。早期推荐使用如下写法:
javascript:location.href='org-protocol://store-link?url='+
encodeURIComponent(location.href);void(0);
后一种写法兼容 9.0 至 9.4 版本的旧版 Org。
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 选中的文本
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-create 和 org-protocol-create-for-org 。后者适用于你正在编辑属于发布项目的 Org 文件时。
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-key 非 nil 时生效。若 org-crypt-key 为 nil ,Org 会无条件使用对称加密。
将 ‘crypt’ 标签排除在继承之外,可避免已加密文本被重复加密。
Org Mobile 是用于在 Emacs 与其他应用(如移动设备应用)之间同步 Org 文件的协议。它让依托于 “实体(real)” 计算机的 Org 系统支持离线查看与内容捕获。外部应用还可记录对已有条目的修改。
本附录介绍 Org 对兼容 Org Mobile 的日程视图格式的支持,同时说明如何在移动应用与计算机之间同步笔记等修改内容。
要在移动应用中修改标签和 TODO 状态,首先需要自定义变量 org-todo-keywords 、 org-tag-alist 和 org-tag-persistent-alist 。这些变量应包含所有重要的标签和 TODO 关键字,即使 Org 文件中仅使用其中一部分。尽管移动应用应支持缓冲区内设置,但仅要求其理解这些变量中设置的 TODO 状态 集合 (见 Setting up keywords for individual files)和互斥标签(见 Setting Tags)。
移动应用需要访问服务器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。注意即使移动应用已加密文件内容,文件名在本地计算机、服务器和移动设备的文件系统中仍可见。
命令 org-mobile-push 会将 org-mobile-files 中列出的文件复制到中转目录。文件包含日程文件(见 org-agenda-files 列表)。可自定义 org-mobile-files 添加其他文件。文件名会以相对于 org-directory 的路径保存,因此所有文件应位于该目录内168。
推送操作会创建一个特殊的 Org 文件 ‘agendas.org’ ,包含用户定义的自定义日程视图169。
最后,Org 会写入文件 ‘index.org’ ,其中包含指向其他文件的链接。移动应用会首先从服务器读取该文件,确定需要下载哪些日程相关文件。为加快下载速度,应用通常只会读取校验和170发生变化的文件。
命令 org-mobile-pull 会与服务器同步修改。具体来说,它首先拉取 Org 文件用于查看,随后将捕获的条目、标记或修改条目的指针追加到服务器上的 ‘mobileorg.org’ 文件。Org 最终会通过以下步骤将数据整合为收件箱文件格式:
org-mobile-inbox-for-pull 变量指向的文件。该文件不应位于中转目录或服务器上。每条捕获条目和编辑事件都会成为收件箱文件中的顶层条目。
按下 ? 会在另一个框架中显示完整的标记笔记,并将其写入剪切板。如需将标记笔记保存为普通笔记,可使用 ? z C-y C-c C-c。连续按两次 ? 会执行三项操作:移除 ‘FLAGGED’ 标签;从属性栏中删除标记笔记;标记该条目的手动编辑完成。
在日程调度器中,? 会返回视图以完成标记条目的处理。注意这些条目可能不是最新状态,因为移动应用搜索的是上次拉取的文件。如需获取包含上次拉取后修改的更新日程视图,请再次执行拉取操作。
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 表格。
开启 repeat-mode 后,只需按单个键即可重复执行标题移动、链接和块导航命令。例如,无需反复输入 C-c C-n,只需输入 C-c C-n n n n p u … 即可在不同标题间移动。按下不在映射中的按键时,会退出 repeat-mode 并执行对应按键的命令(更多细节见 Emacs 用户手册)。
默认情况下,以下命令在独立的按键映射中支持重复执行。
org-navigation-repeat-map :
| Command | Key binding | Repeat key |
|---|---|---|
org-next-visible-heading | C-c C-n | n |
org-previous-visible-heading | C-c C-p | p |
org-forward-heading-same-level | C-c C-f | f |
org-backward-heading-same-level | C-c C-b | b |
org-up-heading | C-c C-u | u |
org-block-navigation-repeat-map:
| Command | Key binding | Repeat key |
|---|---|---|
org-next-block | C-c M-f | f |
org-previous-block | C-c M-b | b |
org-link-navigation-repeat-map:
| Command | Key binding | Repeat key |
|---|---|---|
org-next-link | C-c C-x C-n | n |
org-previous-link | C-c C-x C-p | p |
本附录介绍用户可以用来扩展 Org 功能的一些方法。
多位开发者为 Org 编写了大量扩展包。其中部分包曾属于 ‘org-mode’ 代码仓库,现在托管在独立的 ‘org-contrib’ 仓库 此处。包含更多信息的 Worg 页面地址为:https://orgmode.org/worg/org-contrib/。
Org 内置多种超链接类型(见 Hyperlinks),并提供用于添加新链接类型的接口。下面示例展示为 Unix 手册页添加 Org 链接的过程,形式如下:
[[man:printf][The printf manual]]
下面的 ‘ol-man.el’ 文件实现了该功能:
;;; ol-man.el - Support for links to man pages in Org mode
(require 'ol)
(org-link-set-parameters "man"
:follow #'org-man-open
:export #'org-man-export
:store #'org-man-store-link)
(defcustom org-man-command 'man
"用于显示手册页的 Emacs 命令。"
:group 'org-link
:type '(choice (const man) (const woman)))
(defun org-man-open (path _)
"打开 PATH 对应的手册页。
PATH 应为可被 man 命令处理的主题。"
(funcall org-man-command path))
(defun org-man-store-link (&optional _interactive?)
"存储指向手册页的链接。"
(when (memq major-mode '(Man-mode woman-mode))
;; 当前为手册页缓冲区,创建该链接
(let* ((page (org-man-get-page-name))
(link (concat "man:" page))
(description (format "Man page for %s" page)))
(org-link-store-props
:type "man"
:link link
:description description))))
(defun org-man-get-page-name ()
"从缓冲区名称中提取手册页名称。"
;; 同时适用于 `Man-mode' 和 `woman-mode'
(if (string-match " \\(\\S-+\\)\\*" (buffer-name))
(match-string 1 (buffer-name))
(error "Cannot create link to this man page")))
(defun org-man-export (link description format _)
"从 Org 文件导出手册页链接。"
(let ((path (format "http://man.he.net/?topic=%s§ion=all" link))
(desc (or description link)))
(pcase format
(`html (format "<a target=\"_blank\" href=\"%s\">%s</a>" path desc))
(`latex (format "\\href{%s}{%s}" path desc))
(`texinfo (format "@uref{%s,%s}" path desc))
(`ascii (format "%s (%s)" desc path))
(t path))))
(provide ol-man)
;;; ol-man.el ends here
要在 Org 中启用手册页链接,在 Emacs 初始化文件中添加:
(require 'ol-man)
对 ‘ol-man.el’ 的说明
org-link-set-parameters 定义以 ‘man’ 为前缀的新链接类型,并关联用于打开、导出和存储该类链接的函数。完整的可关联项列表可查看变量 org-link-parameters 。
例如,在显示手册页的缓冲区中调用 org-store-link (见 Handling Links)时, org-man-store-link 负责存储链接。该函数接收参数 interactive? 但并未使用,不过其他存储函数在用户交互式存储链接时会有不同行为。函数首先检查主模式是否匹配,若不匹配则返回 nil ,表示不负责为当前缓冲区创建链接;否则将 ‘man:’ 前缀与手册主题拼接生成链接字符串,并提供默认描述。后续可通过函数 org-insert-link 将其插入回 Org 缓冲区。
默认情况下,Org 支持对指向图片文件的 ‘file’ 和 ‘attachment’ 类型外部链接进行预览(见 Images)。
可通过以下方式为 Org 添加其他链接类型的行内预览支持:
org-link-set-parameters 为链接类型添加 ‘:preview’ 链接参数。下面以给 ‘docview’ 链接类型添加预览为例:
(org-link-set-parameters "docview" :preview #'org-link-docview-preview)
函数需返回非空值表示预览成功,返回 ‘nil’ 表示预览失败,放置在链接上的覆盖层会被移除。
本示例中使用 ‘convert’ 程序( ‘imagemagick’ 工具集组件)生成行内显示的缩略图。
(defun org-link-docview-preview (ov path _elem)
"在覆盖层 OV 中预览 PATH 对应的文件。
_ELEM 为链接元素的语法节点。"
(when (executable-find "convert")
(let* ((path (expand-file-name (substitute-in-file-name path)))
(output-file (expand-file-name (concat "org-docview-preview-"
(substring (sha1 path) 0 10)
".png")
temporary-file-directory)))
;; 创建或查找对应路径的预览图
(when (or (file-readable-p output-file)
(= 0 (call-process
"convert"
nil (get-buffer-create "*Org Docview Preview Output*") nil
"-thumbnail" "x320" "-colorspace" "rgb"
"-background" "white" "-alpha" "remove" "-strip"
(concat path "[0]") output-file)))
;; 若预览图片可用,通过覆盖层显示
(overlay-put ov 'display (create-image output-file))))))
org-link-preview 时,会为支持的文档类型(PDF、djvu)生成 docview 链接预览(同时生成图片文件预览)。
Org 的导出引擎便于编写新的后端。构建该引擎所依托的框架,让从现有后端派生新后端变得简单易行。
导出引擎的两个主要入口为: org-export-define-backend 和 org-export-define-derived-backend 。想要理解这些函数,可参考 ‘ox-latex.el’ (从零定义新后端的示例)和 ‘ox-beamer.el’ (从现有引擎派生的示例)。
从零创建新后端时,首先将其名称以符号形式存入由元素与导出函数组成的关联表;要让后端在导出调度器中可见,设置 :menu-entry 关键字;针对该后端的导出选项,设置 :options-alist 。
从现有后端创建新后端时,将 :translate-alist 设置为导出函数的关联表,该表会替换父后端的对应函数。
完整文档见 Worg 上的 Org 导出参考。
凭借 Orgtbl 在表格处理上的出色表现,用户经常提出在 LaTeX 等其他模式中使用 Org 表格功能的需求。若以通用方式实现,极易陷入复杂的自定义困境,还会背离 Orgtbl 所秉持的简洁初衷。不过可以通过另一种方案达到相同效果。
该方案实现一个自定义转换函数,对原生 Org 源表格进行处理,生成其他格式的表格。这种方式能保持运行良好的 Orgtbl 简洁性,将可能的复杂逻辑隔离在转换函数中。要支持更多外部表格格式,只需添加更多转换函数。同时,为新表格格式开发自定义转换函数的工作,也可交由最熟悉对应格式的人员完成。
无线表格是转换后表格的目标位置,与源表格不相邻。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 函数。该行末尾还可包含键值对参数,转换函数会以属性列表形式接收这些值。部分标准参数会在调用转换函数前被识别并处理:
跳过表格前 N 行,水平线同样计入行数,需要跳过则包含在内。
需要跳过的列编号列表。Org 会先自动丢弃带计算标记的列,再将表格发送给转换函数,由函数按 ‘skipcols’ 设置跳过指定列。
为避免源表格在源文件编译或编辑时被改动,可采用以下策略:
\bye 或 LaTeX 中的 \end{document} 之后。
要在 LaTeX 中包裹源表格,使用 ‘comment.sty’173 提供的 ‘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:
当 {{{var(BOOLEAN}}} 非 nil 时,仅返回表格主体行,不包裹在 ‘tabular’ 环境中,默认为 nil 。
包裹每个字段的格式字符串,需包含 ‘%s’ 表示原始字段值。例如用 ‘:fmt "$%s$"’ 为每个字段值包裹美元符号。格式也可使用带列号与格式的属性列表,例如 ‘:fmt (2 "$%s$" 4 "%s\\%%")’ 。也可使用单参数函数替代字符串,函数需返回格式化后的字符串。
将数字以指数形式格式化,规范需包含两个 ‘%s’ 分别插入尾数与指数,例如 ‘"%s\\times10^{%s}"’ 。也可使用带列号与格式的属性列表,例如 ‘:efmt (2 "$%s\\times10^{%s}$" 4 "$%s\\cdot10^{%s}$")’ 。对值应用 EFMT 后,还会继续应用 FMT。可使用双参数函数替代字符串,默认不应用特殊格式。
Orgtbl 模式内置多种转换函数: orgtbl-to-csv (逗号分隔值)、 orgtbl-to-tsv (制表符分隔值)、 orgtbl-to-latex 、 orgtbl-to-html 、 orgtbl-to-texinfo 、 orgtbl-to-unicode 和 orgtbl-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-latex 、 orgtbl-to-texinfo 及其他使用该通用函数的工具。
对于复杂转换,可使用自定义转换函数替代通用转换函数。自定义函数必须接收两个参数并返回单个字符串,包含格式化后的表格:第一个参数为表格(每行是字段列表或符号 hline ),第二个参数为 ‘#+ORGTBL: SEND’ 行指定的参数构成的属性列表。欢迎将你的转换函数分享至 Org 用户邮件列表:mailto:[email protected]。
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:
以下命令用于更新动态区块:
在更新动态区块前,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 进行收缩显示。
Org 提供专用钩子,用于进一步限制日程视图中的条目: agenda 、 agenda*176、 todo 、 alltodo 、 tags 、 tags-todo 、 tags-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>0’177。
随后可通过 org-agenda-skip-function 筛选匹配条目,该函数也支持直接使用 Lisp 表达式,例如 org-agenda-skip-entry-if 和 org-agenda-skip-subtree-if 。示例如下:
若当前条目已设置计划,则跳过。
若当前条目未设置计划,则跳过。
若当前条目设有截止日期,则跳过。
若当前条目设有截止日期或已设置计划,则跳过。
若当前条目的 TODO 关键字为 TODO 或 WAITING,则跳过。
若当前条目的 TODO 关键字为 DONE 状态,则跳过。
若当前条目包含任意时间戳(可能是截止日期或计划时间),则跳过。
若正则表达式在当前条目中匹配成功,则跳过。
除非正则表达式在当前条目中匹配成功,否则跳过。
功能同上,但会检查并跳过整个子树。
以下是不使用自定义函数、直接检索 ‘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: "))))
当 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。
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 ,输出字段如下:
条目分类
标题,不含 TODO 关键字、标签和优先级
日程条目类型,可选值:
todo | 通过 TODO 匹配选中 |
tagsmatch | 通过标签匹配选中 |
diary | 从日记导入 |
deadline | 截止日期 |
scheduled | 计划时间 |
timestamp | 由时间戳选中的约会 |
closed | 在指定日期关闭的条目 |
upcoming-deadline | 截止日期临近提醒 |
past-scheduled | 顺延的计划条目 |
block | 包含对应日期块的条目 |
TODO 关键字(如有)
所有标签(含继承标签),以冒号分隔
相关日期,格式如 ‘2007-2-14’
时间,格式如 ‘15:00-16:50’
包含额外计划信息的字符串
优先级字母(如有)
计算得出的数字优先级
如果议程项的筛选是基于时间戳(包括带有 ‘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";
}
以下是用于操作属性的相关函数说明。
获取光标或标记 POM 处条目的所有属性。包括 TODO 关键字、标签、截止日期与计划时间的时间字符串、计时信息,以及条目内定义的其他属性。返回值为关联列表。若属性键被多次使用,键名可重复出现。POM 可为 nil ,此时使用当前条目。若 WHICH 为 nil 或 all ,获取全部属性;若为 special 或 standard ,仅获取对应子类属性。
获取光标或标记 POM 处条目 PROPERTY 属性的值。默认仅检查条目本地定义的属性。若 INHERIT 非 nil 且条目无该属性,则向上层级查找。若 INHERIT 为符号 selective ,则仅当 org-use-property-inheritance 允许该属性 PROPERTY 继承时,才执行继承查找。
删除光标或标记 POM 处条目的 PROPERTY 属性。
Set PROPERTY to VALUES for entry at point-or-marker POM.
获取当前缓冲区中的所有属性键。
为当前条目插入属性抽屉。
将光标或标记 POM 处的 PROPERTY 属性设为 VALUES。VALUES 应为字符串列表,以空格分隔拼接。
将 PROPERTY 属性的值视为空白分隔的值列表,并以字符串列表形式返回。
将 PROPERTY 属性的值视为空白分隔的值列表,确保 VALUE 存在于列表中。
将 PROPERTY 属性的值视为空白分隔的值列表,确保 VALUE 不在列表中。
将 PROPERTY 属性的值视为空白分隔的值列表,检查 VALUE 是否在列表中。
为特定属性提供可选值的函数钩子。函数接收属性名作为参数,返回可选值列表。若值包含 ‘:ETC’ ,则该列表仅用作补全提示,允许输入其他值。若函数不处理该属性,返回 nil 。
Org 具备强大的映射遍历能力,可查找满足指定条件的所有条目。该功能内部用于生成日程视图,同时也提供 API,可对每个或筛选后的条目执行任意函数。该 API 的主入口为:
在 SCOPE 范围内,对 MATCH 选中的每个标题调用 FUNC。
FUNC 为函数或 Lisp 表达式。光标会定位在标题开头,无参数调用该函数。Org 返回所有函数调用的返回值列表。
为不保留光标位置,Org 会在 save-excursion 中执行 FUNC。执行后光标移至刚处理行的行尾,检索从该位置继续。在部分场景下(如当前子树已被归档删除),该行为可能不符合预期,极少数情况下会错误跳过下一条目。如需避免此类问题,可让 FUNC 将变量 org-map-continue-from 设置为指定缓冲区位置。
MATCH 为标签/属性/TODO 匹配条件。Org 仅遍历匹配的标题;若为 nil 或 t ,则遍历所有标题。
SCOPE 决定命令作用范围,可选值:
nil当前缓冲区,遵循现有限制(如有)。
tree以光标处条目为起点的子树。
region活动区域内的条目(如有)。
file当前缓冲区,无任何限制。
file-with-archives当前缓冲区及其关联归档文件。
agenda所有日程文件。
agenda-with-archives所有日程文件及其关联归档文件。
若为文件名列表,则遍历列表中所有文件。
其余参数用作扫描器的跳过规则,有效参数:
archive跳过带有 ‘ARCHIVE’ 标签的子树。
comment跳过带有 COMMENT 关键字的子树。
作为 org-agenda-skip-function 的值,当函数返回 t 时,对该条目执行 FUNC,并从函数停留位置继续检索。
映射遍历可调用任意函数,包括修改元数据或调用属性 API 的函数(见 Using the Property API)。常用函数如下:
修改条目的 TODO 状态。参数 ARG 可用值较多,详见函数文档。
修改条目的优先级。ACTION 可用值详见函数文档。
切换当前条目的 TAG 标签。将 ONOFF 设为 on 或 off 不会切换,而是直接开启或关闭标签。
提升当前条目层级。
降低当前条目层级。
下面示例将所有带有 ‘TOMORROW’ 标签的条目设为 TODO 关键字 ‘UPCOMING’ ,并忽略注释子树和归档子树。
(org-map-entries '(org-todo "UPCOMING")
"+TOMORROW" 'file 'archive 'comment)
以下示例统计所有日程文件中 TODO 关键字为 ‘WAITING’ 的条目数量。
(length (org-map-entries t "/+WAITING" 'agenda))
Org 诞生于 2003 年,源于我对 Emacs 大纲模式界面的不满。当时我想要整理笔记和项目,使用 Emacs 本是顺理成章的选择。但仅仅为了折叠和展开大纲树的部分内容,就要记住十一个不同的命令,每个命令还要两三个按键,这在我看来完全无法接受。 此外,用大纲记笔记时,我总希望能随时重构结构,让大纲与我的思路和计划同步。 可见性循环 和 结构编辑 最初实现在 ‘outline-magic.el’ 包中,很快就迁移到更通用的 ‘org.el’ 中。 随着这套环境逐渐适合项目规划,我又陆续加入了 TODO 条目 、基础 时间戳 和 表格支持 。这些方向也确立了 Org 至今仍在坚持的两大目标:打造一款基于大纲的纯文本新模式,拥有创新且易用的编辑功能;同时将项目规划能力直接整合到笔记文件中。
自首次发布以来,成千上万封发送给我或邮件列表 [email protected] 的邮件,源源不断地提供了漏洞反馈、使用建议、新功能思路,还有不少补丁与扩展代码。 衷心感谢所有帮助改进这款工具的人。我在此尽量列出对 Org 的一个或多个方面有重要影响的贡献者名单。名单或许并不完整,如果我遗漏了谁,敬请谅解并告知我。
在列出完整名单前,有几位需要特别致谢:
Bastien 为 Org 编写了大量扩展(多数现已并入核心),包括 LaTeX 导出器和纯列表解析器。他在早期的支持对项目成功至关重要。他还创立了 Worg,协助搭建 Org 的官方网站,并承担 orgmode.org 的服务器费用。2011 至 2013 年,在我急需休整时,Bastien 接手担任了 Org 维护者。
Eric 与 Dan 共同开发了 Org Babel 系统,让 Org 成为支持多语言代码执行、文学编程和可复现研究的环境。这已成为 Org 最具标志性的核心功能之一。
John 直接为 Org 贡献了大量优秀思路与补丁,包括附件系统 (‘org-attach.el’)、与 Apple Mail 的集成 (‘org-mac-message.el’)、TODO 条目层级依赖、习惯追踪 (‘org-habits.el’) 和加密功能 (‘org-crypt.el’)。此外,捕获系统很大程度上扩展自他出色的 ‘remember.el’ 。
没有 Sebastian,Org 的 HTML/XHTML 发布功能只会是业余水平的简陋实现。Sebastian 将这部分功能提升到了极高水准。他还编写了 ‘org-info.js’ ,一个用于展示 Org 衍生网页的 JavaScript 工具,提供类 Info 或折叠式界面与单键导航。
完整贡献者名单见下文!再次恳请告知我遗漏的内容!
我从 2011 年 1 月开始维护 Org,并于 2024 年 12 月正式卸任,由 Ihor Radchenko 接任成为新任维护者。最初几年我积极参与开发,之后随着新核心贡献者的加入,参与度逐渐降低,在此向他们致谢。
Eric 一直负责维护 Org 的 Babel 模块。他高效的响应让我无需担心该模块的漏洞问题,得以专注其他部分。
Nicolas 负责维护 Org 底层核心的一致性。他在 ‘org-element.el’ 和 ‘ox.el’ 上的工作极为出色,为大量新功能与新思路打开了空间。他重写了旧版导出器,并协助完成相关文档。更重要的是,在 Org 8.0 的整个开发过程中,他始终可靠稳定。
Achim 重写了 Org 的构建流程,将一批临时脚本改造为稳定的构建系统。他耐心处理了这一变更给用户带来的诸多问题。
没有 Nick,Org 模式邮件列表不会如此友好。他无数次耐心帮助用户解决问题,这份贡献再怎么强调也不为过,也正是他让邮件列表保持活跃。
Kyle 维护着 list.orgmode.org,并负责将 GNU Emacs 上游的改动反向移植到 Org 代码库。他还在邮件列表和私下交流中提供大量帮助,耐心解答问题、专业给出建议与解决方案。
Ihor 于 2024 年 12 月成为 Org 维护者,我非常感谢他愿意承担这份工作。他在邮件列表中响应迅速,致力于提升 Org 核心格式与工具生态,对需要实施的战略方向思路清晰,是社区的宝贵财富。
我得到了无数用户的支持,难以公平地一一列举,但上述几位是 Org 发展历程中不可或缺的人物。
当然,我也衷心感谢 Carsten 信任我,将 Org 维护工作交付于我。他始终如一的支持,让我在社区和代码开发中逐渐建立信心。
Russell Adams 提出了抽屉的设计构想。
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.
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.
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.
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.
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.
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:
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.
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.”
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.
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.
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.
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.
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.
“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.
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.
| 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 |
|---|
| 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 |
|---|
| 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 |
|---|
| 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 |
|---|
| Jump to: | L N O P W |
|---|
| Jump to: | L N O P W |
|---|
本索引并未完整收录所有变量与文本的视觉样式,仅包含手册中提及的内容。如需更完整的列表,可使用 M-x org-customize 并在选项树中逐级浏览。
| Jump to: | C I L O P U |
|---|
| Jump to: | C I L O P U |
|---|
若未全局启用字体锁定,可通过 ‘(add-hook 'org-mode-hook #'turn-on-font-lock)’ 在 Org 缓冲区单独开启。
为减轻邮件列表管理员的工作负担,建议你订阅该邮件列表。
可通过变量 org-special-ctrl-a/e 、 org-special-ctrl-k 以及 org-ctrl-k-protect-subtree 配置标题中 C-a、C-e 和 C-k 的特殊行为。另需注意,计时功能仅对星号数量少于 30 个的标题生效。
详见选项 org-cycle-emulate-tab 。
间接框架包含整个框架的内容,但会 narrowed 至当前大纲树。编辑间接框架同样会修改原框架,却不会影响原框架的可见状态。有关间接框架的更多信息,参见 GNU Emacs Manual。
当 org-agenda-inhibit-startup 为非 nil 时,Org 为日程首次打开文件时不会遵循默认可见性状态,详见 Speeding Up Your Agendas。
另请参阅变量 org-fold-show-context-detail ,用于控制每个匹配项周围显示多少上下文。
该行为受选项 org-remove-highlights-with-change 控制。
使用 ‘*’ 作为项目符号时,行首必须缩进,避免被识别为标题。此外,若隐藏前导星号以获得整洁的大纲视图,以星号开头的普通列表项可能难以与真正的标题区分。简而言之:尽管 ‘*’ 受支持,但仍建议不要将其用于普通列表项。
可通过配置 org-plain-list-ordered-item-terminator 禁用其中一种形式。
可通过配置 org-list-allow-alphabetical 启用 ‘a.’ 、 ‘A.’ 、 ‘a)’ 、 ‘A)’ 等序号格式。为避免与普通文本混淆,此类序号仅限单个字符,超出长度后会自动变为数字序号。
若列表项中包含复选框,统计标记必须置于复选框 之前 。若已启用字母序号列表,也可使用 ‘[@b]’ 这类计数器。
若不希望拆分项,可自定义变量 org-M-RET-may-split-line 。
若希望以此循环切换项,可自定义 org-list-use-circular-motion 。
循环行为见 org-list-use-circular-motion 。
许多桌面环境会拦截 M-TAB 用于窗口切换,此时可改用 C-M-i 或 ESC TAB。
若要在表格单元格内插入竖线,可使用 ‘\vert’ ,或在单词内部使用 ‘abc\vert{}def’ 。
Org 可识别用户输入的 ‘B4’ 格式引用,但在提供可编辑公式时不会使用该语法。可通过变量 org-table-use-standard-references 自定义此行为。
计算时间复杂度为 O(N^2), 因为每个待复制单元格都要重新解析一次 FOO
文件 ‘constants.el’ 可提供两种单位制下的常量值: ‘SI’ 与 ‘cgs’ 。具体使用哪种取决于变量 constants-unit-system 。可通过 ‘STARTUP’ 选项 ‘constSI’ 与 ‘constcgs’ 为当前框架设置该值。
format 与 C 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Strings 与 format 的文档字符串。
format 与 C 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Strings 与 format 的文档字符串。
名称必须以字母开头,仅可使用字母、数字和下划线。
普通 URI 仅支持预定义的协议类型,参见 External Links。与 URI 语法不同,普通 URI 同样不能包含括号或空格,而尖括号包裹的 URI 无此限制。
更准确地说,具体行为取决于光标是如何到达此处的— 详见 Invisible Text。
插入指向标题的链接时可使用框架内补全:在框架中输入星号与若干可选字母,按下 M-TAB,当前框架内所有标题均可作为补全项。
当指向 ‘NAME’ 关键字时, 必须搭配 ‘CAPTION’ 关键字才能获得正确编号(见 Captions)。
可运行 ‘M-x shortdoc-display-group’ 查看所有已知文档组。
搜索的实际行为取决于变量 org-link-search-must-match-exact-headline :值为 nil 时执行模糊文本搜索;值为 t 时仅精确匹配标题(忽略空格与统计标记);值为 query-to-create 时先精确搜索标题,未找到则询问用户是否创建。
必须先加载 org-id 库,可以通过 org-customize 、在 org-modules 中启用 id ,或在 Emacs 初始化文件中添加 ‘(require 'org-id)’ 实现。
同时需要 org-link-context-for-files 和 org-id-link-use-context 均启用,默认即为启用状态。
插入链接并非必须使用该命令。Org 中的链接为普通文本,可直接输入或粘贴至框架中。使用该命令时,链接会自动包裹在双层方括号内,并提示输入可选描述文本。
插入已存储的链接后,该链接会从存储列表中移除。如需保留以便后续使用,可对 C-c C-l 使用三重 C-u 前缀参数,或配置选项 org-link-keep-stored-after-insertion 。
前提是已在 org-link-parameters 中为该链接的 :complete 属性定义了对应函数。
参见变量 org-link-use-indirect-buffer-for-internals 。
为兼容旧版,行号也可跟在单个冒号后。
当然,你可以创建一个只包含长待办事项列表的文档,但这并非必需。
修改变量 org-todo-keywords 后,需在缓冲区中重启 Org mode 方可生效。
这同样适用于议程框架中的 t 命令。
除 ‘@’ 、 ‘^’ 和 ‘!’ 外的所有字符均可使用,这些字符在此处有特殊含义。
Org mode 仅在打开文件并激活时解析这些行。 将光标置于以 ‘#+’ 开头的行并使用 C-c C-c, 即为当前缓冲区重启 Org mode。
对应的缓冲区内设置为: ‘#+STARTUP: logdone’ 。
对应的缓冲区内设置为: ‘#+STARTUP: lognotedone’ 。
参见变量 org-log-states-order-reversed 。
注意在议程框架中按下 SPC 显示条目时, ‘LOGBOOK’ 抽屉会自动展开;可使用 C-u SPC 使其保持折叠。
若同时启用 org-log-done 与状态变更记录,Org 模式可能会记录两个时间戳,但不会两次提示输入备注:若两者均配置,状态变更备注优先,取消任务完成备注。
另见选项 org-priority-start-cycle-with-default 。
若要将子任务排除在全局待办列表之外,参见选项 org-agenda-todo-list-sublevels 。
描述列表除外,不过可通过修改 org-list-automatic-rules 允许该行为。
若希望标记统计下方所有复选框而非仅直接子项,可设置变量 org-checkbox-hierarchical-statistics 。
在无复选框的列表 第一项 执行 C-u C-c C-c 会为列表其余项添加复选框。
与所有缓冲区内设置相同,按下 C-c C-c 可使该行修改生效。
若要将该列表扩展至所有日程文件中使用的标签(参见 Agenda Views),可自定义变量 org-complete-tags-always-offer-all-agenda-tags 。
未配置按键的标签会自动分配按键。
对于 ‘TIMESTAMP’ 与 ‘TIMESTAMP_IA’ : “首个(first)” 指条目中第一次出现的时间戳,而非时间最早的;计时条目开头的 ‘CLOCK:’ 前缀在此处视为关键字;属性抽屉内的时间戳会被忽略。
若同一属性被多次定义列,只有第一个定义会写入属性收纳块。例如 ‘%EFFORT{mean} %EFFORT(Sum){:}’ 只会写入 ‘EFFORT’ 的平均值而非合计值。若第一个列定义不含汇总类型( ‘%EFFORT %EFFORT{mean}’ ),则不会写入收纳块
时长可定义为持续时间,使用 org-duration-units 中定义的单位,例如 ‘3d 1h’ 。若列中存在此类值,汇总结果也会以持续时间形式呈现。
注意 ‘COLUMNS’ 定义必须写在一行内,此处换行仅为排版限制。
扩展包不属于 Emacs 核心,但随 Org 主发行版分发——访问 https://orgmode.org。
Org 日期格式参考标准 ISO 8601 日期/时间格式。如需使用其他格式,参见 Custom time format。手动输入日期时星期名为可选项,而 Org 自动插入或修改的日期会添加该名称以便阅读。
使用标准日记表达式函数时需格外注意参数顺序,其顺序受变量 calendar-date-style 影响。例如指定 2005 年 12 月 1 日,调用形式可能为 ‘(diary-date 12 1 2005)’ 、 ‘(diary-date 1 12 2005)’ 或 ‘(diary-date 2005 12 1)’ ,极易造成混淆。Org 模式用户可使用专用函数 org-date 、 org-anniversary 、 org-cyclic 、 org-block ,用法与对应 diary- 函数一致,但参数固定为 ISO 顺序(年、月、日),不受 calendar-date-style 影响。
参见变量 org-read-date-prefer-future ,将其设为符号 time 可使早于当前时刻的时间自动跳转至次日。
若不需要日历,
可配置变量 org-popup-calendar-for-date-prompt 。
可使用日历命令 . 跳转至今日日期,但插入时间戳的小时部分时,. 会在小时后插入点号;与之相对,C-. 始终跳转至今日。
若觉得干扰,
可通过 org-read-date-display-live 关闭该显示。
任务标记为完成后仍会显示在对应日期中,若不希望如此,可设置变量 org-agenda-skip-scheduled-if-done 。
‘SCHEDULED’ 与 ‘DEADLINE’ 日期会插入在标题正下方,请勿在该行与标题之间添加任何文本。
对应 ‘STARTUP’ 选项 ‘logredeadline’ 、 ‘lognoteredeadline’ 和 ‘nologredeadline’ 。
对应 ‘STARTUP’ 选项 ‘logreschedule’ 、 ‘lognotereschedule’ 和 ‘nologreschedule’ 。
但 Org 不会重复非活动时间戳,参见 Timestamps。
实际目标状态依次取自:
‘REPEAT_TO_STATE’ 属性、字符串类型的 org-todo-repeat-to-state 、
若变量为 t 则取前一个 TODO 状态,或 TODO 序列的第一个状态。
可通过选项 org-log-repeat 或 ‘STARTUP’ 选项 ‘logrepeat’ 、 ‘lognoterepeat’ 、 ‘nologrepeat’ 修改该行为。使用 ‘lognoterepeat’ 时会额外提示输入备注。
计时功能仅对所有星号缩进少于 30 个的标题生效,这是 org-clock-sum 中 lmax 的硬编码限制。
若要假设你在 Emacs 之外仍在处理该任务并恢复计时,使用 ‘(setq org-clock-persist t)’ 。
如需 “即时(on the fly)” 添加预估耗时,可将实现该功能的函数挂入 org-clock-in-prepare-hook 。
任务最近一次重置时间由 ‘LAST_REPEAT’ 属性记录。
另见变量 org-clock-mode-line-total 。
对应的缓冲区内设置为: ‘#+STARTUP: lognoteclock-out’ 。
使用 :step 时, untilnow 从 2003 年初开始计算,而非从时间起点开始。
语言文本可通过变量 org-clock-clocktable-language-setup 设置。
注意所有参数必须写在同一行,此处换行仅为适配手册排版。
在 macOS 设备上,闲置状态基于实际用户闲置时间,而非仅 Emacs 闲置时间。X11 环境下可安装工具程序 ‘x11idle.c’ (位于 ‘org-contrib/’ 仓库),或 Debian 系统中安装 xprintidle 包并赋值给变量 org-clock-x11idle-program-name ,以实现相同的闲置检测逻辑。其他系统下闲置时间仅指 Emacs 闲置时间。
请注意在扁平列表中汇总层级数据存在局限性,参见 Using Column View in the Agenda。
注意,对应 ‘STARTUP’ 选项为 ‘logrefile’ 、 ‘lognoterefile’ 和 ‘nologrefile’ 。
Org 曾为日期/周树捕获提供四种不同目标,现已自动转换为 file+olp+datetree ,并应用 :time-prompt 与 :tree-type 属性。请使用 file+olp+datetree 重写原有日期/周树目标,旧目标已废弃。
日期树为一种大纲结构:顶层为年份,子层级为月份或 ISO 周,最底层为具体日期。
* 2022 ** 2022-10 October *** 2022-10-07 Friday *** 2022-10-08 Saturday
树结构中允许使用 TODO 状态、优先级(priority)、标签(tag)、统计标记(statistics cookies)与 COMMENT 关键字。
文件名非绝对路径时,Org 会视为相对于 org-directory 。
若需原样使用这些序列,可用反斜杠转义 ‘%’ 。
若自定义了链接类型(参见 Adding Hyperlink Types),通过 org-link-store-props 保存的任何属性都可在捕获模板中以类似方式访问。
此处始终指对方而非用户,参见变量 org-link-from-user-regexp 。
如果你将条目或 Org 文件从一个目录移动到另一个目录,可能需要将 org-attach-id-dir 配置为绝对路径。
如果该变量的值不是列表而是单个文件名,则日程文件列表维护在该外部文件中。
使用调度器时,在选择命令前按下 < 会将命令限制在当前文件,直到下一次调度器命令前忽略 org-agenda-files 。
为兼容旧版,也可按 1 限制到当前缓冲区。
为兼容旧版,通用前缀参数 C-u 会使所有 TODO 条目列在日程之前,该功能已废弃,建议使用专用 TODO 列表或区块日程(参见 Block agenda)。
示例中变量 org-anniversary 与 diary-anniversary 类似,但参数顺序严格遵循 ISO 格式,与 calendar-date-style 无关。
字母数字和下划线前的反斜杠会被忽略。
不过,你可以将变量 org-agenda-search-headline-for-time 设置为 nil 来禁用此功能。
自定义日程命令可通过绑定变量 org-agenda-tag-filter-preset 、 org-agenda-category-filter-preset 、 org-agenda-effort-filter-preset 或 org-agenda-regexp-filter-preset 预设过滤器。该过滤器会应用至视图,并在刷新与次级过滤时保留。过滤器为整个日程视图的全局属性,在区块日程中仅应在全局选项段设置,而非单个区块段内。
此处仅尊重标签过滤,忽略耗时过滤。
你也可以通过 org-agenda-bulk-custom-functions 创建持久化自定义函数。
当设置 org-agenda-include-diary 时,该文件会被日程解析。
可通过包含前缀与描述的 cons 单元为前缀键添加说明。
此处 “已规划(planned)” 指条目附带规划信息,如时间戳、计划日期或截止日期。如何设置纳入统计的规划信息,参见 org-agenda-entry-types 。
HTML 导出需安装 Hrvoje Nikšić 的 ‘htmlize.el’ ,可从 NonGNU ELPA 或 作者仓库 安装。
生成 PDF 输出需系统安装 Ghostscript ps2pdf 工具。选择导出 PDF 时同时会生成 PostScript 文件。
若需保存标准视图(如周日程、全局 TODO 列表),需先为其定义自定义命令才能指定导出文件。
引号规则因系统而异,示例见 FAQ。
标记仍会被识别,只是不会在 Emacs 中进行视觉高亮。
底层标记仍为上下标,仅视觉显示与导出行为改变。
可通过设置变量 org-pretty-entities 默认开启,或在文件中使用 ‘STARTUP’ 选项 ‘entitiespretty’ 。
可通过 ‘-’ 导出设置禁用该行为,见 Export Settings。
LaTeX 是基于 Donald E. Knuth 的 TeX 系统的宏体系。此处描述为 “LaTeX” 的许多功能实际源自 TeX,为简便起见不再严格区分。
使用 MathJax 时,仅处理其支持的环境;使用 dvipng、dvisvgm 或 ImageMagick 套件生成图片时,可处理任意 LaTeX 环境。
相关工具分别可在 https://sourceforge.net/projects/dvipng/、http://dvisvgm.bplaced.net/ 及 ImageMagick 套件获取。通过设置变量 org-preview-latex-default-process 选择转换器。
Org mode 提供判断光标是否在片段内的方法,见函数 org-inside-LaTeX-fragment-p 文档。
HTML 后端可自动实现该功能(需安装 1.34 及以上版本的 ‘htmlize.el’ 包)。LaTeX 中高亮代码块可使用 listings、minted 包或 engrave-faces 实现,详情参见 org-latex-src-block-backend 。
代码块中的源代码可交互式执行或在导出时执行,有关代码块执行的更多信息参见 Working with Source Code。
在 ‘src’ 片段中,参数必须紧跟语言名称,置于 header arguments 之前
这需要一段 JavaScript,且 不会 自动包含在 HTML 输出中;必须将变量 ‘org-html-head-include-scripts’ 设为 t 才会包含,默认值为 nil 。
在 ‘-n -r’ 基础上添加 ‘-k’ ,可在为链接使用行号的同时 保留keeps 源码中的标签,这在讲解 Org 示例代码时很有用。
可通过变量 org-edit-fixed-width-region-mode 选择其他模式。
图片链接指指向现有图片文件的 ‘file:’ 和 ‘attachment:’ 链接;Emacs 仅能显示 image-types 变量中列出的链接图片。
Emacs 对图片的识别取决于 image-file-name-extensions 和 image-file-name-regexps 。
图片宽度自定义要求 Emacs ≥ 24.1 且编译时支持 ImageMagick。
对应的缓冲区内设置为: ‘#+STARTUP: fninline’ 或 ‘#+STARTUP: nofninline’ 。
对应的缓冲区内选项为 ‘#+STARTUP: fnadjust’ 和 ‘#+STARTUP: nofnadjust’ 。
许多桌面环境会拦截 M-TAB 用于窗口切换,此时可改用 C-M-i 或 ESC TAB。
变量 org-export-date-timestamp-format 定义该时间戳的导出格式。
导出为 LaTeX 格式(或 Beamer 等相关格式)时,需额外配置变量 org-latex-package-alist ,参见 LaTeX specific export settings。
当前部分导出后端不遵循该规则:例如 LaTeX 导出默认将所有无编号标题排除在目录外,除非将自定义变量 ‘org-latex-toc-include-unnumbered’ 设为 ‘t’ ,或在章节属性中添加 ‘:UNNUMBERED: toc’ 。
注意 org-link-search-must-match-exact-headline 本地绑定为非 nil ,因此 org-link-search 仅匹配标题与命名元素。
将 org-export-replace-macros 设为 nil 可禁用宏替换,默认为 t。
逗号用于分隔参数,参数内的逗号需使用反斜杠转义,仅逗号前的反斜杠需要额外添加反斜杠转义。
与 Literal Examples 相同,需要用 ‘,’ 转义行首 ‘*’ 避免被识别为标题。
若需要限制更宽松的导出规则,可改用选择标签(见 Export Settings)。
若设置 ‘BEAMER_ENV’ ,Org 导出会添加 ‘B_environment’ 标签以便识别,该标签仅为视觉提示,无语义含义。
默认情况下 Org 从 jsDelivr 加载 MathJax,遵循 MathJax 组件快速上手 中的推荐配置。
注意导出的公式为 HTML 文档一部分, ‘<’ 、 ‘>’ 、 ‘&’ 等符号具有特殊含义,参见 MathJax TeX and LaTeX in HTML documents。
若 TODO 关键字与标签的类名冲突,可使用变量 org-html-todo-kwd-class-prefix 与 org-html-tag-class-prefix 确保唯一性。
该命令会打开一个 PDF 文件,也可从 https://mirrors.ctan.org/info/latex-doc-ptr/latex-doc-ptr.pdf 下载
该方式不支持为不同文件设置不同参考文献编译器,不过 latexmk 等 “智能” LaTeX 编译系统可自动选择合适的编译器。
Minted 使用外部 Python 包进行代码高亮,需要在 org-latex-pdf-process 中添加 ‘-shell-escape’ 参数
参见 办公应用开放文档格式(OpenDocument)1.2 版本。
见 MathToWeb。
见 https://dlmf.nist.gov/LaTeXML/。
OpenDocument-v1.2 Specification
见开放文档 v1.2 规范中的 ‘<table:table-template>’ 元素。
见开放文档 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’ 属性。
日记 sexp 事件(部分内置类型除外,见 icalendar-export-sexp-enumerate-all )最多会向未来导出 icalendar-export-sexp-enumeration-days 天。
除非另有说明,导出过程的每一步仅对缓冲区的可访问部分进行操作。当选择子树导出时(参见 The Export Dispatcher),缓冲区会被缩小到所选子树的主体范围,因此缓冲区中除导出关键字外的其余文本不会进入导出结果。
参见 org-export-define-backend 与 org-export-define-derived-backend 文档字符串中的转码器及 :translate-alist 。
参见 org-export-define-backend 文档字符串中的 inner-template 。
若发布目录与源目录相同, ‘file.org’ 会被导出为 ‘file.org.org’ ,因此通常不建议这样做。
可通过选项 org-babel-no-eval-on-ctrl-c-ctrl-c 移除 C-c C-c 的代码执行功能。
实际上, ‘call_<name>()’ 与 ‘src_<lang>{}’ 出现在关键字中时不会被执行,参见 Summary of In-Buffer Settings。
实际上, ‘call_<name>()’ 与 ‘src_<lang>{}’ 出现在关键字中时不会被执行,参见 Summary of In-Buffer Settings。
有关 noweb 文学编程详情,参见 https://www.cs.tufts.edu/~nr/noweb/.
下例中尝试执行第二个代码块会报错,因为第一个代码块中定义的变量在第二个块中无效。
#+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
上一代码块展开时未设置 prompt 与 command 的值。
#+BEGIN_SRC emacs-lisp (concat prompt command) #+END_SRC
引用执行时,光标会定位在被引用代码块处,并使用其头部参数(含继承而来的参数)
更多信息请参考 ‘org-tempo.el’ 中的注释部分。
Org 缩进模式会正确设置 wrap-prefix ,实现标题或长文本行的缩进与自动换行。该次要模式同时兼容可视化行模式与通过 word-wrap 直接设置的参数。
该方式可行但操作繁琐,多数场景下 Org 缩进模式更为便捷。
org-adapt-indentation 也可设置为 ‘'headline-data’ ,此时仅标题下方的数据行会缩进。
注意 Org 缩进模式同时设置 wrap-prefix 属性,使可视行模式(或仅开启 word-wrap )能正确缩进换行长文本(包括标题)。
若需搭建文件服务器,可考虑 WebDAV 服务器,例如 Nextcloud,更多帮助参见此 FAQ 条目。
若 Emacs 配置了安全存储密码功能,则需自定义变量 org-mobile-encryption-password ;请查阅该变量的文档字符串。
org-directory 中的符号链接需要与目标文件同名。
生成日程时,Org 模式会为所有引用条目强制设置 ‘ID’ 属性,以便 Org Mobile 标记后可唯一识别。如需避免自动设置属性,可将变量 org-mobile-force-id-on-agenda-items 设为 nil ,此时 Org 依赖大纲路径标识,需保证路径唯一。
校验和会自动保存在 ‘checksums.dat’ 文件中。
操作后该文件会被清空。
默认情况下 org-yank-dnd-default-attach-method 设为 nil,即与 org-attach-method 使用相同值(默认为 cp )。
https://www.ctan.org/pkg/comment
默认仅支持 LaTeX、HTML、Texinfo 格式,可配置变量 orgtbl-radio-table-templates 为其他模式添加模板。
若 ‘TBLFM’ 关键字包含奇数个美元符号,可能导致 LaTeX 模式中的字体锁定异常。示例中通过在 ‘comment’ 环境内添加额外行平衡美元表达式可修复该问题。若使用 AUCTeX 与 font-latex 库,更佳方案是将 ‘comment’ 环境添加至变量 LaTeX-verbatim-environments 。
agenda* 视图与 agenda 基本相同,区别在于它只处理 /约会事项(appointments)/,即时间戳中包含 ‘[h]h:mm’ 格式时间的计划与截止日期条目。
注意,在 org-odd-levels-only 生效时,层级编号对应结构中的顺序,而非星号数量。