右舷

宇宙,人类最后的边疆

caak

Inbox,在GTD的定义里面是收集材料的工具。最好的Inbox工具是纸和笔。而Remember在Orgmode里面算是较好的Inbox工 具。它比每次打开org文件来写好非常非常多。它提供的是在emacs启动的情况下,快速的录入工具。如果你的emacs没启动,那用便箋或纸笔会好得 多。原因很简单,emacs什么都好,就是启动太龟了。

配置和基本使用

remember.el在emacs23以上版本是自带的,emacs22及以下版本如果发现没有自带,请自行放狗搜。

  (setq org-default-notes-file "~/.notes")
  

在.emacs中作如上设置,表示你希望将remember产生的note存放在~/.notes中,要我说这可一点也不重要,重要的是下面这一行:

(define-key global-map [f12] 'org-remember)  

快键键。当然,快捷键从来很重要。不过在remember模式中,它显得尤其重要。因为本身remember是随时需要的东西,用完后又应该随时忘 掉。所以调用remember应该越不影响当前的思路又好。一个要键入”M-x org-remember”这么多字符才能调出来的remember又有什么用?

我觉得remeber的用法应该是这样的:

现在我想起来晚上海贼王的汉化应该出新的了,接F12调出remember,输入OP,然后“C-c C-c”保存(C-c C-k是取消),remember buffer自动消失,整个emacs又恢复成写这篇blog的界面。

现在的问题是,我一天可能乱七八糟的出现不少想法,每次都按F12来记录是好的,晚上回家一看,~/.noet里面充满了记录,一条一条分门另类地 复制了不同的org文件中。我承认这是重要的工作,无可避免。可是有些想法我在记录的时候就知道它应该是todo还是普通的笔记,能不能让它们自动归位 呢?

于是我们应该开始介绍:

模版

模版的配置文件如下:

     (setq org-remember-templates
      '(("TODO" ?t "* TODO %?\n %x\n %a" "~/doc/org/home.org" "Tasks")
    ("IDEA" ?i "* IDEA %?\n %i\n %a" "~/doc/org/home.org" "Idea")
    ))  

它的参数是这样的,”TODO”是这个模版的名,”?t”是快捷键,”* TODO %?\n %x\n %a”是整个模版体,然后是该模版要保存的文件,保存后的项目在文件中处于哪个父节点下面(如果没有会自动新建)。

我们以第一个模版为例说一下使用中会发生什么?

当你按下F12(这是我的快捷键)时,会看到buffer被切分成两块,下面出现一个rememeber fuffer。以及一个输入提示(如下图的上半部分所示),按我们之前的设定,出现两个快捷提示。

temp

这时按下“t”,在remember buffer中,会自动接模版体的格式显示出补好的TODO,第一行是“* TODO”,第二行是%x,%x是你触发remember时kill ring(类似于剪贴板)中的内容。最后一行是%a,一个指向你触发remember的地方的link。

这时如果你按下”C-c C-c”保存,这一条TODO项目将会被送到”~/doc/org/home.org”文件中的”Tasks”条目下面。

标签(tags)在管理东西方面有很多应用。比如blog,flickr,前阵子还在小众软件上看到用标签管理文件的软件。

本身,我们在做org管理文件的时候就已经把不同的东西放在不同文件里了。比如我们建了home.org,work.org两个文件,把在家的工作做在home.org里,把公司的放在work.org里面。

但这种用文件来分类的方法有不便的地方:其一,如果我想到一个新的分类,那就必须新建一个文件;其二,如果我有一个工作同时属于两个文件,怎么办?

于是,tags来了。

tags只做一件事:标记这个项目是什么?它的展示样式是这样的

TODO 跟特留尼西特握手                    :苦差:薪水:逃不掉:

你可以按C-c C-c组合键,这里在mini buffer(就是下面的小框)会出现”Tags:”,等待你输入标签,支持中英文。

就是这么简单。

tags的继承

如前所述,本来我们的想法是用文件来进行不同的分类的,也就是说实际上文件就是一种分类,放在work.org中的项目本来就应该拥有work属性,我不想在每一个项目上添一个:work:的蛇足。

这就得说到tags继承的org特性了。

tagin

如图,叶项目“新门”本身有一个属性”苦差”,同时它继续了两个属性,一个来自它的父项目apartment,还有一个来自文件属件work。给一个文件设置属性,需要在文件头加上一行。

#+FILETAGS: :work:

更简单的方法

如果有一些常用的标签不想每次都敲。可以使用orgmode的标签快捷键功能.比如你可以用k来代表苦差,用s来代表薪水。跟很多org设置一样,可以在两个地方完成这些设置。

一个是.emacs文件。它的语法是这样的。

   (setq org-tag-alist '(("苦差" . ?k)
                            ("薪水" . ?s)))  

还有一种做法是在文件的头部加声明。类似这样:

#+TAGS: @office(o) @home(h) @traffic(t)
这里,括号里面的是快捷键

它们的分别在于,前者对于本机所有的org文件都有效。后者刚只对当前文件有效。
这时再给一个项目加标签就会变成这样

tag2

敲相应的快捷键就可以了。

搜索查看tags

使用tags来给项目打标签当然不是为了打打好看而已。我们是要用的。最常用的用法就是用tags来表示context的概念。

江湖传言把事情分类来做能提高工作效率。即是说,如果你有十个电话要打,十个email要回。最好不要打一个电话回一封email再打一个电话再回 一封email,比较好的做法是先打十个电话,然后再连回十个email。还有一个秘笈,是威尔史密斯在<当幸福来敲门>里面教给我们的,如果你不把话筒 放下来,能节约很多打电话的时间。

这就需要我们能够把十个电话项目都取出来,在文件里面一个一个找:phone:标签?别傻了。敲一个C-c a吧,然后再敲m,下方的mini buffer里出现了几个大字”MATCH:”,这里输入”phone”,回车。你的列表中所有文件里的带有phone标签或者属性的项目就都列出来了。 不想要所有项目,只想看TODO?简单,C-c a后不要加m,加个M吧。

输入关键词的时候还可以使用与或非运算,算符如下:phone&work,同时有两个标签的。phone|work,有两个标签之一的。phone-work有phone标签而没有work标签的。

这里,C-c a表示你要求调出agenda view,后面那个命令则指明你想要调出什么样的view。敲后C-c a之后,不要急着敲m,可以看看org都提供了哪些view,我们熟知的有C-c a a,C-c a t等。

不要每次都输关键字

这样看起来,C-a a a也是一种检索,只不过它们是org-mode内置而已,那我也有一些数据视图是经常要用的,有一些是没事就搜一下的。我也要敲三个键就弄出来,不想每次都敲tags。

嘿嘿,改源码把我自己的搜索置进去。倒是不用着急,读代码总是麻烦的。事实上org-mode已经开放了一个自定义view的接口。唤作org-agenda-custom-commands。可以在.emacs文件中设置自己的。

   (setq org-agenda-custom-commands
'(("k" "work haha"
((agenda "")
(tags-todo "work")
(tags-todo "支持")))))  

这段代码表示您定了一个可以用C-c a k 调出来的view,它的描述是”work haha”,view中包含三段数据。最上面是agenda,就是调C-c a a出来的界面,然后一个分隔行,列出tags为“work”的项目,再一个分隔行,列出tags为支持的项目。

官方的说法是提供了一个GUI界面,M-x customize-variable RET org-agenda-custom-commands可以打开。界面如下:

taggui

但我个人还是喜欢使用.emacs文件手写配置。不是我装13,而是GUI界面设计得实在太难用了,我到现在也没弄明白它的用法。

如果你用org-mode来做TODO管理,那么无法避免的是,随着时间的流逝,被DONE的事件会越来越多,那么TODO被会被夹杂在DONE之间,难以查找。同时,由于后期回顾的需要,你也不想简单地将DONE事件删除掉。这个时候,你就需要归档命令了。归档,就是把你不想天天看到的东西,放到你看不到了,或者不怎么影响你的注意力的地方去。org-mode提供了两种归档方式。

内部归档

内部归档是在本文件内部给特定子树打上ACHIVED标签或者移动到名为achived的子树中去并打上标签。
这个被认为是ACIVED的子树,会被移动了本级子树的最末端。

例如有这么一个子树,由三个TODO项目组成。

* blog
       ** TODO 匈牙利命名法
       ** TODO org-mode 归档
       ** TODO BillG审查

C-c C-x a

将某一个节点打上ARCHIVE标签。

  • blog
    ** TODO 匈牙利命名法
    ** TODO org-mode 归档 :ARCHIVE:
    ** TODO BillG审查

C-c C-x A

将当前节点归入一个名为Archive的子树中,并且这个子树是位于当前级别子树的最下方。

* blog
    ** TODO org-mode 归档                    :ARCHIVE:
    ** TODO BillG审查
    ** Archive                                :ARCHIVE:
        *** TODO 匈牙利命名法
            :PROPERTIES:
            :ARCHIVE_TIME: 2010-01-02 六 18:14
            :END:

外部归档

外部归档是指把子树移动到另一个org文件中去。文件名可以自定义。默认情况下,归档的子树会被移动到名为“当年文件名_archived”的文件中去。

C-c C-x C-s是把当前的节点移到archived文件中去。

我个人还是更喜欢在文件内部做归档。因为它兼具归档的好处和查找的方便。

在任何一个树的子树中,只有一个archive子树,只占文档的一行,当你居然查看以前存档的事件时,只能在这个节点上使用”C-TAB”命令即可打开。

假设你已经有了一个或多个带有TODO项目的org文件了,里面不少TODO项目还打上了DEADLINE或SCHEDULED时间戳。你打算怎么观赏它?怎么从一大堆项目中找到今天要处理的事情?打开所有的节点搜索?还是创建时按时间顺序排列?

都不需要,用agenda view就够了。这是一种视图,所谓视图,在我看来就是展示数据的方式。

agenda view就是要把你的数据,按时间来排列分割,然后展示给你看的。在你打开Emacs的任何时候,可以用(C-c a a)来打开agenda view。它的效果如图:

agendaview

以图中23日的日程来看。它的数据展示规则是这样的。

第一部分是一个按时间分割的列表,它并不是每一天都有的,只有你当天的项目除了日期之外还定义了时间的情况下,它才会出现,并以两个时为间隔,将你的项目插入其中。而没有定义具体时间的当天项目,则在之后排队显示。

第二部分,没有具体时间的项目。第一列是TODO项目所在的org文件名,我这里有home,work,linux三个文件。第二列,显示这个项目是被分配在今天,还是在今天到期。Scheduled就是设置在今天的工作项,而Deadline就是指该项目在今天到期。而”In 2 d.”则表示这一项目在两天后到期。之后是描述。如果你的项目有tags的话,它将会在最后一列显示。

agenda view提供四种视图,分别是日(d),周(w),月(v m),年(v y),括号里是切换这四种视图的快捷键。用哪种视图纯属个人喜好,我觉得一方面是看你每天的日程多不多,另一方面可以取决于你在什么样的高度查看你的日程。

tags与情境

情境(context),在时间管理的概念中就是按所处的环境来分割TODO项目。比如说某些事是在网络上做的,某些事是在公司做的,某些事是在家里做的。

当然你可以把不同的情境分别放在不同的文件里。不过如果情境比文件的粒度要小,比如说你在家里有三个情境,”厕上””床上””电脑前”,而这些情境都属于“home”,你无须创建三个文件,而可以将它们全部放在home.org中,然后分别打上不同的标签。打标签的命令可以用(C-c C-q)。

之后如果你要做床上的事,可以敲(C-c a m),按提示输入标签,就可以显示所有符合条件的项目。

(C-c a)是打开agenda view的命令,而后面的m a可以看作是参数,用于打开不同的视图。如前所见,(C-c a a)是一种日历式的视图。(C-c a m)是一种可以指定Tags显示的视图。当然还有很多,按(C-c a)之后,界面上会有提示。

要做了以上这些事情,你还需要做一个配置,目的是要让agenda view知道,它应该从哪些个org文件里面取数据。

在你的.emacs文件中,添加:

   (setq org-agenda-files (list "~/doc/org/linux.org"
                     "~/doc/org/work.org"
                     "~/doc/org/home.org"))  

设定日程或期限

你可以为你的TODO项目设定时间,最普通的是日程,比如说杨威利同学需要在伊谢尔伦新年酒会上致祝酒辞。他可以用S-M-RET创建一个TODO项目。然后按C-c C-s为它设定日期和时间。按完“C-c C-s”之后,会出现一个新的小buffer(emacs的窗口),这时可以用鼠标或Shift+方向键来选取需要的日期。结果大概是这样的。

** TODO 在新年酒会上致辞。  
SCHEDULED: <2009-12-31 四>  

设定一个TODO项目如“罗马帝国衰亡史”,然后按”C-c C-d”,在出现的buffer中选中需要的日期,保存。结果是这样的。

** TODO 罗马帝国衰亡史  
DEADLINE: <2010-01-02 六>  

揗环的任务

每个人都会有一些循环的任务,比如说每两天去一次健身房,每周收拾一次房间等等,每月还个信用卡等等……针对这样的需要,只要在TODO项的时间里面,加一个repeater就可以了。

** TODO 还信用卡
DEADLINE: <2010-01-26 二 .+1m>
- CLOSING NOTE [2009-12-26 六 18:22]
:PROPERTIES:
:LAST_REPEAT: [2009-12-26 六 18:21]
:END:  

日期后面的.+1m代表这一任务在每月循环一次,当你用C-c C-t改变Item状态之后,这个项目并不会从TODO变成DONE,而是保持TODO状态,同时它的DEADLINE从12-26变成1-26,下面出现一个12-26的CLOSING NOTE,表示这个项目在12月26日被标记为DONE过。

repeater标记分为日(d),周(w),月(m),年(y)四种,同时支持在时间关键字前面添加数字,代表每n个时间周期。比如+3d表示每隔三天,+3w表示每隔三周等。

任务计时

兰迪波许教授在他的最后的讲演之后闻名全球,他还有一个演讲提到了时间的记录time log,就像记账来统计自己的金钱支出一样,时间记录也可以为于了解自己的时间花费,已优化时间的使用。

org-mode提供了一种计算每项任务花了多长时间的能力。

* DONE 艺伎
CLOSED: [2009-12-20 日 20:09]
CLOCK: [2009-12-20 日 19:32]--[2009-12-20 日 20:09] =>  0:37
CLOCK: [2009-12-20 日 18:00]--[2009-12-20 日 18:56] =>  0:56

上面这个记录了我观看BBC记录片<艺伎>的时间花费,org-mode可以记录两段时间的起止,并计算出每段的时间花费。

你需要做的就是在开始时按”C-c C-x C-i”开始计时,在需要结束计时时按”C-c C-x C-o”即可。

emacstodo

你的资料只是文本,不管你怎么用,它本质上只是文本。
简单的说,你在这界面上花花绿绿的,有TODO,有时间,有分级显示。其实在系统里面,存的就只是一个文本而已。
这意味着,你可以用编辑文本的方式做任何事。

想要一个TODO项目?

没问题。它是第几级的?在前面敲几个星号先,然后空格,敲大写的“TODO”,再空格,后面写上内容。想给它排一个日期?回车先,然后敲SCHEDULED,冒号,敲<2009-12-24 >注意后面这个尖括号前有一个空格。
可以了,这就是一个完整的TODO项目。你可以用任何你喜欢的编辑器编辑,但是何苦呢?你明明有emacs了,还不用花钱买。
当然我们没有那么傻,我们有工具,已经不是住在树上的时候了。

那么用工具怎么来创建一个TODO项目?

按C-S-RET(Ctrl-Shift-回车),屏幕上就出现了”* TODO”,直接在后面填写内容吧。想加时间?C-c C-s,选好一个时间再敲回车。
废话结束,接下来说点正经的。

基本的TODO函数

C-c C-t
改变TODO状态,TODO项在三个状态中循环
,->(unmarked)->TODO->DONE–.
,————————–,
C-u C-c C-t

同上,转变状态,不过是可以指定转变为什么状态

S-right
S-left

依然是转变状态,向不同的方向转。

C-c C-v
C-c / t

树状显示所有的TODO项,如前所述,TODO项是散落在整个文件中的,这个命令相当于把TODO项专门抽出来单独显示。
用第二个命令可以输入关键字,关键字在显示结果中高亮。

S-M-RET

创建一个目前层级的TODO项

S-M-Right
S-M-Left

增大或减小当前项目的层级,向左为增大,向右为减小。就是加一个或减一个星星的事。

C-c a t

显示全局的TODO,包括所有agenda文件列表中的。

0%