企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 第 32 章 组织你的意念:Emacs org mode **目录** [](ch32.html#id3155355) [引子](ch32s02.html) [](ch32s03.html) [简介](ch32s03.html#id3155525) [配置](ch32s03.html#id3155572) [建立一个 org 文件](ch32s03.html#id3155664) [大纲](ch32s03.html#id3155803) [内容](ch32s03.html#id3156152) [标签](ch32s04.html) [使用](ch32s04.html#id3156199) [定义](ch32s04.html#id3156315) [查询](ch32s04.html#id3156391) [事件](ch32s05.html) [定义](ch32s05.html#id3156534) [操作](ch32s05.html#id3156626) [日程表](ch32s05.html#id3156706) [优先级](ch32s05.html#id3156869) [进度](ch32s05.html#id3156900) [时间](ch32s06.html) [列视图](ch32s07.html) [典型应用](ch32s08.html) [清单](ch32s08.html#id3157237) [日志](ch32s08.html#id3157250) [头脑碎片整理](ch32s08.html#id3155279) ## 引子 真正优秀的软件,通常都包括多个平台的版本,OneNote 是个例外[[81](ch32s02.html#ftn.id3155369)] 不只一次,我听到很多 Linux 的用户抱怨开源软件中没有可以替代 OneNote 的软件。当然也有许多种权宜之计来解这个燃眉之急,比如 SunBird、osmo,甚至是 Wiki、Blog SunBird、osmo 的操作太过 Windows,并且不如 OneNote 好用;Wiki、Blog 部署成本太高,且不够灵活…… Emacs 的 Org-mode 在一定程度上可以替代 OneNote,有些方面甚至更好 | | Org-mode | OneNote | | --- | --- | --- | | 标签 | 强大 | 不支持 | | 日程表 | 强大 | 不支持 | | 界面 | 字符 | 漂亮 | | TablePC | 不支持 | 非常好 | | 摘录 | 保持源格式 | | 便捷 | Emacs 内置 | 安装麻烦 | * * * > [[81](ch32s02.html#id3155369)] 不得不承认,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](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch32s03.html#org-01) 只高亮显示最后一个代表层级的 ***** > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch32s03.html#org-02) `C-c a` 进入日程表 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch32s03.html#org-03) 给已完成事项打上时间戳。可选 **note**,附加注释 ### 建立一个 org 文件 新建一个名为 `sandbox.org` 的文件[[82](ch32s03.html#ftn.id3155679)],头部内容如下: ``` #+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](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch32s03.html#org-11) 启动时概览 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch32s03.html#org-12) 设定标签,括弧中的为标签快捷键(如果没有指定,默认为首字母)。可以设置在多行中 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch32s03.html#org-15) 花括号为标签组,组中的标签只能选一个 > [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch32s03.html#org-13) 设定待办状态。将项设置为 `&#124;` 后面的状态时(DONE CANCELED),会打上 CLOSED 标志 > [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch32s03.html#org-14) 设定列视图 ### 大纲 在这个新建的文件中插入下面内容: ``` * 工作 ** Emacs 神之编辑器 *** org-mode 组织你的意念 ** Vim 编辑器之神 ** EmEditor * 娱乐 ** Mplayer 全能播放器 * 网络 ** firefox ** IE ** PureFTPD * 其它 ** WinRAR ``` * `*` 之后有一个空格,一定不能省略 * 每一个 `*` 代表一级分支,`***` 就代表第三级分支 现在你的 Emacs 应该显示这样的内容 ![](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) 其实这就是一个大纲模式,只是 Org-mode 用更醒目的色彩来显示,并且快捷键方便一些 按下 `S-TAB`,会显示概览: ![](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) 把光标定位在 `* 工作` 这一行,按几下 TAB ![](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) > 提示:连续按下 `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](ch32s03.html#id3155679)] Emacs 打开扩展名为 `.org` 的文件时自动进入 Org-mode ## 标签 ### 使用 对于信息的管理,有分类和标签两种方式。 分类的方式,每一个项只能属于一个分类,但是分类的方法往往不只一种,比如一个软件,从类型上分,可以有编辑器、浏览器等,从评价上分,可以是好、坏;如果使用类型来分类,就不能使用评价来分类;而标签的方式可以很好的解决这个问题 将光标定位在当前项(Emacs)上,按下 `C-c C-c` ![](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png) * 注意回显区中的内容:[a-z]用快捷键选取 [SPC]清除所有标签 [RET]确认 [TAB]自由输入(不建议) [!]取消组(同一组签标可以多选) [C-c]单选多选切换 使用快捷键 `s` 选中“服务器”,然后再按 `d` 选中桌面,可以看到,两个不能同时选,因为它们是一组标签,只能选一个。再分别按下 `e` 和 `5`,回车确认: ![](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png) 接下来在 `*** org-mode` 上 `C-c C-c` ![](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png) 可以看到,它自动继承了“桌面”、“编辑器”、“极品”三个标签,而它自己拥有“应用”这个标签 ### 定义 在当前文件头部进行定义: ``` #+TAGS: { 桌面(d) 服务器(s) } 编辑器(e) 浏览器(f) 多媒体(m) 压缩(z) ``` 每项之间必须用空格分隔,可以在括弧里定义一个快捷键;花括号里的为标签组,只能选择一个 对标签定义进行修改后,要在文件头部按下 `C-c C-c` 刷新[[83](ch32s04.html#ftn.id3156348)] 也可以在 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 | | &#124; | 或 | a&#124;b | 有 a 或者有 b | | & | 和 | a&b | 同时有 a 和 b,可以用“+”替代 | 在查询视图中 `C-c C-c` 退出 * * * > [[83](ch32s04.html#id3156348)] 在文件头部按下 `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](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch32s05.html#org-21) `&#124;` 分隔完成与未完成两种状态,完成状态会打上 CLOSED 时间戳 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch32s05.html#org-22) 设定快捷键 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch32s05.html#org-23) `!` 打上时间戳;`@` 要求说明 也可以在配置文件中设置全局事件状态: ``` (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` ![](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png) | | | | --- | --- | | a | 本周事件 | | t | 显示所有事件 | | m | 查询标签 | | L | 当前缓冲区时间线 | | s | 查询关键词 | | T | 查询带 TODO 关键词的项 | | M | 查询带 TODO 关键词的标签 | | # | 显示已停止事件 | | q | 退出日程表 | 可以将多个 org 文件从日程表加入、移除,或者将日程表锁定在当前 org 文件的某个分支: | | | | --- | --- | | C-c [ | 将当前文件加入日程表。如果已加入,移动到前面 | | C-c ] | 将当前文件从日程表中移除 | | C-c C-x &lt; | 锁定到当前树(只显示当前树的事件) | | C-c C-x &gt; | 解除锁定 | ### 优先级 事件有“A”、“b”、“C”三种优先级别,使用 `C-c ,` 手动设定级;使用 `S-up` 和 `S-down` 进行调整 ### 进度 可以给事件设定进度,使用类似 `[66%]` 或者 `[2/3]` 这样的形式 ## 时间 `C-c C-d` 设定截止日期(DEADLINE);`C-c C-s` 设定计划(SCHEDULED): ![](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png) `C-c .`在当前位置插入一个时间戳: ![](https://box.kancloud.cn/2016-01-06_568cdb4f68749.png) 时间标记都会显示在日程表的本周事件中: ![](https://box.kancloud.cn/2016-01-06_568cdb4f83cf0.png) | | | | --- | --- | | C-c . | 插入时间戳;如果连续插入两个时间戳,则插入一个时间范围 | | C-u C-c . | 更加精确的时间戳,在日程表中以时间线显示 | | C-c ! | 插入时间戳,不在日程表中显示 | | C-c &lt; | 直接插入时间戳(当前日期) | | C-c &gt; | 查看日历 | | C-c C-o | 访问当前时间戳的日程表 | | S-left&#124;S-right | 以天为单位调整时间戳时间 | | S-up&#124;S-down | 调整光标所在时间单位;如果光标在时间戳之外,调整时间戳类型(是否在日程表中显示) | | C-c C-y | 计算时间范围长度 | ## 列视图 `C-c C-x C-c` 进入列视图;按 `q` 退出: ![](https://box.kancloud.cn/2016-01-06_568cdb4f902e3.png) 在文件头部设置列: ``` #+COLUMNS: %10ITEM %10PRIORITY %15TODO %65TAGS ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch32s07.html#org-31) 百分数表示该列所占宽度 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch32s07.html#org-32) 优先级 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch32s07.html#org-33) 事件状态 > [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch32s07.html#org-34) 标签 | | | | --- | --- | | C-c C-x C-c | 进入列视图 | | r&#124;g | 刷新 | | q | 退出 | | left&#124;right | 在列间移动 | | S-left&#124;S-right | 改变当前列的值 | | n&#124;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 的时候其实不用这么一板一眼,可以随意一些,标签和日程表可以帮你把它们整理好