看了不少Emacs和org-mode的学习笔记或教程,这些文章一般是先大赞org-mode一通,然后列出一堆lisp设置和快捷键。Emacs本来就被捧到天上去了,这下倒好,org-mode坐上了玉皇大帝的宝座,凡人靠近不得。所以我一直没学会使用org-mode,太神了,不敢碰。不过最近稍闲,不小心看了一些org-mode的文档,再稍仔细一看:什么神啊仙啊,浮云,都浮云。
Org只不过是一个工具,它的主要应用是:
和其他所有工具一样,到底要不要使用,用哪个功能,这完全取决于个人的需求。别人吹得神乎其神的东西,对你来说它可能是多余的或者干脆就是垃圾。比如说,如果建议MS Office专家去用Org做笔记,他会觉得你很无聊;习惯用手机管理日程的人会觉得Org的日程管理纯属多余;HTML/XML高级用户可能会觉得Org作为一种标记语言使用实在太小儿科。
我很少做笔记,用文本标记语言的机会也很少,所以主要关心org的日程管理功能。学后有两个感想,一是Org功能虽强并不是神,二是学用Org其实也简单。学习方法是:先看懂别人写的文本,然后模仿着写出类似的东西,有空再学一些快捷键改几个Emacs参数。
Emacs键盘命令的约定表示方法:
婴儿学说话都是从模仿开始的,这个方法对所有学习应该都有效。学习org-mode不妨先看看别人写的东西。org-mode撰写的文档可以用任意文本编辑软件打开,最简单的org文档看起来是这样的:
这些文本只有两种元素:标题和普通段落。 以 * 符号开始的行表示该行为标题。
复杂一些的org文档可能看起来是下面这样的:
这些是普通文本,内容比飞机场还平坦,英文称为plain-text,比中文名称直观。但是这么平坦的内容如果粘贴和保存为文本文件,用Emacs打开,情况就不一样了:不仅有颜色,还有超链接。再用C-c C-e hh 命令转成HTML文档然后打开,那就更不一样了( 自己试试 )。
上面的文本包含了些什么?虽然没有囊括org-mode的全部物件,但至少展示了几个方面的东西:
虽然东西不少,但对某人来说不是所有的都要用到,所以建议用到了再去了解。
安装Emacs的步骤就不说了,到这地步相信都有了一定的基础。直入正题吧:
后面这种方式对于使用Emacs编辑程序文件尤其方便,无需改变文件的后缀名。
对于传统意义的标题,Org的设定非常简单:在行首加星号,星号与标题文字之间至少有一个空格,星号的数量表示标题的级别,方法简单明了。你不用为字体、行间距、缩进等设置而烦恼,专心做自己的事情。事实上标题是Org文档句法中唯一不需要通过上下文关系就能确定的内容:一行文本是不是标题只需要看行首字符。例如:
然而,为使标题适应更广泛的应用(不仅仅是表明文档的结构层次),Org对其进行了较复杂的定义。它的完整语法为:
其中:
下面是一个完整标题的例子:
虽然TODO关键词、优先级和标签属于标题的成分,但由于设定较复杂而且功能重要,有关内容将在后面介绍。
Org基于标题的文档编辑方式允许用户在非常简洁的显示模式下对某个或多个标题下的所有内容进行复制、粘贴、移动等操作,相当方便,真正实现了标题在文档管理中的组织者作用。
Org-mode很多编辑命令的使用与光标所处的位置有关,同一个键盘命令如果光标位于不同文本环境可能会有不同的作用,这些命令称为局部命令。例如 C-c * 命令,如果光标位于普通文本或列表项内,它的作用是将该行转成上一级标题的子标题;如果该行已经是标题,则将其变为普通文本;如果在选区内执行该命令,把选区内所有行转成标题;如果选区内第一行是列表,仅把第一行转成标题;如果选区内第一行是标题,则把选区内所有标题行都转成普通文本。
Org扩展了标题的定义,增加了关键词、优先级和标签等元素。这些元素不仅使标题在文档组织发挥更重要的作用,标题的功能也得到了扩展。Org对日程的管理就是基于标题进行的:只要会设定标题就可以用Org管理日程。虽然道理是这样,但要熟练使用Org的日程管理功能还掌握比较多的东西。
TODO关键词是用来表示任务状态或类型的词。Org默认的TODO关键词只有两个:TODO和DONE,但很容易自定义其他的关键词。TODO关键词分为两种。一种是状态关键词,比如“等待”、“开始”和“完成”等,事件处理的过程中其处理状态按关键词顺序从前往后转换。另一种是类型关键词,按事件的轻重缓急分为“紧急”、“优先”、“普通”和“完成”等类型,但事件只有未完成和完成两种状态,所以处理结束后将直接转到“完成”类型,而“紧急”、“优先”和“普通”这些类型之间不能相互转换。
在Org文件中定义的TODO关键词仅适用于当前文件。状态关键词使用 #+SEQ_TODO: 定义,类型关键词使用 #+TYP_TODO: 定义。可以定义多系列的TODO关键词,可以使用中文关键词。
如果经常使用Org进行日程管理,应该在Emacs配置文件中定义常用的TODO关键词,这些定义对所有文件都适用。方法是设置 org-todo-keywords ,如:
仅通过文字对于事件进行分类总嫌苍白无力,能用不同颜色的标签对日程表的事件进行强化分类就会好得多。这一功能可以通过设置TODO关键词的外观变量 org-todo-keyword-faces 实现。如:
Org主要通过标题的 TODO 关键词对待办任务(下面称为任务)进行管理,由于标题是分级的,所以这种管理方式很自然地支持子任务:子标题即子任务。Org的任务定义跟标题定义一样简单,有三种方式:
当然也可以在标题编辑时直接使用 M-S-RET 或 C-S-RET 插入 TODO 标题。
Org的任务主要由标题定制,但也提供了非标题型子任务的设置。对于以“[ ]”开头的列表, Org把它们当作复选框,复选框各选项的选择状态表示完成状态。例如:
复选框有三种状态:未完成、完成和中间状态(如上),可以使用快捷键 C-c C-c 或 C-c C-x C-b 修改。
Org自动将复选框列表的完成状态纳入上一级任务的监控,具体使用说明参看任务进度监控。
你可以设置足够的TODO关键词和外观用来区分待办任务的类型、状态和优先级,但是这不仅使任务设置复杂化,还会导致任务间的关系十分混乱。Org为任务优先级留有专门的位置,即标题的PRIORITY 位置。 Org预定义了任务的三个优先级即 [#A], [#B] 和[#C] ,用于区分类型任务的优先级别。如果不设置任务优先级,默认为B级。
不同优先级的任务在产生日程表时按优先级别先后排列,而其他时候则没有任何差别。为了充分发挥任务优先级的作用,最好在Emacs配置文件中对优先级的范围和外观进行自定义,例如:
在标题上使用 S-UP/DOWN 可以选择和改变任务的优先级。
标签可以直接在标题后手工输入,Org也提供了快捷的编辑命令:
和TODO关键词一样,标签可以预定义并设置快捷选择键,在使用标签编辑命令时将弹出选择菜单:
设置了标签的任务能自动将所设标签属性传递给子任务,称为标签的继承性。这一特性使标签尤其适用于任务的分类。
子任务1和子任务2无需显式贴上 :紧急任务: 就自然拥有该标签,子任务1实际有两个标签 :紧急任务:特急: 。
标签外观也可以修改,方法同 TODO 关键词的外观修改差不多,设置 org-tag-faces 变量。
标题不可能包罗万象,一些任务属性如任务ID不能通过任务标题设定。这些属性可以通过Org文档的内容属性设定.属性定义以PROPERTIES名称开头,以END结束,每项内容均使用两个冒号括起来,如:
现版Org-mode实现了两种简单任务关系的设置:
要使用第一种依赖关系需要打开 org-enforce-todo-dependencies ,即在Emacs配置文件中设置:
要使用第二种依赖关系则需要在主任务下打开任务的 ORDERED 属性,例如:
请客吃饭下的各项工作得按顺序去做。
Emacs提供了桌面日历,不仅附带有公共事件日志(节假日等),还可以帮助你管理预约事件和跟踪项目时间。Emacs日历使用独立的缓冲区和主模式(Calendar模式),执行M-x calendar 命令即可打开并显示3个月的日历,当前月份居中。如果要打开特定时间的日历,用 C-u M-x calendar ,在提示符下输入年(数字)和月(名称)即可。鼠标键在日历模式下具有特殊意义:左键(Mouse-1)选定某天,中键(如果有,Mouse-2)弹出适用于整个日历的命令菜单,右键(Mouse-3)弹出适用于鼠标所指日期的菜单。键盘输入q 直接退出日历(关闭日历窗口)。
下面只介绍和日程安排相关的日历操作,如果你觉得其他的一些用法如日出日落、月圆月缺、玛雅日历等也和你的日程安排有关,请查看 Emacs Manual 。
移动标准时长:
转到周、月、年的开始或结束日期:
转到指定日期:
和移动鼠标有些差别。
Emacs日历可以转换农历,不过现在你不需要自己去做了,下载使用cal-china-x 即可。下载后放到某个位置,如 .emacs.d/addons ,在Emacs配置文件中添加两行:
为简单起见,凡在日历上标示的事件(节日、生日、纪念日或其他)下面都称为节日:
Emacs日历默认不标记节日,如果希望打开日历就能看到节日标记,设置一下:
公共“节日”很多,一些可能是你根本不care的,如果这些都出现在日历和日程表中,肯定很烦人。所以还得定制一下,只显示自己设定的日历事件,比如:
其中:
Emacs可以使用日志(Diary)方式管理日程,方法是设置 diary-file 。但用Org-mode就可以不用那种方式了,所以把它忽略。
时间戳由尖括号 <> 或方括号 [] 表示,前者为激活时间,后者为非激活时间(不加入日程表的时间)。括号内可以包括以下内容组成(按先后顺序):
注意“今天”和“默认日期”所表示的意义是不同的,例如:
日期后面的 -5d 表示截止时间前5天开始在 today 日程表上提醒。如果不设置提醒开始时间则按照 org-deadline-warning-days 的设置进行提醒。日程提醒将一直持续(即使任务过期),直到任务标记为 DONE 状态。如果一个任务既安排了开始时间又设定了截止时间,日程表上的提醒将有重复,可以选择显示哪个。忽略截止时间提醒的设置为:
在标题或复选框列表(不一定是任务)的任何位置输入 [%] 或 [/] ,当使用 C-c C-t 或S-LEFT/RIGHT 改变子任务的状态时Org就会计算完成百分比或分数,如 [1/5] 。通过输入改变TODO关键词状态的方式不触发计算,但可以在进度状态的位置上执行C-c C-c 命令更新状态。
默认情况下任务的进度监控仅计算下一级子任务,要统计所有级别的子任务应在合适的位置设置 :COOKIE_DATA: todo recursive 属性,即:
如果监控的是复选框任务,把 todo 改为 checkbox 。
如果TODO关键词定义时设置了时间标签选项(!),任务状态发生改变时将在该任务的下方记录下状态改变的时间。这项功能很容易使用。如果不想记录某个任务及其子任务的状态更改,可以在任务下设置属性LOGGING 为 nil 。
如上设置后每次将任务改变为 DONE 状态时在任务下添加一行内容 CLOSED: [timestamp] ,而再将 DONE 状态改为 TODO 时该行内容被自动删除。
如果项目结束时你还想对它写点评价子类的话,可以设置
这样每次任务结束时Org就会提示你输入备注,并把它放到“Closing Note”标题下。
我仅粗略看了一下工作计时这个功能的一些介绍。按我的理解,它主要用于写作上,允许你记录和计算你趴在某个标题下的时间。一般人可能不干这么无聊的事情。我对癖好记录(habits tracking)也没什么兴趣。自己看The Org Manual 吧。
Org-mode不要求所有的待办任务都整齐排列到一个文件中,更没有设立专门的诸如.todo类型的文件,因为它的作者们认为我们平时要处理的事情多数都是在记笔记中产生的。任务可以随时随地定制,它们会散落到各个角落(即文件),因此必需使用某些方式把它们收集起来并进行排序和显示。Org能够使用一些标准选择任务并显示在独立的缓冲区中。它提供了7种不同的显示模式:
Org虽然没有定义专门的日程表类型的文件,但要产生特定的日程表总不能天南海北的胡乱查找任务,所以要先指定一些(org)文件为搜索范围。这可以通过设置 org-agenda-files 变量完成,如:
会把 D:/agenda 目录下(不包括子目录)的所有org文件都加入到日程表的搜索范围。也可以使用下面的快捷键逐个添加或删除:
Org-mode产生日程表的快捷键默认不安装,得自己设置:
使用 C-c a 就会弹出日程表视图选择窗口,每个选项都有说明,其中包括前面所说的几种日程表视图,不再啰嗦。日程表默认列出7天内的任务,如果要改变就设置org-agenda-ndays 变量,如:
这是个很fancy的功能,类似于Emacs日历的日志文件管理方式,值得使用。比如:
保存为一个独立的org文件,然后加入你的日程表文件列表,产生日程表时会这些事件。