开篇先聊一个观察:我经常看到有人搜“idea 如何查看项目中的 todo”,说明很多人的任务管理启蒙其实是从Code里那几行TODO注释开始的。但当你在IDE里敲下// TODO: 修复XXX的时候,它只是一个僵死的标记,不会提醒你,不会过期,也不会在你完成它的时候欢呼一声。而Emacs里的org todo,是两个完全不同的物种——它不是“给代码做记号”,而是一整套任务状态机。你把一条待办从TODO推到DOING再推到DONE,每个状态切换都有时间戳,有跳过条件,有循环周期,还能自动汇总进日程。这套东西我折腾了几年,今天把最核心的部分拆开讲清楚。
刚开始接触org todo的人通常会犯一个错误:把它当成一个花哨的复选框列表。实际上,org todo的价值在于它把任务从“静态文本”变成了“动态流程”。下面我按自己从入门到踩坑的过程,把整套玩法展开。
1. 从IDE的TODO注释说起:任务标记和任务管理的本质差别
1.1 为什么IDE的TODO面板救不了你
IDE里查看项目TODO(IDEA里是View | Tool Windows | TODO,或者直接按Alt+6)本质上是正则扫描代码注释,把TODO、FIXME、XXX这些关键字拎出来列个面板。它能告诉你代码里还有哪些坑没填,但仅此而已。
问题在于:它不承担语境。一条TODO (johndoe): 重构此处接口,你根本不知道它是上周写下的还是去年写下的,有没有截止时间,卡在哪个环节,优先级多高。很多时候,项目里的TODO注释是越积越多的,因为没有人对它的状态负责。
在Emacs里,我同样可以用rg或grep在工程里扫一遍TODO注释,但这显然不是org todo的定位。org todo管理的不是代码,而是你的任务本身。它的核心是一套可配置的状态机:一条任务可以从TODO变成DOING,再变成WAITING,或者被取消,最后进入DONE。每一次流转都可以留下时间戳、备注和上下文。
1.2 org todo是一条完整的管理链路
我认为org todo真正让人上瘾的,是它把“记录一件事”到“完成一件事”中间的整个链条打通了:
- 捕获:遇到事情随手记(
org-capture),不打断当前工作流。 - 整理:给任务设置状态、优先级、截止时间、标签。
- 执行:从agenda视图中把今天该干的事情捞出来,一条条解决掉。
- 复盘:状态切换时间戳、日志记录、归档历史,全留着。
也就是说,IDE的TODO是“贴便利贴”,org todo是“项目管理系统”。这两件事在体验上的差距是颠覆性的。如果你只是想在代码里做标记,那直接用// TODO挺好;但如果你想让任务自动排期、自动提醒、自动循环,那我建议你把任务从代码注释里搬出来,放到org文件里管理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三分钟搭起第一套todo工作流:配置、快捷键与第一条待办
2.1 最简配置:先让状态转起来
org-mode内置的todo功能已经够用,但默认状态下只有TODO和DONE两个状态,有一点简陋。我建议第一步就自定义状态关键字。编辑配置:
elisp复制(setq org-todo-keywords
'((sequence "TODO(t)" "DOING(i!)" "WAITING(w@)" "|" "DONE(d!)" "CANCELLED(c@)")))
解释一下这一行干了什么:
sequence表示这是一组有序状态,按顺序循环。|把未完成状态和完成状态分隔开。左边是TODO、DOING、WAITING,右边是DONE、CANCELLED。- 括号里的字母是快捷键,在光标停在标题上按
C-c C-t后,输入对应字母就能快速切换状态。 !表示进入该状态时自动记录时间戳。DOING和DONE加了!,意味着你开始做和完成时,Emacs会分别写入一行CLOCK或CLOSED时间戳。@表示切换到这个状态时,光标会跳到标题末尾,方便你输入备注。WAITING和CANCELLED用@很合理,因为通常你要记录“在等什么”或者“为什么取消”。
完成这步配置后,重启Emacs或者`M-x eval-b
