emacs org-mode 的使用

本文

主要介绍emacs org-model 的使用方法。

版本 说明
0.1 初版发布
0.2 添加Org-Mode导出如何禁用下划线转下标
0.3 添加代码块的介绍

背景

  • 主机: Thinkpad S2
  • 系统: Deepin GNU/Linux 15.11
  • 内核: Debian 6.3.0-18+deb9u1
  • emacs版本:Linux GNU Emacs 26.3

参考

什么是org-mode?

org-mode 是文本编辑器Emacs中一种支持内容分级显示的编辑模式。这种模式支持写 To-Do 列表,日志管理,做笔记,做工程计划或者写网页。

安装

emacs 23以后默认自动安装 org-mode ,如果想安装最新版,可以手动下载安装包或通过emacs包管理器进行安装。手动下载和安装请参考org-mode下载页面

大纲

org-mode强大的操作能力源于它对大纲的支持。

标题

文章中的标题可以通过 #+TITTLE: 来设置标题; 正文中的标题可以通过*,一个*表示一级,两个*表示二级标题。如:

1
2
3
4
#+TITLE: emacs org-mode 的使用
* 这是一个一级标题
** 这是一个二级标题
*** 以此类推(最多10个*)

注意: ‘*’要位于行首;‘*’后面要有一个空格。

大纲相关的快捷键

折叠

快捷键 说明
S-TAB 循环切换 整个文档 的大纲状态(三种状态:折叠,打开下一级,打开全部)
TAB 循环切换光标 所在大纲 的状态 (三种状态:折叠,打开下一级,打开全部)

大纲间移动

快捷键 说明
C-c C-n/p 下/上一标题
C-c C-f/b 下/上一标题(仅限同级标题)
C-c C-u 跳到上一级标题
C-c C-j 切换到大纲浏览状态

基于大纲的编辑

快捷键 说明
M-RET 插入一个同级标题
M-S-RET 插入一个同级TODO标题
M-LEFT/RIGHT 将当前标题升/降级
M-S-LEFT/RIGHT 将子树升/降级
M-S-UP/DOWN 将子树上/下移
C-c * 将本行设为标题/正文
C-c C-w 将子树或区域移动到另一标题处(跨缓冲区)
C-x n s/w 只显示当前子树/返回
C-c C-x b 在新缓冲区显示当前分支(类似C-x n s)
C-c / 只列出包含搜索结果的大纲,并高亮,支持多种搜索方式
C-c C-c 取消高亮

关于大纲显示

org的大纲显示模式会对不同级标题采用不同颜色显示,但是默认的大纲显示没有缩进,如果想添加缩进显示,可以用M-x,输入org-indent-mode。如果想让某个文件默认用这种方式打开,可以在文件头部增加:

1
#+STARTUP: indent

如果希望打开所有org文件都默认用这种方式,可以在.emacs或.emacs.d/init.el中添加如下配置:

1
(setq org-startup-indented t)

轻量级标记语言

Org现在已经成为一种专门的轻量级标记语言,与Markdown、reStructedText、Textile、RDoc、MediaWiki等并列。

段落

可能我们习惯了回车下一行开启新的段落,而在org-mode中,需要回车两次,也就是段落间需要用空行隔开。

字体

*粗体*
/斜体/
+删除线+
_下划线_
下标: H_2 O
上标: E=mc^2
等宽字:  =git=  或者 ~git~

(ox-hugo并未将org中上下标的语法转为markdown,暂时没有解决方案)

列表

列表语法

  • 无序列表以’-'、‘+'或者’*‘开头
  • 有序列表以’1.‘或者’1)‘开头
  • 描述列表用’::’
  • 列表层级用缩进体现

注意事项: 列表符号后面都要有空格;同级别的列表缩进要相同;空两行之后列表结束;

举例如下:

1
2
3
4
5
6
+ treeroot + branch1
    + branch2

+ treeroot
  1) branch1
  2) branch2

列表快捷键

快捷键 说明
TAB 折叠列表项
M-RET 插入项
M-S-RET 插入带复选框的项
M-S-UP/DOWN 移动列表项
M-LEFT/RIGHT 升/降级列表项,不包括子项
M-S-LEFT/RIGTH 升/降级列表项,包括子项
C-c C-c 改变复选框状态
C-c - 更换列表标记(循环切换)

表格

表格语法

任何以‘|’为首个非空字符的行都会被认为是表格的一部分。’|‘也是列分隔符。一个表格是下面的样子:

1
2
3
| Name     | Height | Weight | Age |
|----------+--------+--------+-----|
| Abcdefgh |    178 |    123 |  18 |

创建表格时,首先输入表头(如下),然后在第二行按Tab键,会自动补全表格框架。表格的标题声明可有可无,看个人需求。

1
2
3
#+CAPTION: 表格的标题
| Name  |  Height | Weight | Age|
|-

有时候,表格的某一项特别的长,你可以在任意一个表格的空白项内输入数字来限制其所在列的长度,可以可以通过l、c、r来设置左中右对齐(默认左对齐)。比如(=>代表内容隐藏内容,实际为Abcedfgh):

1
2
3
4
| <5>   | <l5>  |  <r5> | <c5>  |
| Name  | Hei=> | Wei=> | Age   |
|-------+-------+-------+-------|
| Ab=>  |       |       |       |

列表快捷键

快捷键 说明
C-c 竖线 创建或转换成表格
快捷键 说明
C-c C-c 调整表格,不移动光标
TAB 移动到下一区域,必要时新建一行
S-TAB 移动到上一区域
RET 移动到下一行,必要时新建一行
M-LEFT/RIGHT 移动列
M-UP/DOWN 移动行
M-S-LEFT/RIGHT 删除/插入列
M-S-UP/DOWN 删除/插入行
C-c - 添加水平分割线
C-c RET 添加水平分割线并跳到下一行
C-c ^ 根据当前列排序,可以选择排序方式

缺陷

目前表格不支持拆分和合并,只能使用如下格式替代。

| 一级部门 | 二级部门 | 人数 |
|----------+----------+------|
| A        | A.1      | 5    |
|          | A.2      | 6    |
|----------+----------+------|
| B        | B.1      | 7    |
|          | B.2      | 3    |

分隔线

三条短线或以上显示为分隔线。‘—’

链接(图片与网址)

链接语法

链接用于链接一些资源地址,如图片、文件、URL等。如下(可省略链接描述):

1
2
3
[[http://orgmode.org/orgguide.pdf][grgguid.pdf]]]
[[file:/home/maple/图片/test.jpg][a picture]]
[[file:/home/maple/图片/test.jpg]]

直接显示的图片在Emacs里默认不显示,需按C-c C-x C-v才能显示,在输出成其他格式(html、pdf……)后也能看到。

设置图片大小和标题

1
2
3
#+ATTR_HTML: width 100%
#+CAPTION: Black Boy
[[https://raw.githubusercontent.com/cao-arvin/image/master/01-Software-Install/BlackBoy-01.jpg]]

链接快捷键

快捷键 说明
C-c C-l 插入链接和说明
C-c C-x C-v 显示链接图片

标签

Tag的作用

对于信息的管理,有分类(category)和标签(tag)两种方式。这两种方式各有特点:通常分类是固定的,很少变化,而tag随时可以增加。分类通常表现为树状结构,比较清晰,但是树状结构过于简单,不能表达复杂的信息。所以,这两种方式通常结合起来使用。

标记Tag

在Org-mode中,可以对标题增加tag标记。标记的格式如下:

1
  标题                    :标记1标记2:标记3:

而且Org-mode的标签自动按照大纲树的结构继承。即子标题自动继承父标题的标签。比如:

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

则最后一行标题具有 work, boss, notes, action 四个标签。如果希望文档中的所有标题都具有某些标签,只需要定义文档元数据:

1
#+FILETAGS: :Peter:Boss:Secret:

如果手工输入标签,在标题后设置标签,键入’:‘后,M-Tab自动提供标签的补齐。更方便的做法是在正文部分用C-c C-q 或直接在标题上用C-c C-c创建标签,这种方式可以列出所有预定义的标签以便选取。

预定义Tag

预定义的方式有两种:

  • 在当前文件头部定义,这种方式预定义的标签只能在当前文件中使用,每项之间必须用空格分隔,可以在括号中定义一个快捷键;花括号里的为标签组,只能选择一个,对标签定义进行修改后,要在标签定义的位置按 C-c C-c 刷新才能生效:
1
#+TAGS: { 桌面(d) 服务器(s) }  编辑器(e) 浏览器(f) 多媒体(m) 压缩(z)
  • 在配置文件中定义 上面的标签定义只能在当前文件生效,如果要在所有的.org 文件中生效,需要在 Emacs 配置文件 .emacs 中进行定义:
1
2
3
4
5
6
7
8
9
(setq org-tag-alist '(

                    (:startgroup . nil)
                         ("桌面" . ?d) ("服务器" . ?s)
                    (:endgroup . nil)
                    ("编辑器" . ?e)
                    ("浏览器" . ?f)
                    ("多媒体" . ?m)
                    ))

Tag搜索

Tag搜索快捷键

快捷键 说明
C-c \ 按tag搜索标题
C-c / m 搜索并按树状结构显示
C-c a m 按标签搜索多个文件(需要将文件加入全局agenda)

逻辑表达式限制条件

+     和      a+b     同时有这两个标签
-     排除    a-b     有 a 但没有 b
|     或      a|b     有 a 或者有 b
&     和      a&b     同时有 a 和 b,可以用“+”替代

在查询视图中 C-c C-c 退出。

GTD(时间任务管理)

请参考org-mode,最强的任务管理利器,没有之一。我暂时并未使用org-mode进行时间任务管理,待使用后将总结进行补充。其实时间任务管理工具有很多,包括手机移动端,不一定非要使用emacs,不过emacs精神就是用emacs做一切。我用org-mode主要是做笔记和写博客,通过ox-hugo转为hugo识别的markdown文档,再通过hugo生成站点文件。

Org-Mode导出如何禁用下划线转下标

更多时候我们需要将org文件导出为pdf或html文件,这就会遇到一个问题,emacs org mode会将下划线转为下标格式,对导出的文件浏览很有影响。解决这个问题可参考如下两个方法:

  • 在org文件添加OPTIONS:
1
#+OPTIONS: ^:nil
  • 在配置文件(.emacs/init.el)添加如下设置:
1
(setq org-export-with-sub-superscripts nil)

代码块

对于程序员来讲,写文章时免不了需要展示代码,org-mode的代码块的关键字是“#+BEGIN_SRC … #+END_SRC” ,在SRC后指明语言,可以支持缩进和语法高亮显示。示例如下(为了展示完整代码,对代码块关键字使用//进行了注释):

1
2
3
4
5
6
7
8
9
//#+BEGIN_SRC verilog
  module tb;
      reg clk;
      initial begin
          clk = 1'b0;
      end
      always #5 clk = ~clk;
  endmodule
//#+END_SRC
  • 高亮显示:如果在org-mode编辑时代码不支持高亮显示,首先查看语言名称是否拼写错误(支持的常用语言类型罗列在了下面),如果确认无误,代码仍未高亮显示,请将代码“(setq org-src-fontify-natively t)”添加到.emacs或.init.el文件。
语言 标识符
C C
C++ C++
CSS css
Emacs Lisp emacs-lisp
Java java
Javascript js
LaTeX latex
Lisp lisp
MATLAB matlab
Org mode org
Perl perl
Python python
shell sh
SQL sql
  • 缩进:在SRC代码块中,使用TAB键会按照语言格式自动缩进,如果未实现缩进,在非语言类型拼写错误下,请将代码“(setq org-src-tab-acts-natively t)”添加到.emacs或.init.el文件。(选中代码区域然后组合键C-M-\可以实现选择区域的自动缩进)
  • 快速输入代码块:代码块的标签当然可以手动编辑,不过emacs提供了快捷键:先输入“<s”,然后按下TAB键,可自动创建代码块。其次还有以下快捷键,本人使用不多,读者可自行了解:
    • <s + TAB 可以直接生成 #+BEGIN_SRC
    • <e + TAB 可以直接生成 #+BEGIN_EXAMPLE
    • <l + TAB 可以直接生成 #+BEGIN_EXPORT latex
    • 如果是单行代码,可以直接使用”: xxxx"来表示,不过格式为text,这对展现一个命令示例非常有用。
  • 另外光标在 SRC 区域的时候,C-c ' (单引号)可以弹出一个代码编辑区域。这里可以方便的编辑代码,编辑结束后kill此buffer即可。

脚注

在 org mode 中,你可以为你的文章添加注脚(footnote)。注脚的格式有两种,一是方括号+数字,二是方括号+fn+名字。

光标移动到插入脚注的位置,快捷键 C-c C-x f,接下来会自动跳转到文章末尾,填写脚注内容(注意:必须要顶格写):

1
2
[1] The link is: http://orgmode.org
[fn:orghome] The link is: http://orgmode.org

输入法切换

emacs自带输入法,快捷键是Ctrl-\,这里倒不是要使用emacs的输入法,而是为了在不知道啥原因敲错,导致emacs为拼音输入时,可以自己切换回来。


文章原创,可能存在部分错误,欢迎指正,联系邮箱 cao_arvin@163.com。