32

我阅读了 org-mode 手册,但找不到将 CREATED 字段添加到新创建的 TODO 的简单方法。然后结合org-log-done一个可以计算关闭特定 TODO 所需的时间。这在使用存档文件时特别有用。

例子:

* TODO Do something
  CREATED:  [2012-09-02 Sun 23:02]
* DONE Do something else
  CREATED: [2012-09-02 Sun 20:02]
  CLOSED: [2012-09-02 Sun 22:02]

我希望在保存文件时将 CREATED 字段添加到新任务(没有该字段的任务)中。

关于如何实现这一目标的任何建议?使用 Git 之类的东西不是我跟踪 TODOS 创作的解决方案。

4

8 回答 8

18

我使用 org-expiry 来实现该功能,它位于 org 的 contrib 目录中。

我使用的基本配置是:

;; Allow automatically handing of created/expired meta data.
(require 'org-expiry)
;; Configure it a bit to my liking
(setq
  org-expiry-created-property-name "CREATED" ; Name of property when an item is created
  org-expiry-inactive-timestamps   t         ; Don't have everything in the agenda view
)

(defun mrb/insert-created-timestamp()
  "Insert a CREATED property using org-expiry.el for TODO entries"
  (org-expiry-insert-created)
  (org-back-to-heading)
  (org-end-of-line)
  (insert " ")
)

;; Whenever a TODO entry is created, I want a timestamp
;; Advice org-insert-todo-heading to insert a created timestamp using org-expiry
(defadvice org-insert-todo-heading (after mrb/created-timestamp-advice activate)
  "Insert a CREATED property using org-expiry.el for TODO entries"
  (mrb/insert-created-timestamp)
)
;; Make it active
(ad-activate 'org-insert-todo-heading)

如果您使用的是捕获,它不会自动工作,需要一点胶水。我在这里发布了完整的配置: https ://gist.github.com/4037694

于 2012-11-08T09:18:11.247 回答
9

您无需使用“defadvice”修改函数即可在捕获时运行到期代码。你应该使用钩子:

(add-hook 'org-capture-before-finalize-hook 
          (lambda()
               (save-excursion
                    (org-back-to-heading)
                    (org-expiry-insert-created))))

'org-insert-todo-heading' 也一样。有一个钩子:

(add-hook 'org-insert-todo-heading-hook 
          (lambda()
               (save-excursion
                    (org-back-to-heading)
                    (org-expiry-insert-created))))
于 2016-03-26T01:09:31.990 回答
9

一个更轻量级的解决方案是向状态添加!标志TODO

(setq org-todo-keywords '((sequence "TODO(!)" "DONE")))

然后:

* TODO get of your ass
  - State "TODO"    from    [2016-06-03 to. 10:35]

虽然不是很漂亮。

参考: http: //orgmode.org/org.html#Tracking-TODO-state-changes

于 2016-06-30T08:36:54.720 回答
6

Org 提供了一个钩子org-after-todo-state-change-hook,你可以在这里使用它:

org-after-todo-state-change-hook 是在 'org.el' 中定义的变量。

文档:

在 TODO 项的状态更改后运行的挂钩。新状态(带有 TODO 关键字的字符串,或 nil)在 Lisp 变量“org-state”中可用。

按如下方式使用它:

(require 'org-expiry)

(add-hook 'org-after-todo-state-change-hook
          (lambda ()
            (when (string= org-state "TODO")
              (save-excursion
                (org-back-to-heading)
                (org-expiry-insert-created)))))

org-expiry 是 org-contrib 的一部分,它包含在 org ELPA 上的 org-plus-contrib 包中

于 2016-05-27T08:34:36.450 回答
6

这是一个埋藏的宝藏:

(setq org-treat-insert-todo-heading-as-state-change t)

我在这里找到了它,以回应有人说他们想要一个org-insert-todo-heading-hook.

刚刚试了一下,确实如此,当 you 时org-insert-todo-heading,它算作状态变化,所以 ex:#+TODO: TODO(t!) | ...将添加一个日志。

于 2017-08-30T04:22:05.527 回答
4

如果您使用org-capture以下捕获模板创建所有 TODO,则可以解决问题:

(setq org-capture-templates
'(
    ("t" "TODO Task" entry (file+headline "~/inbox.org" "Tasks")
         "* TODO %?\nCREATED: %u\nSRC: %a\n%i\n")
    ))

结果将如下所示:

* Tasks
** TODO Dummy task
CREATED: [2015-05-08 Fri]
SRC: [[file:~/path/to/file/where/you/created/the/task.org::*heading"][heading]]
于 2015-05-08T16:12:25.767 回答
2

这是一个不需要外部包的轻量级解决方案。我是从@MarcinAntczak 的回答、@Clément 的评论和这个类似的线程中得到的。它与org-capture和 一起使用M-S-RET。把它放在你的 Emacs 初始化文件中(例如~/.emacs):

(defun insert-created-date(&rest ignore)
  (insert (format-time-string
       (concat "\nCREATED: "
           (cdr org-time-stamp-formats))
       ))
  (org-back-to-heading) ; in org-capture, this folds the entry; when inserting a heading, this moves point back to the heading line
  (move-end-of-line()) ; when inserting a heading, this moves point to the end of the line
  )


                    ; add to the org-capture hook
(add-hook 'org-capture-before-finalize-hook 
         #'insert-created-date
)

                    ; hook it to adding headings with M-S-RET
                    ; do not add this to org-insert-heading-hook, otherwise this also works in non-TODO items
                    ; and Org-mode has no org-insert-todo-heading-hook
(advice-add 'org-insert-todo-heading :after #'insert-created-date)

我没有将此函数添加到状态更改(例如,从普通标题到TODO),因为它需要在属性抽屉中,我更喜欢没有那些额外的行。如果您更喜欢在属性中使用它,请使用查看此线程中定义的函数。

于 2018-10-15T11:18:55.950 回答
1

您可以在创建时使用零配置添加时间戳,但不会标记为已创建。与其手动输入 TODO,不如使用 Cc Ct。然后它将被记录为“状态从“”更改为 TODO 并加盖时间戳。

于 2012-09-05T07:39:44.430 回答