第 32 章 组织你的意念:Emacs org mode
目录
引子
真正优秀的软件,通常都包括多个平台的版本,OneNote 是个例外[81]
不只一次,我听到很多 Linux 的用户抱怨开源软件中没有可以替代 OneNote 的软件。当然也有许多种权宜之计来解这个燃眉之急,比如 SunBird、osmo,甚至是 Wiki、Blog
SunBird、osmo 的操作太过 Windows,并且不如 OneNote 好用;Wiki、Blog 部署成本太高,且不够灵活……
Emacs 的 Org-mode 在一定程度上可以替代 OneNote,有些方面甚至更好
Org-mode | OneNote | |
---|---|---|
标签 | 强大 | 不支持 |
日程表 | 强大 | 不支持 |
界面 | 字符 | 漂亮 |
TablePC | 不支持 | 非常好 |
摘录 | 保持源格式 | |
便捷 | Emacs 内置 | 安装麻烦 |
[81] 不得不承认,OneNote 在 Windows 平台原生软件中罕见优秀
简介
Org-mode 主要包含标签、待办、日程表几大部分
规模效应. 如果资料只有几十几百条,借助分类的方式可以有效管理,但是资料的条目超过了一定的数量,标签更管用。好比传统的邮箱,使用分类的方式管理邮件;而 Gmail 由于起点容量很大,所以提供了标签
组织. 提供了标签进行宏观控制,别外还有日程表作为快速通道
构思与发布. Org-mode 不但可以整理思路,而且拥有比较完善的发布功能
配置
首先对 Org-mode 进行一些简单的配置,在 .emacs
文件中写入:
(setq org-hide-leading-stars t)
(define-key global-map "\C-ca" 'org-agenda)
(setq org-log-done 'time)
建立一个 org 文件
新建一个名为 sandbox.org
的文件[82],头部内容如下:
#+STARTUP: overview
#+TAGS: { 桌面(d) 服务器(s) } 编辑器(e) 浏览器(f) 多媒体(m) 压缩(z)
#+TAGS: { @Windows(w) @Linux(l) }
#+TAGS: { 糟糕(1) 凑合(2) 不错(3) 很好(4) 极品(5) }
#+SEQ_TODO: TODO(T) WAIT(W) | DONE(D!) CANCELED(C@)
#+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS
提示:这里的内容可以随时更改,但是要记得在改后用
C-c C-c
刷新设置设定标签,括弧中的为标签快捷键(如果没有指定,默认为首字母)。可以设置在多行中
大纲
在这个新建的文件中插入下面内容:
* 工作
** Emacs
神之编辑器
*** org-mode
组织你的意念
** Vim
编辑器之神
** EmEditor
* 娱乐
** Mplayer
全能播放器
* 网络
** firefox
** IE
** PureFTPD
* 其它
** WinRAR
*
之后有一个空格,一定不能省略- 每一个
*
代表一级分支,***
就代表第三级分支
现在你的 Emacs 应该显示这样的内容
其实这就是一个大纲模式,只是 Org-mode 用更醒目的色彩来显示,并且快捷键方便一些
按下 S-TAB
,会显示概览:
把光标定位在 * 工作
这一行,按几下 TAB
提示:连续按下
TAB
键,会在显示分支、全部显示、全部隐藏几种状态间循环切换,S-TAB
作用于全部分支
以下快捷键控制 Org-mode 显示
C-c C-a | 全部显示 |
C-c C-x b | 在一个新缓冲区中显示当前分支 |
当一个 org
文件内容很多时,使用 Emacs 的快捷键移动就很没有效率,可以使用 Org-mode 内建的移动键
向前 | 向后 | |
---|---|---|
同级 | C-c C-f | C-c C-b |
跨级 | C-c C-n | C-c C-p |
上一级 | C-c C-u | |
跳转 | C-c C-j |
对分支结构进行修改:
C-RET | 加入新的同级标识 |
M-left | 将当前项提升一级 |
M-right | 将当前项降低一级 |
M-S-left | 将当前分支提升一级 |
M-S-right | 将当前分支降低一级 |
M-S-up | 将当前分支向上移动 |
M-S-down | 将当前分支向下移动 |
C-c C-x C-k | 删除当前分支 |
C-c C-x M-w | 复制当前分支 |
C-c C-x C-y | 粘贴分支 |
C-c C-w | 移动当前分支 |
C-c * | 为当前分支加入内容 |
内容
可以在项标题下随意的插入内容。通过下面方式插入链接:
[[链接地址][链接名称]]
如果不想定义链接的名称,可以这样:
[[链接地址]]
如果想修改这个链接,在链接后按下 backspace
[82] Emacs 打开扩展名为
.org
的文件时自动进入 Org-mode
标签
使用
对于信息的管理,有分类和标签两种方式。
分类的方式,每一个项只能属于一个分类,但是分类的方法往往不只一种,比如一个软件,从类型上分,可以有编辑器、浏览器等,从评价上分,可以是好、坏;如果使用类型来分类,就不能使用评价来分类;而标签的方式可以很好的解决这个问题
将光标定位在当前项(Emacs)上,按下 C-c C-c
- 注意回显区中的内容:[a-z]用快捷键选取 [SPC]清除所有标签 [RET]确认 [TAB]自由输入(不建议) [!]取消组(同一组签标可以多选) [C-c]单选多选切换
使用快捷键 s
选中“服务器”,然后再按 d
选中桌面,可以看到,两个不能同时选,因为它们是一组标签,只能选一个。再分别按下 e
和 5
,回车确认:
接下来在 *** org-mode
上 C-c C-c
可以看到,它自动继承了“桌面”、“编辑器”、“极品”三个标签,而它自己拥有“应用”这个标签
定义
在当前文件头部进行定义:
#+TAGS: { 桌面(d) 服务器(s) } 编辑器(e) 浏览器(f) 多媒体(m) 压缩(z)
每项之间必须用空格分隔,可以在括弧里定义一个快捷键;花括号里的为标签组,只能选择一个
对标签定义进行修改后,要在文件头部按下 C-c C-c
刷新[83]
也可以在 Emacs 配置文件 .emacs
中进行定义
(setq org-tag-alist '(("编辑器" . ?e) ("浏览器" . ?f) ("多媒体" . ?m)))
在配置文件中设置的是全局标签,只要是 org-mode,无论是否在头部进行设置,都可以使用这些标签。不推荐这种方式
查询
设置标签的主要目的还是为了查询。org-mode 会为搜索结果建立一个视图
C-c \ | 搜索标签 |
C-c / T | |
C-u C-c \ | 搜索带 TODO 的标签 |
可以使用逻辑表达式限制条件,更准确灵活的搜索
+ | 和 | a+b | 同时有这两个标签 |
- | 排除 | a-b | 有 a 但没有 b |
| | 或 | a|b | 有 a 或者有 b |
& | 和 | a&b | 同时有 a 和 b,可以用“+”替代 |
在查询视图中 C-c C-c
退出
[83] 在文件头部按下
C-c C-c
为刷新设置;在项标题按下C-c C-c
为设置标签
事件
事件默认有两种状态“TODO”、“DONE”,在项标题上 C-c C-t
切换事件状态;M-S-RET
新建事件
定义
在文件头部定义事件状态:
#+SEQ_TODO: TODO | DONE CANCELED
#+SEQ_TODO: TODO(T) | DONE(D) CANCELED(C)
#+SEQ_TODO: TODO(T!) | DONE(D@) CANCELED(C@/!)
也可以在配置文件中设置全局事件状态:
(setq org-todo-keywords
'((sequence "TODO" "|" "DONE" "CANCELED")
(sequence "REPORT" "BUG" "KNOWNCAUSE" "|" "FIXED")
))
操作
C-u C-c C-t | 手动输入 TODO 状态,如果设定快捷则使用快捷键输入 |
S-right | 循环切换 TODO 状态,两个以上 TODO 状态时使用 |
S-left | |
C-S-right | 组间切换 |
C-S-left | |
C-c C-v | 查询视图 |
C-c / t | |
C-c a t | 全局 TODO 列表 |
日程表
在 Emacs 配置文件 .emacs
定义日程表快捷键:
(define-key global-map "\C-ca" 'org-agenda)
C-c [
将当前文件加入日程表,C-c a
a | 本周事件 |
t | 显示所有事件 |
m | 查询标签 |
L | 当前缓冲区时间线 |
s | 查询关键词 |
T | 查询带 TODO 关键词的项 |
M | 查询带 TODO 关键词的标签 |
# | 显示已停止事件 |
q | 退出日程表 |
可以将多个 org 文件从日程表加入、移除,或者将日程表锁定在当前 org 文件的某个分支:
C-c [ | 将当前文件加入日程表。如果已加入,移动到前面 |
C-c ] | 将当前文件从日程表中移除 |
C-c C-x < | 锁定到当前树(只显示当前树的事件) |
C-c C-x > | 解除锁定 |
优先级
事件有“A”、“b”、“C”三种优先级别,使用 C-c ,
手动设定级;使用 S-up
和 S-down
进行调整
进度
可以给事件设定进度,使用类似 [66%]
或者 [2/3]
这样的形式
时间
C-c C-d
设定截止日期(DEADLINE);C-c C-s
设定计划(SCHEDULED):
C-c .
在当前位置插入一个时间戳:
时间标记都会显示在日程表的本周事件中:
C-c . | 插入时间戳;如果连续插入两个时间戳,则插入一个时间范围 |
C-u C-c . | 更加精确的时间戳,在日程表中以时间线显示 |
C-c ! | 插入时间戳,不在日程表中显示 |
C-c < | 直接插入时间戳(当前日期) |
C-c > | 查看日历 |
C-c C-o | 访问当前时间戳的日程表 |
S-left|S-right | 以天为单位调整时间戳时间 |
S-up|S-down | 调整光标所在时间单位;如果光标在时间戳之外,调整时间戳类型(是否在日程表中显示) |
C-c C-y | 计算时间范围长度 |
列视图
C-c C-x C-c
进入列视图;按 q
退出:
在文件头部设置列:
#+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS
C-c C-x C-c | 进入列视图 |
r|g | 刷新 |
q | 退出 |
left|right | 在列间移动 |
S-left|S-right | 改变当前列的值 |
n|p | |
1~9,0 | 用编号选择值 |
v | 查看当前值 |
典型应用
复制保存为 .org
文件,尝试进行一些操作
清单
#+STARTUP: overview
#+TAGS: { 工作(x) 娱乐(y) 杂项(z) }
#+TAGS: { 编辑器(e) 网络(w) 多媒体(m) 压缩(z) 窗口管理器(c) 系统(s) 终端(t) }
#+TAGS: { 糟糕(1) 凑合(2) 不错(3) 很好(4) 极品(5) }
#+SEQ_TODO: TODO(T) WAIT(W) | DONE(D!) CANCELED(C@)
#+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS
* Emacs :工作:编辑器:极品:
* Vim :工作:编辑器:很好:
* EmEditor :工作:编辑器:不错:
* bash :工作:系统:很好:
* zsh :工作:系统:极品:
* rxvt-unicode :工作:系统:很好:
* tilda :工作:系统:很好:
* awesome :杂项:窗口管理器:很好:
* openbox :杂项:窗口管理器:很好:
* xfce4 :杂项:窗口管理器:不错:
* firefox :杂项:网络:很好:
* IE :杂项:网络:糟糕:
* lftp :杂项:网络:很好:
* wget :杂项:网络:很好:
* aria2 :杂项:网络:很好:
* 迅雷 :杂项:网络:极品:
* mplayer :娱乐:多媒体:很好:
* 暴风影音 :娱乐:多媒体:不错:
日志
#+STARTUP: overview
#+TAGS: { 工作(x) 娱乐(y) }
#+SEQ_TODO: TODO(T) WAIT(W) | DONE(D!) CANCELED(C@)
#+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS
* <2008-10-21 二>
** DONE <2008-10-21 二 11:38> :工作:
CLOSED: [2008-10-21 二 11:42]
do …………
** DONE <2008-10-21 二 11:45> :工作:
CLOSED: [2008-10-21 二 11:42]
do …………
** CANCELED <2008-10-21 二 12:38> :娱乐:
CLOSED: [2008-10-21 二 11:42]
- State "CANCELED" [2008-10-21 二 11:43] \\
太忙了
do …………
** DONE <2008-10-21 二 14:50> :工作:
CLOSED: [2008-10-21 二 11:43]
do …………
* <2008-10-22 三>
** DONE <2008-10-22 三 11:38> :工作:
CLOSED: [2008-10-21 二 11:44]
do …………
** WAIT <2008-10-22 三 12:30> :工作:
do …………
** TODO <2008-10-22 三 13:50> :工作:
do …………
** TODO <2008-10-22 三 20:43> :娱乐:
do …………
头脑碎片整理
#+STARTUP: overview
#+TAGS: { 工作(w) 娱乐(p) 学习(s) }
#+TAGS: { 当前(1) 近期(2) 远期(3) } { 容易(e) 麻烦(t) 困难(d) }
#+TAGS:
#+SEQ_TODO: 待办(T) 等待(W) | 完成(D) 取消(C) 委托(A)
#+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS
* 待办 介绍Org :工作:当前:
** 完成 说明 :容易:
CLOSED: [2008-10-21 二 12:04]
** 完成 截图 :麻烦:
CLOSED: [2008-10-21 二 12:04]
** 等待 举例 :困难:
* 学习 :学习:近期:
** 完成 DocBook :麻烦:
CLOSED: [2008-10-21 二 12:05]
** 取消 LaTex :麻烦:
CLOSED: [2008-10-21 二 12:05]
* 健身
** 等待 运动
SCHEDULED: <2008-10-26 日>
** 取消 节食
CLOSED: [2008-10-21 二 12:07]
* 编程
** 待办 C语言 :学习:近期:困难:
** 待办 Python :学习:远期:麻烦:
** 取消 PHP :学习:近期:麻烦:
CLOSED: [2008-10-21 二 12:10]
* 临时
** org-mode :工作:当前:麻烦:
DEADLINE: <2008-10-21 二>
要配上图片并举例
** 委托 Docbook介绍 :工作:当前:容易:
CLOSED: [2008-10-21 二 12:12]
有一点改动
使用 Org-mode 的时候其实不用这么一板一眼,可以随意一些,标签和日程表可以帮你把它们整理好