Подтвердить что ты не робот

Добавить свойство 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.

4b9b3361

Ответ 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!) | ... добавит журнал.