Agenda插件org-super-agenda插件和agenda的自定义设置

缘起

在使用了org mode进行日程管理和工作记录后,尽管有不定期的archive,我的GTD.org这个文件已经超过了4000行。直接使用这个文件来管理日程已经显得不怎么方便,除非每天都进行一次全程的回顾,才可能把各个日程和待办梳理出来,所以一定要使用一些方法,将这些待办和日程过滤出来,才有可能实现有效的管理。

在自定义agenda之前

默认的agenda命令其实有了一些基本的过滤。具体的内容可以在 org-agenda 后查看到

  • a Agenda for current week or day 这个最常用,显示周的日程
  • t list of all TODO entries 这个可以把所有有着TODO状态的清单列出来
  • T Entries with special TODO kwd 和上一条类似,过程中会增加一个过滤条件,显示指定的TODO关键字的清单
  • m Match a TAGS/PROP/TODO query 根据tag来过滤显示清单
  • M Likd m, but only TODO entries 和m功能相同,但只显示带有TODO关键字的清单
  • s search for keywords 根据关键字搜索
  • S Like s, but only TODO entries 和s功能相同,但只显示带有TODO关键字的清单
  • / Multi-occur
  • ? Find :FLAGGED: entries
  • * Toggle sticky agenda views
  • < Brffer, subtree/region restriction 限定范围
  • > Remove restriction 取消限定
  • e Export agenda views
  • # List stuck project 显示停滞的项目,何为停滞,可以自定义,按 ! 就可进入自定义菜单
  • C Configure custom agenda commands 打开自定义agenda配置的界面

个人认为,在上述命令中,除了 a t T 之外,其它并不实用,特别是那几条搜索的命令。因为进入agenda界面就是想查看一下还有什么遗忘的内容,因为已经想不起来做什么了,就不可能还能想起什么关键字来进行搜索了。

在自定义之agenda前,最多使用的就是 a 偶尔会使用 t 来查看那些没有指定日期的任务。因此在这个阶段,我尽量为每个任务指定一个时间,这样所有的任务都基本在 a 上展示出来。

自定义agenda

自定义的菜单可以通过emacs的设置界面进行配置,以下是我曾经配置的一个结果

(setq org-agenda-custom-commands
    '(("n" "Agenda and all TODOs" ;; n 是自定义的快捷键 Agenda and all TODOs是标题

      ((tags-todo "@Tom|@Mary" nil)  ;; 显示是todo状态的,且tag是 “@Tom”或”@Mary”的。当时的目的是重点关注这两个人相关任务

       (agenda "" nil)  ;; 显示日程,这一块和 =org-agenda= =a= 的效果一致

       (todo "TODO" nil) ;; 显示所有 TODO 的任务

       (todo "WAIT" nil)) ;; 显示所有WAIT的任务

      nil)))

经过上述设置后,即可在 C-c a n 后显示自定义的日程。前提是 C-c a 已经和 org-agenda 绑定

使用org-super-agenda

很早就了解到有这么个插件,但是作者的站点介绍并没有吸引我,所以一直没有用。

我一直存在着这么一个困扰,就是在一个项目的下级列表中如果有一个任务,显示在agenda中,如果离开了上级菜单的这个context,可能会对这个任务的理解造成问题。如果这个时候从 agenda view TAB 回去,上级的任务也没有展开,查看也是不方便。

为了解决这个问题,我直接去网上搜索了下,如何在agenda里显示上级任务。搜索的结论是使用 org-super-agenda,作者回答了提出问题的网友,并给出了配置。这使我下定决心使用这个插件。

项目地址:https://github.com/alphapapa/org-super-agenda

安装和使用

安装使用melpha,手工安装的方式在项目的页面上也有。

配置的过程就是配置 org-super-agenda-groups ,配置后即可分类别进行显示。

可以使用 setqlet 方式进行定义,但使用 let 后,在Agenda view里 g 刷新后会失效。

作者在页面上给出了一个截图,同时给出了这个截图的配置,仔细学习一下配置,能够对这个插件有较好的理解。

先名词解释

这是一个group的例子:

(:name "Today"  ; Optionally specify section name

       :time-grid t  ; Items that appear on the time grid

       :todo "TODAY")  ; Items that have this TODO keyword

这是一个 :selector

一些规则

  • 在一个group里,selector之间是or的关系
  • 一个selector里如果有2个选项,也是or的关系,如: :tag ("food" "dinner") 如果要and :and (:tag "shopping" :tag "@town")
  • group之间有排序,可以用 :order 来排,也可以使用默认定义的顺序来排,在一个 org-super-agenda-groups 里,在上一条被显示到的,不会再被下一条显示。或者说上一条中未被过滤显示的,会被排到下一条,接受下一条的过滤。 :order 只影响过滤的排序,不影响显示的排序。
  • 个人发现,只有有 TODO状态的列表才会显示。

常用的几个selector

  • :name 标题
  • :and 与,因为默认都是或,所以如果要与的话,就要用到这个。
  • :discard:not 的例子, (:discard (:not (:priority "A"))) 如显示 priority 是A的。 (:discard (:priority "C")) 不显示priority是C的。
  • :auto-group 在每个列表中设置 :PROPERTIES 可分类显示列表,这也是实现列表属于哪个项目的手段。但是如果设置了这个选项,如果上级任务没有设置属性的话,会无法过滤显示。
  • :tag 标签过滤条件,发现如果是继承的标签是无效的

设置agenda的模板

基本思路和原先自定义的基本相同

  • 尽量安排日程,在日历是显示
  • 没有明确日期的,在日历下显示
  • 列出所有在建的项目,需要关注的项目。前提是定期回顾所有项目,将需要关注项目的根列表设为 TODO
  • 尽量可以分类,任务的项目名。前提是所有项目设置 :agenda-group: 属性
海上一民工

Related