我想应该有不少人在使用 emacs 的 org-mode 来做笔记,任务管理等。我使用 org-mode 比较多的情况是使用他做一些提纲,类似思维导图一样,以及用它来管理 todo list。
org-mode 本身提供了 remember 来创建 todo list。
新建一个 org 文件 ~/org/todo.org,包含两行内容如下
* Tasks * Done
然后设置下面的内容
(define-key global-map "\C-ca" 'org-agenda)
(global-set-key (kbd "C-c m r") 'org-capture)
(setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/org/todo.org" "Tasks")
"* TODO %?\nCREATED: %U")
("j" "Journal" entry (file+datetree "~/org/journal.org")
"* %?\nEntered on %U\n %i\n %a")))
(defun wd-move-done-task-to-done-cats ( task-pos )
"move done task to *DONE cats"
(let* ((entry (org-get-entry))
(title (org-get-heading))
(task (format "** %s\n%s\n" title entry))
)
(goto-char (point-min))
(when (search-forward-regexp "^* Tasks$latex ")
(goto-char (point-min))
(when (search-forward-regexp "^* Done$")
(goto-char (match-beginning 0))
(forward-line)
(insert task)
(goto-char task-pos)
(delete-region (org-entry-beginning-position) (org-entry-end-position))
)
)
)
)
(defun wd-track-task-status ( changes-plist )
"Track task status, and move it to '* Done' cats if it is stats change from to to done
1 TODO 文件至少需要包含两个标题 * Tasks 和 * Done
2 * Tasks 里面的 TODO 内容变成 DONE 的时候,会自动把这个条目移动到 * Done
3 org-todo-keywords 的设置里面不能包含自动增加时间等的设置,否则增加的内容不能正确加到这个条目
"
;; (interactive)
(let ((type (plist-get change-plist :type))
(pos (plist-get change-plist :position))
(from (plist-get change-plist :from))
(to (plist-get change-plist :to))
)
(when (and (string= from "TODO")
(string= to "DONE"))
;; (let ((answer (read-char "Move this entry to *DONE ? Y/N (Y)")))
;; (when (or (= answer (string-to-char "y"))
;; (= answer (string-to-char "Y"))
;; (= answer (string-to-char "
"))
;; )
(wd-move-done-task-to-done-cats pos)
;; ))
)
)
)
(add-hook 'org-trigger-hook 'wd-track-task-status)
;; (setq org-todo-keywords
;; '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))
(setq org-todo-keywords
'((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANCELED(c)")))
在任何地方按一下 C-c m r,会出来一个 window 让你选择要创建 todo 还是 journal。选 t,然后输入内容就会自动插入到 ~/org/todo.org 的 * Tasks 里面。
此后,如果任务完成的时候,打开 todo.org,然后在任务上面 C-c C-t,会提示输入状态。如果是从 TODO 变成了 DONE,那这条任务会被转移到 * Done 里面。
因为里面都有时间,所以在 agenda list 里面,可以用 L 看到任务完成时间等。也将就用了。