Добавить свойство CREATED date в TODO в org-mode
Я прочитал руководство в режиме 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.
Ответы
Ответ 1
Я использую org-expiry для реализации этой функции, которая находится в каталоге contrib org.
Базовая конфигурация, которую я использую:
;; 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
Ответ 2
Вам не нужно изменять функции с помощью "defadvice" для запуска кода истечения при захвате.
Вы должны использовать hook:
(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-heading-hook
#'(lambda()
(save-excursion
(org-back-to-heading)
(org-expiry-insert-created))))
Ответ 3
Org предоставляет hook 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-plus-contrib на org ELPA.
Ответ 4
Более легким решением было бы добавить флаг !
в состояние 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
Ответ 5
Если вы создаете все свои TODO с помощью org-capture
, следующий шаблон захвата выполняет трюк:
(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]]
Ответ 6
Вы можете добавить отметку времени во время создания с нулевой конфигурацией, но она не будет помечена CREATED. Вместо того, чтобы вручную вводить TODO, используйте C-c C-t. Затем он будет зарегистрирован как "состояние изменено на TODO от" "и отметка времени.
Ответ 7
Здесь похороненное сокровище:
(setq org-treat-insert-todo-heading-as-state-change t)
Я нашел здесь, в ответ кому-то сказали, что им нужен org-insert-todo-heading-hook
.
Просто попробовал и, верный для формирования, когда вы org-insert-todo-heading
, он считается изменением состояния, поэтому ex: #+TODO: TODO(t!) | ...
добавит журнал.