第 32 章 组织你的意念:Emacs org mode

目录

引子

简介

配置

建立一个 org 文件

大纲

内容

标签

使用

定义

查询

事件

定义

操作

日程表

优先级

进度

时间

列视图

典型应用

清单

日志

头脑碎片整理

引子

真正优秀的软件,通常都包括多个平台的版本,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)

1 只高亮显示最后一个代表层级的 *

2 C-c a 进入日程表

3 给已完成事项打上时间戳。可选 note,附加注释

建立一个 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 刷新设置

1 启动时概览

2 设定标签,括弧中的为标签快捷键(如果没有指定,默认为首字母)。可以设置在多行中

3 花括号为标签组,组中的标签只能选一个

4 设定待办状态。将项设置为 | 后面的状态时(DONE CANCELED),会打上 CLOSED 标志

5 设定列视图

大纲

在这个新建的文件中插入下面内容:

* 工作
** 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 选中桌面,可以看到,两个不能同时选,因为它们是一组标签,只能选一个。再分别按下 e5,回车确认:

接下来在 *** org-modeC-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@/!)

1 | 分隔完成与未完成两种状态,完成状态会打上 CLOSED 时间戳

2 设定快捷键

3 ! 打上时间戳;@ 要求说明

也可以在配置文件中设置全局事件状态:

     (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-upS-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

1 百分数表示该列所占宽度

2 优先级

3 事件状态

4 标签

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 的时候其实不用这么一板一眼,可以随意一些,标签和日程表可以帮你把它们整理好