news 2026/5/12 1:56:14

Emacs 折腾日记(三十四)—— org todo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Emacs 折腾日记(三十四)—— org todo

在上一篇文章中,我们简单介绍了 gtd 的一些理念,并且也通过org capture 完成了 gtd 中收集的操作。gtd分为收集任务、整理、执行、回顾。本篇我想通过org todo 来聚焦整理和执行这两个步骤

整理

上一篇文章中,我们通过org capture 收集到了一些任务,针对这些任务我们还需要给每个任务安排优先级并且根据优先级来确定开始执行的时间。

显示待办事项

我们在前面的模板中,待办任务前面都是以TODO开头,这里的TODO就是org 中待办事项的一个标识。我们可以通过org-agenda来查看相关的任务。


打开该页面之后,它列举出了所有的支持的一些快捷键。例如使用t显示所有的待办事项,使用m来根据PROPTODOTAGS来查找任务。

但是第一次使用时会发现自己兴冲冲的咔咔一顿添加任务,结果到头来通过org-agedat来列举之前添加的待办任务毛都没看到,顿时好奇兴奋的心情一下跌倒谷底。

别着急这是因为我们没有告诉org-agenda该去哪里找这些待办事项。我们可以通过org-agenda-files来告诉org-agenda这个信息就像名称显示的那样org-agenda-files是一个列表成员,我们指定它去这些文件中查找待办事项;

(use-packageorg-agenda:ensurenil:custom(org-agenda-files(list"~/org/reading.org""~/org/blog.org""~/org/working.org")))

这里我设置了三个org文档,这三个文档分别记录待读书目、需要完成的博客以及工作任务。需要注意的是我们需要这几个文件真实存在否则就会报错。设置好了这个变量之后效果如下:

设定优先级

列举出所有任务之后,针对每个任务我们可以考虑如何安排这些任务,首先需要的就是考虑给它从那四个维度安排一个优先级。上面说到我们可以使用A、B、C、D 做一个标识,这里我规定优先级的顺序是:A > B > C > D

为了达到这个需求,首先我们要解决的是优先级的定义问题,因为Emacs默认只支持A/B/C这三种优先级,我需要它能支持4种。Emacs种有两个变量分别控制优先级最大值和优先级最小值,它们是org-highest-priorityorg-lowest-priority。另外还有一个变量可以设置默认的优先级org-default-priority。理论上它可以设置优先级从A到Z,但是过多的优先级并不适合。

我们可以在上面的:custom下使用下列的语句进行设置

(org-highest-priority?A)(org-lowest-priority?D)(org-default-priority?D)

设置完成之后可以使用S-UP(Shift + 上箭头)或者S-Down(Shift+下箭头)来调整优先级

设置计划执行时间和结束时间

安排好了优先级,我们就需要为每个任务安排时间了,这里可以安排计划开始时间和结束时间。

开始时间和结束时间在 org agenda 中分别是命令org-agenda-scheduleorg-agenda-deadline。它们被绑定到了快捷键C-c C-sC-c C-d上面。

当我们通过快捷键或者M-x调用这两个命令的时候,Emacs会弹出日历菜单供我们选择日期,默认提供了三个月的日期可供选择。如果不够的化,日历下方两个各有一个箭头可以向上或者向下再显示一个月。

另外可以在下方 mini-buffer 处输入+1d这样的字符表示在当前时间的1天以后,根据这个规律我们可以输入+后面跟任意的数字,然后后面加d/w/m/y来表示天、周、月、年。

设置任务属性和标签

有些任务,特别是工作中的任务我们自己可能无法单独完成,例如某个bug需要前端或者后端一起完成又或者这个bug不光前端要改后端也需要改,这个时候我们修改完了自己的部分,这个时候可以显示我们将任务派发给了其他同事。又或者这个bug牵扯到其他bug,又或者有时候需要开会或者整理需求文档,这个时候我们需要记录该任务的场地例如对于会议可以记录一下在D-01会议室。

这些可以通过设置属性和标签来描述这些信息。我个人认为它们二者在记录任务的额外信息时没有什么大的区别。主要区别在显示方面,标签一般于TODO 信息展示在一行,而属性默认是被折叠起来的,所以对于一些简要的信息,例如任务目前是谁在处理、开会的地点这类信息我习惯放置到标签上、而属性放置一些不那么重要的信息。

对于标签,我们可以在设置任务时,在任务后面使用:TAG1:TAG2:这种方式添加多个标签。在前面介绍org-capture的文章中我给出了一个创建工作任务的模板* TODO %^{任务描述} :%^{任务类型|dev|bugfix|env|doc|meeting}:\n SCHEDULED: %^t\n PRIORITY: %^{优先级|A|B|C|D}\n %?\n %i"。任务类型部分就是一个标签,这里我只设置了一个标签。

我们可以事先使用org-tag-alist来规定一组标签以及打上这个标签所需要的快捷键。这个变量是一个列表类型,每个列表包含一个cell,cell的第一个元素是一个标签的名称,第二个元素是对应的快捷键。同时它也可以通过:groupstart:groupend来定义一组互斥的标签项。例如针对任务我们可以定义如下的标签

(org-tag-alist`((:startgroup)("dev".?d)("bugfix".?B)("env".?E)("doc".?D)("meeting".?M)("reading".?R)(:endgroup)("Sendto Tom".?T)("Sendto Jerry".?J)))

需要注意这里标签过多的话,我们需要避免出现快捷键重复的情况。设置了标签,我们可以使用C-c C-q

属性是放到:PROPERTIES:下的一组键值对,默认情况下是被折叠的。属性相对于标签来说更加灵活,能显示的信息也更加多样化。我们可以使用C-c C-x p来设置属性

设置子任务

有时候一个大的任务分为几个小任务,例如某个bug可能包含几个方面的问题甚至需要不同组的开发人员进行协调。这个时候我们可以将一个任务分解为几个子任务

org mode 中对于子任务的表现比较简单。子任务就是任务下的一个次级的 headline。我们可以在主任务后面加上[/]或者[%]来根据子任务的完成情况自动更新主任务的完成进度

从上面的截图上看,关于子任务还有两个问题没有解决,首先在将任务状态由TODO 切换到DONE时,checkbox的状态应该是勾选的。第二个问题就是当所有的子任务都完成之后应该将主任务的状态改为done。这些我暂时没有找到好的解决方案,所以不展开说明了。

任务状态切换

上面我们看到可以通过C-c C-t来切换状态,但是我们只能在TODO|DONE之间进行切换。以我个人的习惯来说,我还需要几个关键字:

  • WAIT: 等待,一般是任务完成需要等待其他人的配合,例如bug的产生可能是多个模块共同作用,需要等待其他人修改完
  • ABORT:终止
  • DOING: 正在执行

这里我说的是关键字,但是它并不代表org todo 中任务实际的状态。事实上org todo中只有两种状态,TODO和DONE表示未完成和终结,我们无法在中间插入新的状态,能做的也只有在两种状态之间插入一些新的关键字。插入新的关键字可以通过设置变量org-todo-keywords

根据Emacs的文档显示,org-todo-keywords原始的值为((sequence "TODO" "DONE"))。因为这里需要一个有序列表,也就是说Emacs会保证状态切换时按照我们定义的顺序进行切换,并且切换到最后一个关键字时会认定任务已经处于终止状态,后续可以针对这个终止状态来进行一些操作。所以这里需要通过sequence函数来保证设置的是一个有序的列表

这里我们针对终止状态设置了两个关键字DONEABORT,我们可以通过在中间插入|的方式告知Emacs,|之前的关键字是未完成的状态,|之后的是终止的状态。

我们可以在:custom下加入

(org-todo-keywords'((sequence"TODO(t)""DOING(i)""WAIT(w@/!)""|""DONE(d!)""ABORT(a@)"))))

这里后面括号中的字母表示可以在C-c C-t之后按字母快捷键快速选择状态,@表示需要由用户填写理由,例如针对等待的任务可以写明需要等待某个子模块修改完成。而后面的!表示会插入一条包括时间戳的记录。至于/则是中间的一个分隔符

现在它的效果如下:

接入番茄工作法

前面介绍了关于任务的定义和关键字的切换,现在我们的流程可能就变成了:

  • 通过org-capture收集任务
  • 将分析任务确定任务的优先级以及计划执行和结束时间
  • 通过org-agenda查看当天需要执行的任务
  • 执行任务
  • 任务完成之后切换状态

在执行任务的过程中我们可以采用番茄工作法来保证时间的高效利用。Emacs中可以嵌入有关番茄工作法的插件来做到。这里推荐使用org-pomodoro插件

(use-packageorg-pomodoro:ensuret:custom(org-prmodoro-length25);每个番茄钟25分钟(org-pomodoro-short-break-length5);; 短休5分钟(org-pomodoro-long-break-length);; 长休15分钟 (每4个番茄钟之后)(org-pomodoro-play-sounds-t);; 启用提示音)

在使用时我们可以将鼠标放置到需要执行的任务上,然后执行命令org-pomodoro。如果出现打扰的情况,例如有同事突然找到你,希望你提供帮助或者外卖电话到了要去拿外卖这个时候可以通过再次执行org-pomodoro停止计时。

我们可以看到在番茄钟启动之后下方的 minibuffer 中有番茄钟的倒计时。

到此为止,我们现在自建的任务管理系统已经可以到执行这步了,这个系统后续只剩下如何进行进行归档与回顾了。关于这部分将在下篇文章中给出我的一些实践,谢谢各位读者的关注

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:55:14

Altium Designer在温度控制系统中的项目应用

从原理到量产:用 Altium Designer 打造高精度温度控制系统 在工业自动化、医疗设备和精密仪器领域,一个稳定可靠的温度控制系统,往往决定了整台设备的性能上限。无论是恒温培养箱、半导体工艺加热平台,还是高端家电中的智能温控模…

作者头像 李华
网站建设 2026/5/11 1:17:50

桥式整流电路设计要点:整流二极管实战案例

从一颗二极管说起:桥式整流电路的实战设计陷阱与避坑指南你有没有遇到过这样的情况——电源板莫名其妙“冒烟”,拆开一看,桥堆炸了?或者设备在高温环境下频繁重启,排查半天发现是整流环节出了问题?别急&…

作者头像 李华
网站建设 2026/5/8 21:01:58

图解说明usb_burning_tool固件定制中的关键参数设置

深入剖析usb_burning_tool刷机工具:从参数配置到量产落地的实战指南 你有没有遇到过这样的场景? 产线上的TV Box批量烧录,几十台设备同时连接PC,结果一半“脱机”,三分之一写入失败,还有几台直接变砖……排…

作者头像 李华
网站建设 2026/5/10 22:16:01

快速理解继电器驱动电路设计关键步骤

从零搞懂继电器驱动电路:工程师避坑实战指南你有没有遇到过这种情况——明明代码写得没问题,MCU也正常输出高电平,可继电器就是“抽风”:时而吸合、时而不吸;更糟的是,某天突然烧了单片机IO口,甚…

作者头像 李华
网站建设 2026/5/11 9:46:15

ARM内存管理基础:入门级全面讲解

深入ARM内存管理:从零理解MMU与页表机制你有没有遇到过这样的问题——在调试一段裸机代码时,程序一开启MMU就崩溃?或者在移植操作系统时,发现某个外设寄存器读写异常,查了半天才发现是内存属性配置错了?这些…

作者头像 李华
网站建设 2026/5/11 10:40:38

我比较喜欢的游戏

1.一个只需要点点点的小游戏Neon Planet Idle Clicker 🕹️ Play on CrazyGameshttps://www.crazygames.com/game/neon-planet-idle-clicker 2.一个又肝又爽的游戏https://florr.io/https://florr.io/ 3.一个只需要挖挖挖的小游戏https://digdig.io/https://digdi…

作者头像 李华