使用Emacs,必用的技能之一就是org-mode,功能比markdown更多,特别是结合TODO安排日程(另一篇文章单独介绍),md更简洁,各有所爱,此文不进行比较,只介绍功能。
Org-mode的实践场景有笔记管理,任务计划,项目管理等必需的诸项日常工作,此处也是促使我工作中使用Emacs的一个重要原因。此文章针对像我这样的初学者,对Emacs有一定了解,但日常工作中针对org-mode的使用尚未有清晰的方案和最佳的实践,通过本系列文章,介绍org-mode的基础用法,org-mode中对ToDo的管理,及我针对Agenda的日常实践。
纸上得来终觉浅,绝知此事要躬行。
基础用法
用大纲组织文档结构
org使用*号来列提纲的标题。
实例:
- org-mode
** 大纲
介绍
** 语法 - 文档导出
语法
使用* 号标记,位于行首,之后跟一个空格再输入标题。与md的#类似。
最多支持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标题(ToDo会在下篇介绍) |
M-Left/Right | 将当前标题升/降级 |
M-S-Left/Right | 将当前标题及子树升/降级 |
M-S-Up/Down | 将当前标题及子树上/下移 |
C-c * | 将本行设置为标题/正文 |
C-c C-w | 将子树及区域移动至另一标题处(通常我直接用文本剪切) |
C-x n s/w | 只显示当前标题及子树/返回(有用,编辑时可专注于当前标题),org narrow |
C-c C-x b | 在新缓冲区显示当前标题及子树/返回(同 C-c n s) |
C-c / | 只显示搜索结果的大纲并高亮(检索时用) |
C-c C-c | 取消高亮 |
注:更多的快捷键使用C-c C-x C-h查询
显示方式
使用M-x org-indent-mode 切换带缩进的显示方式。
如果想在打开时进入该模式,在文档头部增加
#+STARTUP:indent
如果希望所有org文件都以此种方式打开,在.emacs中增加
(setq org-startup-indented t)
个人感觉缩进很好,树形的展示很容易看出整个结构,但在编辑时与文本的查看习惯不太一致,故我基本不用。
超链接
符合超链接的规则的内容,自动视为超链接
例如:
https://www.baidu.com/ baidu
file:home
链接类型
Possible completions are:
bbdb: bibtex: docview: doi: elisp: file+emacs:
file+sys: file: ftp: gnus: http: https:
info: irc: mailto: message: mhe: news:
rmail: shell:
对于文件链接,可以在后面增加::定位到行数或搜索选项
file:home/tmp/hello.txt::12
file:home/tmp/hello.txt::My Target 找到目标<
可以自定链接
[[link][description]]
[link]
编辑链接
快捷键 | 说明 |
---|---|
C-c C-l | 编辑链接(此处为小写L) |
C-c C-o | 打开链接(相当有用) |
内部链接
定义锚点#<
[[myanchor][内部链接]]
注: 常用功能,内部跳转
脚注
添加脚注链接[[fn:footprint1][脚注]]
定义脚注
- fn:footprint1
注:必须以标题形式定义,我几乎未用过,请用过的朋友指点。
显示图片
使用如下标签插入图片,使用C-c C-x C-v inline方式显示图片,或者使用C-c C-o打开链接。
[[file:a.png]]
字体
符号 | 描述 |
---|---|
*粗体* | 粗体 |
/斜体/ | |
+删除线+ | |
_下划线_ |
表格
强大的表格处理操作,目前唯一缺点是对中文支持有问题,无法对齐,我暂时尚未找到方案解决,有好方法的兄弟请留言介绍一下。
快捷键 | 描述 |
---|---|
C-c | | 创建表格 |
C-c C-c | 重新调整表格缩进 |
Tab | 移动至下一个区域,必要时(行尾)创建一行 |
S-Tab | 移动至上一个区域 |
S-Ret | 移动至下一行,必要时(行尾)创建一行 |
M-Left/Right | 移动列 |
M-Up/Down | 移动行 |
M-S-Left/Right | 删除/插入列 |
M-S-Up/Down | 删除/插入行 |
C-c - | 插入水平分割线 |
C-c Ret | 插入水平分割线并跳到下一行 |
C-c ^ | 根据当前列排序 |
段落
对于单个回车的文本,org认为是在同一个段落,导出时会转化成不同行的同一段落。如果要起新的段落,请敲空白行。
列表
分类: 有序列表,无序列表,描述列表
无序列表,以 - + * 开头
有序列表, 以1.或1)开头
描述列表, 以::将描述隔开
快捷键 | 描述 |
---|---|
Tab | 折叠列表项 |
M-Ret | 插入项 |
M-S-Ret | 插入带复选框的项 |
M-S-Up/Down | 移动列表项 |
M-Left/Right | 升/降级列表项 不包括子项 |
M-S-Left/Right | 升/降级列表项 包括子项 |
C-c C-c | 改变复选框状态 |
C-c - | 更换列表标记 |
Shift | 更换列表标记 |
大纲管理文档的进阶
标签定义
对于信息的管理,有分类和标签两种方式。
分类: 形式固定,很少变化
树状结构,结构清晰
过于简单,不能表达复杂信息
标签: 随时增加,查找方便
多维度
标签的特点:org的标签自动按照大纲树继承,即子标题自动继承父标题的标签。使用:tag:表示,例如
- meeting :work:
** title :boss:
*** TODO prepare list :action:
如果希望文件内所有文档都具有某些标签,在开头定义元数据:
#+FILETAGS:Secret:
快捷键 | 描述 |
---|---|
C-c C-q | 创建标签 |
C-c C-c | 在标题上使用,创建标签 |
预定义标签
在文件开头使用元数据标记,例如:
#+TAGS: Host(h) VM(v)
#+TAGS: meeting(m) work home
提醒: 更改后在定义处记得使用C-c C-c激活修改,否则无法显示
同时,可以通过变量org-tag-alist来创建一个全局标签列表。
如果你已经用 org-tag-alist 定义了喜欢的全局标签, 但又想在一个特定的文件中使用动态标签,那么可以通过添加一个空的 TAGS 选项到这个文件来达到这个目的:
#+TAGS:
默认情况下,org使用mini buffer 输入标签,如果希望使用一个键来完成选择,需要为标签提供唯一的字符,即 Host(h)
在配置文件中这样配置
(setq org-tag-alist '(("@host" . ?h) ("@vm" . ? v ) ("@switch" . ?s)))
如果希望标签仅仅和当前使用的文件关联,使用 @Host(h)
换行可加入\n或者多行配置
标签支持分组,类似单选,允许多个分组
#+TAGS: { @Host(h) VM(v) } Switch(s) Firewall(f)
提醒: 大括号前后空格不要忘记
配置文件中设置组参考以下例子:
(setq org-tag-alist '((:startgroup . nil)
("@host" . ?h) ("@vm" . ?v)
("@docker" . ?d)
(:endgroup . nil)
("switch" . ?s) ("firewall" . ?firewall))
如果至少为一个标签定义了快捷键,按 C-c C-c 时会展示一个特殊的界面,其中列出了当前标题已经继承了的标签,还包含一个可选的标签列表。这个界面提供了下面的快捷键:
a-z... 按这些键时会将对应的标签添加到当前的标题列表中或从当前的标题列表中移除。选择一个具体排它性的标签组时,会将标签组的其它标签移除。
TAB 在迷你缓冲区中输入一个标签,即使这个标签不在预定义的标签列表中。对于缓冲区内的标签,提供了自动完成。当然也可以一次添加多个标签,只要把他们用冒号 ':' 分开。
SPC 清除这行的所有标签。
RET 确认修改
C-g 取消修改
q 如果 /q/ 不是某一个标签的快捷键的话,效果和 *C-g* 相同。
! 关闭组的排它性。这样就可以分配一个组的多个标签。
C-c 在下次修改后(参见下面的详细说明),切换 *auto-exit* 。如果是在专家模式下,第一个 *C-c* 会提供一个窗口。
如果你发现在大部分时候,仅仅需要一个键去修改标签列表,那么可以设置 org-fast-tag-select-single-key 参数。这样就不用按回车来退出快速标签选择了——它会在第一次修改立刻退出。如果在个别情况下需要多个按键,按 C-c 为当前的标签选择关闭 auto-exit (实际上是用 C-c C-c C-c 开始了选择而不是 C-c C-c )。如果将这个变量的值设置为 expert 那么除了多按一个 C-c 时,一般情况下在单键输入标签时选择窗口根本不会出现。
标签搜索
建立好了tag系统,可以将相关信息收集到一个表中
C-c / m 或 C-c \ 标准检索, 按照tag进行检索
C-c a m 按标签搜索多个文件 需要把文件加入全局agenda
导出和发布
自带导出功能: C-c C-e
元数据设置:
#+TITLE: Emacs 最好的编辑器,没有之一
#+AUTHOR: GuoPei
#+EMAIL: xxx@xxx
#+KEYWORDS:emacs ,org-mode
导出为markdown:
M-x org-md-export-as-markdown
必须支持html a标签
以上是简单例子,其他元数据请自行查阅资料,内容相当之多。我最喜欢plain text。
小技巧:
如果遇到段落导出无法换行问题,请在开头加入以下Option,
#OPTIONS: \n:t
发布时设置内容元数据
通常在文档开头,以#+开头
分行区块
#+BEGIN_VERSE
内容区块
#+END_VERSE
发布为html时,转化为
p.verse { margin-left: 3%; }缩进区块
#+BEGIN_QUOTE
区块
#+END_QUOTE
发布为html时,转化为居中区块
#+BEGIN_CENTER
区块
#+END_CENTER代码区块
#+BEGIN_SRC ruby
区块
#+END_src例子
#+BEGIN_EXAMPLE
多行例子使用区块
单行例子以冒号开头
#+END_EXAMPLE注释
#+BEGIN_COMMENT
多行注释
单行以#开头
#+END_COMMENTHTML 区块
#+BEGIN_HTML
嵌入的
#+END_HTML
发布时导入其他文件
#+INCLUDE:"~/.emacs" src emacs-lisp
2,3参数可选,如果不给出,会被当作org正常处理