首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
172 阅读
2
nvim番外之将配置的插件管理器更新为lazy
115 阅读
3
从零开始配置 vim(15)——状态栏配置
87 阅读
4
2018总结与2019规划
80 阅读
5
PDF标准详解(五)——图形状态
61 阅读
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
emacs
VimScript
linux
elisp
读书笔记
文本编辑器
Java
反汇编
OLEDB
数据库编程
数据结构
Masimaro
累计撰写
345
篇文章
累计收到
32
条评论
首页
栏目
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
页面
归档
友情链接
关于
搜索到
1
篇与
的结果
2026-01-11
Emacs 折腾日记(三十四)—— org todo
在上一篇文章中,我们简单介绍了 gtd 的一些理念,并且也通过org capture 完成了 gtd 中收集的操作。gtd分为收集任务、整理、执行、回顾。本篇我想通过org todo 来聚焦整理和执行这两个步骤整理上一篇文章中,我们通过org capture 收集到了一些任务,针对这些任务我们还需要给每个任务安排优先级并且根据优先级来确定开始执行的时间。显示待办事项我们在前面的模板中,待办任务前面都是以 TODO 开头,这里的TODO就是org 中待办事项的一个标识。我们可以通过 org-agenda 来查看相关的任务。打开该页面之后,它列举出了所有的支持的一些快捷键。例如使用 t 显示所有的待办事项,使用 m 来根据 PROP、TODO、TAGS 来查找任务。但是第一次使用时会发现自己兴冲冲的咔咔一顿添加任务,结果到头来通过 org-ageda 的 t 来列举之前添加的待办任务毛都没看到,顿时好奇兴奋的心情一下跌倒谷底。别着急这是因为我们没有告诉 org-agenda 该去哪里找这些待办事项。我们可以通过 org-agenda-files 来告诉org-agenda 这个信息就像名称显示的那样 org-agenda-files 是一个列表成员,我们指定它去这些文件中查找待办事项; (use-package org-agenda :ensure nil :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-priority 和 org-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-schedule 和 org-agenda-deadline。它们被绑定到了快捷键 C-c C-s 和 C-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 函数来保证设置的是一个有序的列表这里我们针对终止状态设置了两个关键字DONE和ABORT,我们可以通过在中间插入 | 的方式告知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-package org-pomodoro :ensure t :custom (org-prmodoro-length 25) ;每个番茄钟25分钟 (org-pomodoro-short-break-length 5) ;; 短休5分钟 (org-pomodoro-long-break-length) ;; 长休15分钟 (每4个番茄钟之后) (org-pomodoro-play-sounds-t) ;; 启用提示音 )在使用时我们可以将鼠标放置到需要执行的任务上,然后执行命令 org-pomodoro。如果出现打扰的情况,例如有同事突然找到你,希望你提供帮助或者外卖电话到了要去拿外卖这个时候可以通过再次执行 org-pomodoro 停止计时。我们可以看到在番茄钟启动之后下方的 minibuffer 中有番茄钟的倒计时。到此为止,我们现在自建的任务管理系统已经可以到执行这步了,这个系统后续只剩下如何进行进行归档与回顾了。关于这部分将在下篇文章中给出我的一些实践,谢谢各位读者的关注
2026年01月11日
2 阅读
0 评论
0 点赞