* [Patch] Sort agenda items by todo-state
@ 2007-11-21 12:13 Egli Christian (KIRO 41)
2007-11-22 7:35 ` Carsten Dominik
0 siblings, 1 reply; 2+ messages in thread
From: Egli Christian (KIRO 41) @ 2007-11-21 12:13 UTC (permalink / raw)
To: emacs-orgmode
[-- Attachment #1.1: Type: text/plain, Size: 1799 bytes --]
* Introduction
I live in my org agenda view and I schedule all my tasks to the
day that I want to do them. I also would like to see my
achievements so I keep the TODOs that are done in the agenda
view. However I would like them to get out of the way so that I
can better see the tasks that are still open. That is why for a
long time I've been wanting to sort the agenda items by todo
state.
* Patch
I finally looked at the code and realized that this was not very
hard to do. The following patch (against 5.13i) implements a new
org-agenda-sorting-strategy that allows you to sort agenda items
by todo-state.
* Notes
The patch is basically a "works-for-me" implementation. It only
sorts todo and scheduled items. It should probably do the same
for deadlines. Maybe even for timestamps?
The doc strings need to be updated.
Carsten at one time talked about implementing this feature by
using priorities, i.e. factoring the todo-state into the priority
(which uses the actual priority plus some calculation based on
how many days the task is overdue). This patch takes a different
route.
The sorting is done by comparing the todo-state of the items. It
first orders them by done state, i.e. all done items come after
(or before) the items that are not done. After that it compares
the todo-states with a string compare. This should probably use
some kind of ordering information from the relevant
org-todo-keywords sequence.
* Conclusion
So the basic question is: Should I clean up this patch to get it
included? Is the proposed route (of not taking the priorities)
ok? And finally: How do I sort taking the sequence order into
consideration?
Christian
<<org.diff>>
[-- Attachment #1.2: Type: text/html, Size: 4070 bytes --]
[-- Attachment #2: org.diff --]
[-- Type: application/octet-stream, Size: 4586 bytes --]
diff -c /home/egli/Desktop/org.el.orig /home/egli/Desktop/org.el
*** /home/egli/Desktop/org.el.orig 2007-11-21 07:56:11.000000000 +0100
--- /home/egli/Desktop/org.el 2007-11-21 08:00:25.000000000 +0100
***************
*** 2547,2553 ****
(const time-up) (const time-down)
(const category-keep) (const category-up) (const category-down)
(const tag-down) (const tag-up)
! (const priority-up) (const priority-down))))
(defcustom org-agenda-sorting-strategy
'((agenda time-up category-keep priority-down)
--- 2547,2554 ----
(const time-up) (const time-down)
(const category-keep) (const category-up) (const category-down)
(const tag-down) (const tag-up)
! (const priority-up) (const priority-down)
! (const todo-state-up) (const todo-state-down))))
(defcustom org-agenda-sorting-strategy
'((agenda time-up category-keep priority-down)
***************
*** 19878,19884 ****
"\\)\\>"))
org-not-done-regexp)
"[^\n\r]*\\)"))
! marker priority category tags
ee txt beg end)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
--- 19879,19885 ----
"\\)\\>"))
org-not-done-regexp)
"[^\n\r]*\\)"))
! marker priority category tags todo-state
ee txt beg end)
(goto-char (point-min))
(while (re-search-forward regexp nil t)
***************
*** 19903,19913 ****
category (org-get-category)
tags (org-get-tags-at (point))
txt (org-format-agenda-item "" (match-string 1) category tags)
! priority (1+ (org-get-priority txt)))
(org-add-props txt props
'org-marker marker 'org-hd-marker marker
'priority priority 'org-category category
! 'type "todo")
(push txt ee)
(if org-agenda-todo-list-sublevels
(goto-char (match-end 1))
--- 19904,19916 ----
category (org-get-category)
tags (org-get-tags-at (point))
txt (org-format-agenda-item "" (match-string 1) category tags)
! priority (1+ (org-get-priority txt))
! todo-state (org-get-todo-state))
(org-add-props txt props
'org-marker marker 'org-hd-marker marker
'priority priority 'org-category category
! 'type "todo"
! 'todo-state todo-state)
(push txt ee)
(if org-agenda-todo-list-sublevels
(goto-char (match-end 1))
***************
*** 20238,20244 ****
'type (if pastschedp "past-scheduled" "scheduled")
'date (if pastschedp d2 date)
'priority (+ 94 (- 5 diff) (org-get-priority txt))
! 'org-category category)
(push txt ee))))))
(nreverse ee)))
--- 20241,20248 ----
'type (if pastschedp "past-scheduled" "scheduled")
'date (if pastschedp d2 date)
'priority (+ 94 (- 5 diff) (org-get-priority txt))
! 'org-category category
! 'todo-state head)
(push txt ee))))))
(nreverse ee)))
***************
*** 20587,20592 ****
--- 20591,20609 ----
((string-lessp cb ca) +1)
(t nil))))
+ (defsubst org-cmp-todo-state (a b)
+ "Compare the todo states of strings A and B."
+ (let* ((ta (or (get-text-property 1 'todo-state a) ""))
+ (tb (or (get-text-property 1 'todo-state b) ""))
+ (donepa (member ta org-done-keywords))
+ (donepb (member tb org-done-keywords)))
+ (message "Compare todo %s and %s (state: %s, %s)" ta tb donepa donepb)
+ (cond ((and donepa (not donepb)) -1)
+ ((and (not donepa) donepb) +1)
+ ((string-lessp ta tb) -1)
+ ((string-lessp tb ta) +1)
+ (t nil))))
+
(defsubst org-cmp-tag (a b)
"Compare the string values of categories of strings A and B."
(let ((ta (car (last (get-text-property 1 'tags a))))
***************
*** 20618,20624 ****
(category-down (if category-up (- category-up) nil))
(category-keep (if category-up +1 nil))
(tag-up (org-cmp-tag a b))
! (tag-down (if tag-up (- tag-up) nil)))
(cdr (assoc
(eval (cons 'or org-agenda-sorting-strategy-selected))
'((-1 . t) (1 . nil) (nil . nil))))))
--- 20635,20643 ----
(category-down (if category-up (- category-up) nil))
(category-keep (if category-up +1 nil))
(tag-up (org-cmp-tag a b))
! (tag-down (if tag-up (- tag-up) nil))
! (todo-state-up (org-cmp-todo-state a b))
! (todo-state-down (if todo-state-up (- todo-state-up) nil)))
(cdr (assoc
(eval (cons 'or org-agenda-sorting-strategy-selected))
'((-1 . t) (1 . nil) (nil . nil))))))
Diff finished. Wed Nov 21 08:00:36 2007
[-- Attachment #3: Type: text/plain, Size: 204 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Patch] Sort agenda items by todo-state
2007-11-21 12:13 [Patch] Sort agenda items by todo-state Egli Christian (KIRO 41)
@ 2007-11-22 7:35 ` Carsten Dominik
0 siblings, 0 replies; 2+ messages in thread
From: Carsten Dominik @ 2007-11-22 7:35 UTC (permalink / raw)
To: Egli Christian (KIRO 41); +Cc: emacs-orgmode
I for one do like the patch, so please clean it up and I would be
happy to take it
(if you have signed the papers with the FSF, that is :-(
- Carsten
On Nov 21, 2007 1:13 PM, Egli Christian (KIRO 41)
<christian.egli@credit-suisse.com> wrote:
>
>
>
>
> * Introduction
> I live in my org agenda view and I schedule all my tasks to the
> day that I want to do them. I also would like to see my
> achievements so I keep the TODOs that are done in the agenda
> view. However I would like them to get out of the way so that I
> can better see the tasks that are still open. That is why for a
> long time I've been wanting to sort the agenda items by todo
> state.
>
> * Patch
> I finally looked at the code and realized that this was not very
> hard to do. The following patch (against 5.13i) implements a new
> org-agenda-sorting-strategy that allows you to sort agenda items
> by todo-state.
>
> * Notes
> The patch is basically a "works-for-me" implementation. It only
> sorts todo and scheduled items. It should probably do the same
> for deadlines. Maybe even for timestamps?
>
> The doc strings need to be updated.
>
> Carsten at one time talked about implementing this feature by
> using priorities, i.e. factoring the todo-state into the priority
> (which uses the actual priority plus some calculation based on
> how many days the task is overdue). This patch takes a different
> route.
>
> The sorting is done by comparing the todo-state of the items. It
> first orders them by done state, i.e. all done items come after
> (or before) the items that are not done. After that it compares
> the todo-states with a string compare. This should probably use
> some kind of ordering information from the relevant
> org-todo-keywords sequence.
>
> * Conclusion
> So the basic question is: Should I clean up this patch to get it
> included? Is the proposed route (of not taking the priorities)
> ok? And finally: How do I sort taking the sequence order into
> consideration?
>
> Christian
>
>
> <<org.diff>>
> _______________________________________________
> Emacs-orgmode mailing list
> Remember: use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-11-22 7:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-21 12:13 [Patch] Sort agenda items by todo-state Egli Christian (KIRO 41)
2007-11-22 7:35 ` Carsten Dominik
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).