ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

强大的 Org mode(1): 简单介绍与基本使用

本文是《强大的 Org mode》系列的第一篇文章,系列文章如下:

  1. 强大的 Org mode(1): 简单介绍与基本使用 · ZMonster's Blog
  2. 强大的 Org mode(2): 任务管理 · ZMonster's Blog
  3. 强大的 Org mode(3): 表格的基本操作及公式、绘图 · ZMonster's Blog
  4. 强大的 Org mode(4): 使用 capture 功能快速记录 · ZMonster's Blog

简介

Org mode 是 Emacs 的一个插件,能为 Emacs 用户提供一个强大的纯文本编辑环境,下面是 Org mode 官网上对自己的介绍:

Org mode is for keeping notes, maintaining TODO lists, planning projects, and authoring documents with a fast and effective plain-text system.

Org mode 实际上是一种轻量级标记语言,与 RSTMarkdown 类似,不过要比这两者拥有更为强大的功能和特性,是众多 Emacs 用户重度依赖的一个插件,对我个人来说也是构成日常工作、生活必不可少的重要工具。正如它的自我介绍所言, Org mode 与 RST 、 Markdown 相比,除了作为编辑环境以外,还可以进行任务管理、项目规划、笔记收集整理等各种操作 —— 事实上由于 Org mode 作为 Emacs 的插件,构建在 emacs lisp 语言之上,也使得它具备了无与伦比的可扩展性,但同时由于有统一的开发团队进行维护,而使得其语法规则没有因为强大的可扩展性而导致不同方言的泛滥,而 Markdown 就没有避免这个问题。

需要说明的是,作为一个标记语言, Org mode 的基本语法规则其实是很简单的,但它同时还提供了大量的“功能”使得其变得异常强大,但这些功能都是构建在基本的语法规则之上的。对于初学者来说,Org mode 能够很快地上手,而在上手后又还有非常丰富的内容可待探索。

以下是Org mode的几大特性:

  • 基于大纲的编辑(outline-based editing)
  • 灵活强大的任务管理(planning)
  • 任务计时及统计(clocking)
  • 日程管理(agendas)
  • 快速捕获(capture)
  • 功能丰富的表格操作(tables)
  • 导出到多种外部格式(exporting)
  • 文学编程(working with source code)
  • 移动端支持(with your mobile phone)

下图是Org mode官网上的一张示例图,对上述一些特性(outline-based editing, planning, agendas)进行了展示。

org-main.jpg

安装与基础设置

自 Emacs 22 后,Emacs 都自带了可用的 Org mode,在 Emacs 中,Org mode 作为一个 major mode,在用 Emacs 打开(或新建)后缀为 "org" 的文件时即会启用,如果您的 Emacs 在打开 org 文件时没有启用 org-mode 这个 major mode,可以在配置文件中加入:

(add-to-list 'auto-mode-alist  '("\\.org\\'" . org-mode))

另外 Org mode 在默认情况下不开启自动折行,这将导致一行文字的长度超出屏幕范围时,行会继续往右延伸而导致部分内容不可见(因在屏幕范围外而无法看见),要开启自动折行,应在配置中进行设置:

(setq truncate-lines nil)

除此以外,基本上就不用进行其他设置了(至少基本功能的使用是不需要的)。

需要注意的是,Emacs 自带的 Org mode 一般版本都偏旧,存在一些已知的 bug,建议替换为新版本,要达到该目的有两种办法:

  1. 若 Emacs 版本为 24 或更新,可以通过内置的包管理器 elpa 来安装新版的 Org mode,使用 package-install 命令并在要求输入包名时输入 org 。这种方法安装的 Org mode 不需要进行额外配置即可在 Emacs 启动时被加载。
  2. Org mode的官网 上下载最新的包,解压后在 Emacs 的配置文件中添加配置进行加载,比如将其解压在 ~/.emacs.d/site-lisp/org/ 目录下,那么配置语句可以是这样的:

    (add-to-list 'load-path "~/.emacs.d/site-lis/org/lisp")
    (add-to-list 'load-path "~/.emacs.d/site-lis/org/contrib/lisp")
    

    相比用 elpa 安装的方法,这种方法的一个优点是能使用一些其他开发者贡献的、暂未成为核心功能的增强功能,就是上面的第二条配置语句的目的。

基本使用

所谓大纲(outline)

在 Org mode 中,文档内容是通过 headline 来组织成一个树状结构的 —— 由于在 Org mode 中还存在 "title" 这种文章级的标题,为避免混淆,就不对 "headline" 进行翻译了,我们只要知道这几点就行:

  1. headline 是一节内容的标题(概要)
  2. headline 可以分级
  3. headline 可以有子 headline

我想凡是有 Markdown 、RST 乃至 Microsoft Office 使用经验的人,都能理解什么是 "headline"。

headline 在 Org mode 中会被高亮显示,且不同级别的 headline 会以不同的颜色显示。要创建 headline 也很简单,只要一行文字以若干个连续星号(*)顶格,并在星号结束后跟随至少一个空格,则该行会被视为一个 headline ,连续星号的数量被视为 headline 的层级,如图所示。

实际上 Org mode 提供了丰富的快捷键来操作 headline,不需要手动输入星号(*)来创建 headline。以下是这些快捷键的一个总结:

快捷键 功能 备注
C-<return> 在当前 headline 所属的内容后建立一个同级 headline 无 headline 时创建一个一级 headline
M-<return> 在当前 headline 后建立一个同级 headline 同上
M-<right> 降低当前 headline 的层级  
M-<left> 提高当前 headline 的层级  
M-<up> 将当前 headline 及其内容作为整体向上移动  
M-<down> 将当前 headline 及其内容作为整体向下移动  

通过 headline 来组织文档内容便于组织思想,这在很多其他编辑环境或者软件上都有体现,但与它们不同的是,Org能够方便地隐藏各级 headline 下的内容只显示 headline 的树状结构或者只显示第一级headline——这就是所谓 outline 了,如下图所示。只要通过 headline 组织好 Org 文档,概览文档、快速定位和编辑都能很方便地做到。

org-outline.png

通过快捷键 TAB 可以对某个 headline 及其内容的显示在三种状态(Folded, Children, Subtree)中切换;快捷键 S-TAB 则对整个 org 文件的内容显示在三种状态(Overview, Contents, Show all)中切换。Org 的文档称这种行为为"cycling",前者称为"subtree cycling",后者则是"global cycling"。

subtree cycling的状态

  • Folded: 对当前 headline,只显示 headline,其下的子节点及内容隐藏
  • Children: 对当前 headline,显示当前 headline 及其下更低一级的 headline
  • Subtree: 对当前 headline,只显示当前 headline 及其下更低级的 headline

下面的动态图像展示了subtree cycling 的状态变化(Folded -> Children -> Subtre)。

subtree-cycling.gif

global cycling 的状态变化与 subtree cycling 类似,不过针对的是整个文档,下面图像展示了 global cycling 的状态变化(Overview -> Contents -> Show all)

global-cycling.gif

Org mode 的几大特性中,任务管理、任务计时、项目管理都是建立在 outline 结构上的,捕获虽然可以不基于这个结构,但一般来说都会使用。

基本语法

除了 headline 外,Org mode 还支持列表、文字修饰(粗体、斜体、下划线等)、代码块、引用等常见的功能。

  • 列表

    + 无序列表
      * 用"+","-", "*"开头,后跟随用空格分隔开的列表项名称、内容
      * "*"在行首顶格的话则是headline,这个要注意
      * 如果想结束一个列表,那么在其后跟随两个空行
    
    + 有序列表
      1. 用"1.","1)"开头,后跟随用空格分隔开的列表项名称、内容
      2. 其余同无序列表
    

    列表和 headline 一样,也是可以分级、嵌套的,列表相关的快捷键也与 headline 相关的快捷键部分重叠(Org mode 会根据实际情况来进行合理的操作,所以不用担心混淆问题):

    快捷键 功能 备注
    C-<return> 在当前列表项的内容后建立一个同级列表项 光标在列表项同一行时有效
    M-<return> 在当前列表项后建立一个同级列表项 同上
    M-<right> 降低当前列表项的层级 同上
    M-<left> 提高当前列表项的层级 同上
    M-<up> 将当前列表项及其内容作为整体向上移动 同上
    M-<down> 将当前列表项及其内容作为整体向下移动 同上
  • 粗体

    粗体 用两个星号包裹,星号与粗体前后的其他字应该各有至少一个空格或英文标点分隔开来
    bold,word,用英文逗号分隔开,bold显示出粗体效果
    *bold*word则不显示粗体效果
    
  • 斜体

    hello 用""包裹,规则同粗体
    斜体 好像对中文不管用?导出成HTML时看到还是生效了,可能是字体关系吧
    
  • 下划线

    下划线 用"_"在前后包裹,规则同粗体
    _下划线_紧跟其他字,则不生效
    
  • 删除线

    删除线 用"+"在前后包裹,规则同粗体
    
  • 引用块

    #+BEGIN_QUOTE
    引用内容
    #+END_QUOTE
    

    在org文件中输入"<q"然后按 TAB 键会自动插入一个引用块,插入后在其中进行编辑即可。

  • 示例块

    #+Begin_EXAMPLE
    示例
    #+END_EXAMPLE
    

    在org文件中输入 "<e" 然后按 TAB 键来插入一个示例块,可以移动到其中并使用快捷键"C-'(单引号)"来在新窗格中编辑它,编辑好后用同样的快捷键来保存。

  • 代码块

    #+BEGIN_SRC C++
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv)
    {
        cout << "代码块" << endl;
    
        return 0;
    }
    #+END_SRC
    

    代码块稍微复杂一点,插入的话是通过输入"<s"然后按 TAB 键来达到,但插入后还要在"#+BEGIN_SRC"后指定代码的语言类型(如上例所示)。

    Org mode可以根据代码所属的语言来对其进行高亮,不过自Emacs 24.1后,默认设置下不对代码块进行高亮,需要进行设置

    (setq org-src-fontify-natively t)
    

    在编辑代码块的时候也会开启对应语言的 major mode,若对应的语言配置得当,在编辑 Org mode 中的代码块时,自动缩进、自动补全等功能都可以享用。编辑与保存的快捷键同示例块(exmple block)。

    source-edit.gif

    此外在 Org mode 中还可以对代码进行求值,产生了很多丰富的应用方式,这个留待后续。

  • 图片

    在 Org mode 中,可以插入本地图片,并在 Org mode 中进行显示。要做到这个,直接在 org 文件中写入本地文件的路径,然后开启 iimage-mode 即可(M-x iimage-mode)。

    为进行区分,通常会在图片地址前加上"file"前缀,如

    file:/assets/img/source-edit.gif
    
  • 链接

    链接的语法规则是这样的:

    [[<link url>][<text>]]
    

    比如

    [[http://linusp.github.io/][Linusp's Blog]]
    

    会显示为 Linusp's Blog