emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Christian Moe <mail@christianmoe.com>
To: suleika@gmail.com
Cc: emacs-orgmode@gnu.org
Subject: Re: Idea: insert "current sort order" property
Date: Tue, 11 Oct 2011 21:46:27 +0200	[thread overview]
Message-ID: <4E949D13.6060505@christianmoe.com> (raw)
In-Reply-To: <CAPQe_Ury6U43O7T64v2HWXe87GfVced3m18kAxDLPa58o980JQ@mail.gmail.com>

Hi, Gez,

On 10/7/11 5:02 PM, Gez wrote:
> What I'm imagining is a command executed on a headline to insert a
> property into each of its children "fixing" the current order;
> something like ":sorted:01", ":sorted:02"  etc.

I think this is a neat idea, and can see some uses for it for my own 
stuff. I've made a first pass below. Please test it and let me know 
how it works for you (and please *don't* test it on anything valuable 
without backing up first!).

> Ideally there would
> be a prompt for the property key (or part of it) so that there could
> be more than one such property for a particular headline, but with the
> option to simplify the usage and consistency by having just one
> property key as a default and no prompt.

More or less done. There'll be a prompt anyway, but just hit RET to 
select the default ("OutlineIndex").

> If a sorted headline got moved to a new parent its sort-order might be
> a duplicate one of its siblings, but I don't really see that as a
> problem - the user knows it's "only text" after all.

The below will just do sequential numbering, as you suggested (01, 02, 
03...) Then, as long as you've only changed the order of siblings at 
each level, the order can be restored by sorting on the outline-index 
property (C-c ^ r) for each parent.

Irretrievable chaos may and probably will result if headlines are 
demoted, promoted, or moved to new parents. As long as the user's fine 
with that, everything's fine.

An obvious refinement would be to do true outline numbering (e.g. 01, 
01-01, 01-01-01, 01-01-02, 01-02-01, 01-02-02 ...). Then you could 
restore the original outline entirely no matter how headings have been 
moved around. But you couldn't do that by sorting; making that useful 
would take additional code, so I haven't implemented it (yet).

> I don't know
> whether it might be desired to similarly fix the sort-order of 1st
> level headlines; perhaps the command could act per current file, with
> a < to narrow down to the current tree.

The below will not number the entry at point, because that could break 
a numbering already set at that level. It will number its direct 
children. With prefix, it will number all its descendants. See how it 
works for you. I made it the default behavior to number only the 
direct children of the entry at point, since littering the whole tree 
with property drawers is not necessarily what you want to do.

> I'm also not sure how to deal
> with larger numbers - 01-99 seems like a good default but could one
> have an option for 001-999?  I also wonder about adding the property
> to more than one level at a time, but might that be a bit much in
> terms of affecting performance?

Solved; the below counts the total number of headings first, then 
adjusts the zero padding accordingly. Code follows.


#+begin_src emacs-lisp
   (defun cm/org-store-outline-order (arg prop)
     "Store the outline of the subtree of the entry at point by
   setting the property PROP of each direct child entry to its
   current position in the tree. With prefix ARG, store the position
   of the whole subtree. The tree can be restored to the stored
   outline by sorting on the property with `C-c ^ r'. Note that this
   will only work properly on the order of each subtree; if headings
   are demoted, promoted, or moved into different subtrees, the
   result may or may not be nonsense, but it will be impossible to
   restore the original order by sorting."
     (interactive "P\nsProperty key (default OutlineIndex): ")
     (if (string= prop "") (setq prop "OutlineIndex"))
     (if (or (not (org-map-entries t (concat prop "={.}") 'tree))
             (y-or-n-p "Property exists; overwrite? "))
         (let* ((match (format "LEVEL%s%s"
                               (if arg ">=" "=")
                               (1+ (org-current-level))))
                (counter 1)
                (width (1+ (floor (log10 (length (org-map-entries t 
match 'tree))))))
                (fstr (concat "%0" (number-to-string width) "d")))
               (org-set-property prop
                                 (format fstr counter))
               (setq counter (1+ counter)))
            match 'tree)
           (message ""))))

  reply	other threads:[~2011-10-11 19:44 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-07 15:02 Idea: insert "current sort order" property Gez
2011-10-11 19:46 ` Christian Moe [this message]
2011-10-12 11:35   ` Gez
2011-10-12 12:16     ` Christian Moe
2011-10-12 15:59       ` Gez
2011-10-12 19:51         ` Christian Moe
2011-10-13 11:40           ` Gez
2011-10-13 12:39             ` Christian Moe
2011-10-13 18:34               ` Gez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E949D13.6060505@christianmoe.com \
    --to=mail@christianmoe.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=suleika@gmail.com \


* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox


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