0
0
Fork 1
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-08-25 20:32:53 +00:00

Allow previous state to be shown in state change log notes.

Wanrong Lin writes:

     My TODO sequence is set up as following:

     (setq org-todo-keywords '((sequence "TODO(t)" "STARTED(s!)"
     "WAITING(w@/!)"      "MAYBE(m/!)" "DELEGATED(g@/!)"
     "DEFERRED(d!/!)" "HOLD(h!/!)" "|" "DONE(x)"      "CANCELED(c)")))

     The state change logging is great, but I wonder whether we can
     further improve it:

     1. Can we also include the original state in the log message?
     i.e.: instead of having      - State "DEFERRED"   [2009-02-11 Wed 11:38]
     we can have
     - State "DEFERRED"  from "HOLD" [2009-02-11 Wed 11:38]

     The message will be clearer, and useful even when somebody edited
     the TODO keyword in place without using the "org-todo" command
     (in that case, simply looking at all the "destination states" in
     the log message does not give us the right information).

This strikes me like a good idea, so I have implemented it with this
commit.
This commit is contained in:
Carsten Dominik 2009-02-12 09:44:15 +01:00
parent 23551eee32
commit c32de18ae0
3 changed files with 33 additions and 9 deletions

View file

@ -1,3 +1,18 @@
2009-02-12 Carsten Dominik <carsten.dominik@gmail.com>
* org-clock.el (org-clock-out): Add another nil for the previous
state into the call to `org-add-log-setup'.
* org.el (org-log-note-previous-state): New variable.
(org-log-note-headings): New %S escape for old state.
(org-todo): Call the note setup with the old state as an
argument.
(org-add-note): Add another nil for the previous state into the
call to `org-add-log-setup'.
(org-add-log-setup): New argument PREV-STATE.
(org-add-log-note): Handle new %S escape.
(org-store-log-note): Handle new %S escape.
2009-02-11 Carsten Dominik <carsten.dominik@gmail.com> 2009-02-11 Carsten Dominik <carsten.dominik@gmail.com>
* org-clock.el (org-clock-find-position): Do not swallow an item * org-clock.el (org-clock-find-position): Do not swallow an item

View file

@ -469,7 +469,7 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set."
(delete-char 1))) (delete-char 1)))
(move-marker org-clock-marker nil) (move-marker org-clock-marker nil)
(when org-log-note-clock-out (when org-log-note-clock-out
(org-add-log-setup 'clock-out nil nil nil (org-add-log-setup 'clock-out nil nil nil nil
(concat "# Task: " (org-get-heading t) "\n\n"))) (concat "# Task: " (org-get-heading t) "\n\n")))
(when org-clock-mode-line-timer (when org-clock-mode-line-timer
(cancel-timer org-clock-mode-line-timer) (cancel-timer org-clock-mode-line-timer)

View file

@ -1766,7 +1766,7 @@ When nil, only the date will be recorded."
(defcustom org-log-note-headings (defcustom org-log-note-headings
'((done . "CLOSING NOTE %t") '((done . "CLOSING NOTE %t")
(state . "State %-12s %t") (state . "State %-12s from %-12S %t")
(note . "Note taken on %t") (note . "Note taken on %t")
(clock-out . "")) (clock-out . ""))
"Headings for notes added to entries. "Headings for notes added to entries.
@ -1775,6 +1775,7 @@ context, and the cdr is the heading to be used. The heading may also be the
empty string. empty string.
%t in the heading will be replaced by a time stamp. %t in the heading will be replaced by a time stamp.
%s will be replaced by the new TODO state, in double quotes. %s will be replaced by the new TODO state, in double quotes.
%S will be replaced by the old TODO state, in double quotes.
%u will be replaced by the user name. %u will be replaced by the user name.
%U will be replaced by the full user name." %U will be replaced by the full user name."
:group 'org-todo :group 'org-todo
@ -8573,10 +8574,10 @@ For calling through lisp, arg is also interpreted in the following way:
;; It is now done, and it was not done before ;; It is now done, and it was not done before
(org-add-planning-info 'closed (org-current-time)) (org-add-planning-info 'closed (org-current-time))
(if (and (not dolog) (eq 'note org-log-done)) (if (and (not dolog) (eq 'note org-log-done))
(org-add-log-setup 'done state 'findpos 'note))) (org-add-log-setup 'done state this 'findpos 'note)))
(when (and state dolog) (when (and state dolog)
;; This is a non-nil state, and we need to log it ;; This is a non-nil state, and we need to log it
(org-add-log-setup 'state state 'findpos dolog))) (org-add-log-setup 'state state this 'findpos dolog)))
;; Fixup tag positioning ;; Fixup tag positioning
(org-todo-trigger-tag-changes state) (org-todo-trigger-tag-changes state)
(and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t)) (and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t))
@ -8927,7 +8928,7 @@ This function is run automatically after each state change to a DONE state."
;; make sure we take a note, not only a time stamp ;; make sure we take a note, not only a time stamp
(setq org-log-note-how 'note)) (setq org-log-note-how 'note))
;; Set up for taking a record ;; Set up for taking a record
(org-add-log-setup 'state (or done-word (car org-done-keywords)) (org-add-log-setup 'state (or done-word (car org-done-keywords)) this
'findpos org-log-repeat))) 'findpos org-log-repeat)))
(org-back-to-heading t) (org-back-to-heading t)
(org-add-planning-info nil nil 'closed) (org-add-planning-info nil nil 'closed)
@ -9152,6 +9153,7 @@ be removed."
(defvar org-log-note-marker (make-marker)) (defvar org-log-note-marker (make-marker))
(defvar org-log-note-purpose nil) (defvar org-log-note-purpose nil)
(defvar org-log-note-state nil) (defvar org-log-note-state nil)
(defvar org-log-note-previous-state nil)
(defvar org-log-note-how nil) (defvar org-log-note-how nil)
(defvar org-log-note-extra nil) (defvar org-log-note-extra nil)
(defvar org-log-note-window-configuration nil) (defvar org-log-note-window-configuration nil)
@ -9164,10 +9166,11 @@ The auto-repeater uses this.")
"Add a note to the current entry. "Add a note to the current entry.
This is done in the same way as adding a state change note." This is done in the same way as adding a state change note."
(interactive) (interactive)
(org-add-log-setup 'note nil 'findpos nil)) (org-add-log-setup 'note nil nil 'findpos nil))
(defvar org-property-end-re) (defvar org-property-end-re)
(defun org-add-log-setup (&optional purpose state findpos how &optional extra) (defun org-add-log-setup (&optional purpose state prev-state
findpos how &optional extra)
"Set up the post command hook to take a note. "Set up the post command hook to take a note.
If this is about to TODO state change, the new state is expected in STATE. If this is about to TODO state change, the new state is expected in STATE.
When FINDPOS is non-nil, find the correct position for the note in When FINDPOS is non-nil, find the correct position for the note in
@ -9200,6 +9203,7 @@ EXTRA is additional text that will be inserted into the notes buffer."
(move-marker org-log-note-marker (point)) (move-marker org-log-note-marker (point))
(setq org-log-note-purpose purpose (setq org-log-note-purpose purpose
org-log-note-state state org-log-note-state state
org-log-note-previous-state prev-state
org-log-note-how how org-log-note-how how
org-log-note-extra extra) org-log-note-extra extra)
(add-hook 'post-command-hook 'org-add-log-note 'append)))) (add-hook 'post-command-hook 'org-add-log-note 'append))))
@ -9231,7 +9235,9 @@ EXTRA is additional text that will be inserted into the notes buffer."
((eq org-log-note-purpose 'clock-out) "stopped clock") ((eq org-log-note-purpose 'clock-out) "stopped clock")
((eq org-log-note-purpose 'done) "closed todo item") ((eq org-log-note-purpose 'done) "closed todo item")
((eq org-log-note-purpose 'state) ((eq org-log-note-purpose 'state)
(format "state change to \"%s\"" org-log-note-state)) (format "state change from \"%s\" to \"%s\""
(or org-log-note-previous-state "")
(or org-log-note-state "")))
((eq org-log-note-purpose 'note) ((eq org-log-note-purpose 'note)
"this entry") "this entry")
(t (error "This should not happen"))))) (t (error "This should not happen")))))
@ -9261,7 +9267,10 @@ EXTRA is additional text that will be inserted into the notes buffer."
(current-time))) (current-time)))
(cons "%s" (if org-log-note-state (cons "%s" (if org-log-note-state
(concat "\"" org-log-note-state "\"") (concat "\"" org-log-note-state "\"")
""))))) ""))
(cons "%S" (if org-log-note-previous-state
(concat "\"" org-log-note-previous-state "\"")
"\"\"")))))
(if lines (setq note (concat note " \\\\"))) (if lines (setq note (concat note " \\\\")))
(push note lines)) (push note lines))
(when (or current-prefix-arg org-note-abort) (setq lines nil)) (when (or current-prefix-arg org-note-abort) (setq lines nil))