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.
Yours,
Christian
#+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-map-entries
'(progn
(org-set-property prop
(format fstr counter))
(setq counter (1+ counter)))
match 'tree)
(message ""))))
#+end_src
next prev parent 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:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* 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 \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* 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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.