emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Sort by Inactive Timestamp
@ 2012-12-06 22:13 Jeff Mickey
  2012-12-07 16:41 ` John Hendy
  0 siblings, 1 reply; 8+ messages in thread
From: Jeff Mickey @ 2012-12-06 22:13 UTC (permalink / raw)
  To: emacs-orgmode Org-Mode

Hey Org mailing list!

So, I have been using org for years (2006?) now, absolutely adore it.
The generic org-export in contrib really excites me as well, I want to
try and write an org-e-mediawiki.el after I learn some more about
org's implementation.

However.. my current issue: I'd like to sort my todo's by when I
entered them. So in my capture template I put an inactive timestamp at
the bottom, so my headlines look something like:

--8<---------------cut here---------------start------------->8---
* Todo
** TODO call mom
- Ask about christmas
- Talk about Dad
- See if she bought a dog

   [2012-12-05 Wed 16:36]
** TODO Yet another thing
   [2012-12-05 Wed 16:37]
--8<---------------cut here---------------end--------------->8---

I'd love to have a way to bring up the agenda and have it sorted by
this ctime I'm manually inserting. Do people have suggestions on the
best way to support this?

Maybe add a property to my TODOs that is this creation time?
Has anyone else done something similar to this using
org-agenda-cmp-user-defined?

... is this the wrong place to ask this question?

I appreciate any and all help!

  //  jeff

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Sort by Inactive Timestamp
@ 2012-12-06 22:30 Jeff Mickey
  2012-12-07  0:35 ` Samuel Wales
  2012-12-07 19:43 ` Memnon Anon
  0 siblings, 2 replies; 8+ messages in thread
From: Jeff Mickey @ 2012-12-06 22:30 UTC (permalink / raw)
  To: emacs-orgmode Org-Mode

Hey Org mailing list!

So, I have been using org for years (2006?) now, absolutely adore it.
The generic org-export in contrib really excites me as well, I want to
try and write an org-e-mediawiki.el after I learn some more about
org's implementation.

However.. my current issue: I'd like to sort my todo's by when I
entered them. So in my capture template I put an inactive timestamp at
the bottom, so my headlines look something like:

--8<---------------cut here---------------start------------->8---
* Todo
** TODO call mom
- Ask about christmas
- Talk about Dad
- See if she bought a dog

   [2012-12-05 Wed 16:36]
** TODO Yet another thing
   [2012-12-05 Wed 16:37]
--8<---------------cut here---------------end--------------->8---

I'd love to have a way to bring up the agenda and have it sorted by
this ctime I'm manually inserting. Do people have suggestions on the
best way to support this?

Maybe add a property to my TODOs that is this creation time?
Has anyone else done something similar to this using
org-agenda-cmp-user-defined?

... is this the wrong place to ask this question?

I appreciate any and all help!

  //  jeff

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-06 22:30 Jeff Mickey
@ 2012-12-07  0:35 ` Samuel Wales
  2012-12-07  0:38   ` Samuel Wales
  2012-12-07 19:43 ` Memnon Anon
  1 sibling, 1 reply; 8+ messages in thread
From: Samuel Wales @ 2012-12-07  0:35 UTC (permalink / raw)
  To: Jeff Mickey; +Cc: emacs-orgmode Org-Mode

I can't give you the answer, only the tools, as my setup contains
years of stuff.

The manual says how to do sorting in the outline and the agenda using
user-defined functions.

The key thing is converting timestamps into something that you can use
reliably.  I wrote these over a long period years ago.

(defun alpha-org-timestamp-score (&optional sg)
  "Return unix minutes as a floating point number.

;;;for 0..1
;;;Beware adding this to a much larger number (around 100); you will
;;;lose resolution.  Multiply first by a number with a lot of
;;;zeroes.  Then add to a number with a lot of zeroes.

Seems to be unix time as 1970 (or a few hours off, possibly
depending on time zone) epoch.

This is for sorting conversations, which have an inactive
timestamp near the beginning of a header, and for all tasks.  Any
closed should be first inactive, followed by logbook if you sort
those reversed.  This is what you usually want.

Return the first inactive timestamp even if it is CLOSED.

===

There is no way to get Org to return the first ts of any type.

If closed check is after ts check, then if there is an inactive
timestamp (such as in logbook) that is after CLOSED, will use
that first.

/fixme/ request a timestamp-any property.  this gets you the
first timestamp no matter whether it is active and no matter
where it is.

This now checks closed first.  So the bug now is if there is a ts
in the headline, closed will take precedence if it exists.

Still, this approach works OK; think of the time as always being
the time of closing for a doneish, else first ts.  That is OK.

So not making the request now.

/Does not yet consider active timestamps/."
  ;;
  ;;make sure these work on any other processor or os
  ;;
  ;;(/ (org-time-string-to-seconds "1900-12-31 00:00") 60.0) nan
  ;;(/ (org-time-string-to-seconds "1901-12-31 00:00") 60.0) -35766300.0
  ;;(/ (org-time-string-to-seconds "1934-12-31 00:00") 60.0) -18409980.0
  ;;(/ (org-time-string-to-seconds "1960-12-31 00:00") 60.0) -4734300.0
  ;;(/ (org-time-string-to-seconds "1969-12-31 00:00") 60.0) -1020.0
  ;;(/ (org-time-string-to-seconds "1970-01-01 00:00") 60.0) 420.0
  ;;(/ (org-time-string-to-seconds "1980-01-01 00:00") 60.0) 5259300.0
  ;;(/ (org-time-string-to-seconds "1990-01-01 00:00") 60.0) 10519620.0
  ;;(/ (org-time-string-to-seconds "2010-01-01 00:00") 60.0) 21038820.0
  ;;(/ (org-time-string-to-seconds "2038-01-01 00:00") 60.0) 35765700.0
  ;;(/ (org-time-string-to-seconds "2138-01-01 00:00") 60.0) nan
  ;;if you do seconds instead of minutes, it changes order around 2010
  ;;seems ok to multiply by 1e7 or so
  ;;(+ 1.0 (* 10519620.0 1e8)) 1051962000000001.0 :)
  ;;(+ 1.0 (* 10519620.0 1e9)) 1.051962e+16 :(
  ;;(= (+ 1.0 (* 10519620.0 1e9)) (* 10519620.0 1e9)) t :(
  ;;(/ (org-time-string-to-seconds "1990-01-01 00:00") 60.0) 10,519,620.0
  (let ((ts (or
             ;;this fixes either a doc bug or a real bug, not
             ;;sure which
             (alpha-org-entry-get "CLOSED" sg)
             (alpha-org-entry-get "TIMESTAMP_IA" sg))))
    (aif ts
         (/ (org-time-string-to-seconds it)
            60.0)
      0.0)))

;;all of my other get functions should use this.  are there
;;issues with it?
(defun alpha-org-entry-get (property &optional sg inherit)
  "Return the value of PROPERTY, whether you are in the outline
or the agenda, by calling `org-entry-get'.

SG is the agenda header string provided by user-defined agenda
sorting, or nil.  If it is nil and you are in the outline, use
the current headline directly.  If it is nil and you are in the
agenda, use the current headline by going to the outline.

INHERIT is the inherit argument for `org-entry-get'.

There are a few questions about Org properties:

  1) What does it mean to get alltags without inheritance or tags
     with inheritance?  I guess org-entry-get was originally
     meant for properties, not tags, so you don't use inherit?
  2) How do you get the first timestamp in an entry?  There seems
     to be no way without specifying the type of timestamp.

According to the manual at the time of this writing, possible
properties include these.

     TODO         The TODO keyword of the entry.
     TAGS         The tags defined directly in the headline.
     ALLTAGS      All tags, including inherited ones.
     CATEGORY     The category of an entry.
     PRIORITY     The priority of the entry, a string with a single letter.
     DEADLINE     The deadline time string, without the angular brackets.
     SCHEDULED    The scheduling timestamp, without the angular brackets.
     CLOSED       When was this entry closed?
     TIMESTAMP    The first keyword-less timestamp in the entry.
       - this works even in the headline
     TIMESTAMP_IA The first inactive timestamp in the entry.
       - this works even in the headline
       - it does not seem to report CLOSED ts -- use CLOSED
     CLOCKSUM     The sum of CLOCK intervals in the subtree.  org-clock-sum
                  must be run first to compute the values.
     ITEM         The content of the entry.

For anything else, you can use marker-buffer to get to the
outline and do manual parsing or use some other function.  Or
possibly modify org-entry-get to understand it and send a patch
to the org mailing list, along with an update of this docstring.

The idea is to use this as a single way to get most metadata no
matter where you are.
"
  ;;=doubtful do we want the literal-nil argument so that we can
  ;;ret "nil" as string?  check elsewhere here for nil vs. string
  ;;for todo kw or whatever.  we only need it if it helps with
  ;;consistency.  not important and prob useless for this
  ;;purpose.  (other ways of getting todo kw will not obey it so
  ;;it might not help.)
  (org-entry-get
   (cond
     ((eq major-mode 'org-agenda-mode)
      (let* ((s (or sg (buffer-substring (point-at-bol)
                                         (point-at-eol))))
             (m (or (get-text-property 1 'org-marker s)
                    (get-text-property 1 'org-hd-marker s))))
        ;;do this to get to the buffer if you need other data that
        ;;org-entry-get cannot extract
        ;;(b (and m (marker-buffer m))))
;;;        (if b
;;;            (with-current-buffer b
;;;              (goto-char m)
        m))
     ((eq major-mode 'org-mode) (point))
     (t (error "Not in an org-mode buffer")))
   property
   inherit))

-- 
The Kafka Pandemic: http://thekafkapandemic.blogspot.com

The disease DOES progress.  MANY people have died from it.  ANYBODY
can get it.  There is no hope without action.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-07  0:35 ` Samuel Wales
@ 2012-12-07  0:38   ` Samuel Wales
  0 siblings, 0 replies; 8+ messages in thread
From: Samuel Wales @ 2012-12-07  0:38 UTC (permalink / raw)
  To: Jeff Mickey; +Cc: emacs-orgmode Org-Mode

I think your setup is only by time, so you don't really need to
convert the timestamps, and you don't really need the generalized get
function.  You can just use org-entry-get.

-- 
The Kafka Pandemic: http://thekafkapandemic.blogspot.com

The disease DOES progress.  MANY people have died from it.  ANYBODY
can get it.  There is no hope without action.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-06 22:13 Sort by Inactive Timestamp Jeff Mickey
@ 2012-12-07 16:41 ` John Hendy
  0 siblings, 0 replies; 8+ messages in thread
From: John Hendy @ 2012-12-07 16:41 UTC (permalink / raw)
  To: Jeff Mickey; +Cc: emacs-orgmode Org-Mode

[-- Attachment #1: Type: text/plain, Size: 2263 bytes --]

On Thu, Dec 6, 2012 at 4:13 PM, Jeff Mickey <j@codemac.net> wrote:

> Hey Org mailing list!
>
> So, I have been using org for years (2006?) now, absolutely adore it.
> The generic org-export in contrib really excites me as well, I want to
> try and write an org-e-mediawiki.el after I learn some more about
> org's implementation.
>
> However.. my current issue: I'd like to sort my todo's by when I
> entered them. So in my capture template I put an inactive timestamp at
> the bottom, so my headlines look something like:
>
> --8<---------------cut here---------------start------------->8---
> * Todo
> ** TODO call mom
> - Ask about christmas
> - Talk about Dad
> - See if she bought a dog
>
>    [2012-12-05 Wed 16:36]
> ** TODO Yet another thing
>    [2012-12-05 Wed 16:37]
> --8<---------------cut here---------------end--------------->8---
>
> I'd love to have a way to bring up the agenda and have it sorted by
> this ctime I'm manually inserting. Do people have suggestions on the
> best way to support this?
>
>
Two thoughts:

1) I recently requested a feature addition like this for sparse trees and
Bastian quickly and awesomely added it:
- http://comments.gmane.org/gmane.emacs.orgmode/55501

I wonder if something similar could be added to agenda to allow for what
you want?

2) On that note, have you looked at the agenda log mode? It seems that it's
nearly got what you're looking for, except at the moment it only allows for
things with inactive time stamps that are todo state changes, clocked, or
have been marked done.

Perhaps log mode could have a "journal" mode in which all time stamped
items are extracted?


I'm thinking someone will have to add a tweak to current functionality.
There's a bit I found when googling that org-mode can sort by timestamps --
I'm assuming this means to rearrange actual headlines in the file, which is
probably not what you want. Perhaps the build in sorting combined with the
above could get you the view you're looking for.


Best regards,
John



> Maybe add a property to my TODOs that is this creation time?
> Has anyone else done something similar to this using
> org-agenda-cmp-user-defined?
>
> ... is this the wrong place to ask this question?
>
> I appreciate any and all help!
>
>   //  jeff
>
>

[-- Attachment #2: Type: text/html, Size: 3183 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-06 22:30 Jeff Mickey
  2012-12-07  0:35 ` Samuel Wales
@ 2012-12-07 19:43 ` Memnon Anon
  2012-12-09  4:54   ` Jeff Mickey
  1 sibling, 1 reply; 8+ messages in thread
From: Memnon Anon @ 2012-12-07 19:43 UTC (permalink / raw)
  To: emacs-orgmode

Jeff Mickey <jeff@archlinux.org> writes:

> However.. my current issue: I'd like to sort my todo's by when I
> entered them. So in my capture template I put an inactive timestamp at
> the bottom, so my headlines look something like:
>
> --8<---------------cut here---------------start------------->8---
> * Todo
> ** TODO call mom
> - Ask about christmas
> - Talk about Dad
> - See if she bought a dog
>
>    [2012-12-05 Wed 16:36]
> ** TODO Yet another thing
>    [2012-12-05 Wed 16:37]
> --8<---------------cut here---------------end--------------->8---
>
> I'd love to have a way to bring up the agenda and have it sorted by
> this ctime I'm manually inserting. Do people have suggestions on the
> best way to support this?
>
> Maybe add a property to my TODOs that is this creation time?
> Has anyone else done something similar to this using
> org-agenda-cmp-user-defined?

Hmmm.
If your 'creation' timestamp is the only inactive timestamp, you won't
need a special property; org-entry-get should give you the right one.

I am not good at this, but what about something like:

--8<---------------cut here---------------start------------->8---
(defun my-agenda-sort-by-inactive-timestamp (a b)
  "Sort by interactive timestamp. Oldest first, items without any ts at the bottom."
  (let* ((ma (or (get-text-property 1 'org-marker a)
		 (get-text-property 1 'org-hd-marker a)))
	 (mb (or (get-text-property 1 'org-marker b)
		 (get-text-property 1 'org-hd-marker b)))
	 (tsa (org-entry-get ma "TIMESTAMP_IA"))
	 (tsb (org-entry-get mb "TIMESTAMP_IA"))
	 (ta (when tsa (date-to-time tsa)))
	 (tb (when tsb (date-to-time tsb))))

    (cond  ((eq tsa nil) +1)
	   ((eq tsb nil) -1)
	   ((time-less-p ta tb)
		-1)
	   ((time-less-p tb ta)
	       +1)
	   (t nil))))

(setq org-agenda-custom-commands
      '(("x" "Tasks" todo ""
               ((org-agenda-overriding-header "Tasks sorted by
               TIMESTAMP_IA")
               (org-agenda-cmp-user-defined 'my-agenda-sort-by-inactive-timestamp)
                (org-agenda-sorting-strategy
                 '(user-defined-up)))
	       )))
--8<---------------cut here---------------end--------------->8---

Does that work?

If you use :logbook:, entries within will 'override' your inactive
timestamp at the end of the entry. A special CREATED property would be
useful in this case.

> ... is this the wrong place to ask this question?

Definitely not :).

Memnon

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-07 19:43 ` Memnon Anon
@ 2012-12-09  4:54   ` Jeff Mickey
  2012-12-09 16:11     ` Memnon Anon
  0 siblings, 1 reply; 8+ messages in thread
From: Jeff Mickey @ 2012-12-09  4:54 UTC (permalink / raw)
  To: Memnon Anon; +Cc: emacs-orgmode Org-Mode

On Fri, Dec 7, 2012 at 11:43 AM, Memnon Anon
<gegendosenfleisch@googlemail.com> wrote:
> --8<---------------cut here---------------start------------->8---
> (defun my-agenda-sort-by-inactive-timestamp (a b)
>   "Sort by interactive timestamp. Oldest first, items without any ts at the bottom."
>   (let* ((ma (or (get-text-property 1 'org-marker a)
>                  (get-text-property 1 'org-hd-marker a)))
>          (mb (or (get-text-property 1 'org-marker b)
>                  (get-text-property 1 'org-hd-marker b)))
>          (tsa (org-entry-get ma "TIMESTAMP_IA"))
>          (tsb (org-entry-get mb "TIMESTAMP_IA"))
>          (ta (when tsa (date-to-time tsa)))
>          (tb (when tsb (date-to-time tsb))))
>
>     (cond  ((eq tsa nil) +1)
>            ((eq tsb nil) -1)
>            ((time-less-p ta tb)
>                 -1)
>            ((time-less-p tb ta)
>                +1)
>            (t nil))))
>
> (setq org-agenda-custom-commands
>       '(("x" "Tasks" todo ""
>                ((org-agenda-overriding-header "Tasks sorted by
>                TIMESTAMP_IA")
>                (org-agenda-cmp-user-defined 'my-agenda-sort-by-inactive-timestamp)
>                 (org-agenda-sorting-strategy
>                  '(user-defined-up)))
>                )))
> --8<---------------cut here---------------end--------------->8---
>
> Does that work?

Thank you Memnon! The (get-text-property 1 'org-marker a) is still
voodoo to me, but that worked perfectly.

  //  jeff

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Sort by Inactive Timestamp
  2012-12-09  4:54   ` Jeff Mickey
@ 2012-12-09 16:11     ` Memnon Anon
  0 siblings, 0 replies; 8+ messages in thread
From: Memnon Anon @ 2012-12-09 16:11 UTC (permalink / raw)
  To: emacs-orgmode

Jeff Mickey <jeff@archlinux.org> writes:

> Thank you Memnon! The (get-text-property 1 'org-marker a) is still
> voodoo to me, but that worked perfectly.

Hehe, it *is* black magic.
Carsten recommended to have a look at the org-cmp-* functions 
(http://article.gmane.org/gmane.emacs.orgmode/14634).

Those lines are basically cut&paste/kill&yank from org-cmp-todo-state in
org-agenda.el.

Follow Carstens advice
,----[ http://article.gmane.org/gmane.emacs.orgmode/14634 ]
|        "You can look at these properties by pressing `C-u C-x =' on a line in  
|        the agenda." 
`----
and voodoo downgrades to black magic.

Gmane rocks!

Memnon

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-12-09 16:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-06 22:13 Sort by Inactive Timestamp Jeff Mickey
2012-12-07 16:41 ` John Hendy
  -- strict thread matches above, loose matches on Subject: below --
2012-12-06 22:30 Jeff Mickey
2012-12-07  0:35 ` Samuel Wales
2012-12-07  0:38   ` Samuel Wales
2012-12-07 19:43 ` Memnon Anon
2012-12-09  4:54   ` Jeff Mickey
2012-12-09 16:11     ` Memnon Anon

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).