all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Samuel Wales <samologist@gmail.com>
To: emacs-orgmode@gnu.org
Subject: org-map-entries doesn't understand deletions
Date: Sat, 4 Apr 2009 16:06:56 -0700	[thread overview]
Message-ID: <20524da70904041606t6e1dcb51ma568894b171e465b@mail.gmail.com> (raw)

A while back, I wanted to archive all tasks that were closed
more than n days ago (or, better, archive tasks merked with
a done todo keyword, since some tasks have vestigial closed
timestamps without having a done todo keyword).

I tried using mapping.  However, it took me months to get
this far, was extremely difficult for me, and it is still
not working.  I cannot proceed further, but I also now think
that the remaining issue is probably not user error.

The problem seems to be that archiving deletes entries,
which places point after the deleted entry, which causes
mapping to skip an entry.  See the comments for more details, including
why this is apparently not fixable by the user.

If it is not user error, then there might be a fundamental
problem with how org-map-entries places point.  I have a suggestion
for a possible solution in the comments.

Thanks.


;;i don't want to change the todo kw
(setf org-archive-mark-done nil)

(defvar alpha-org-archive-expired-ndays 31
  "when done (or closed -- see code) entries are expired, expire
only older todo entries.")
(defun alpha-org-days-since-closed ()
  "age in days since closed"
  (interactive)
  (let ((ts (org-entry-get nil "CLOSED")))
    (when ts (org-days-to-time ts))))
(defun alpha-org-expired-p ()
  (let ((n (alpha-org-days-since-closed)))
    (and n (< n (- alpha-org-archive-expired-ndays)))))
(defun alpha-org-archive-heading ()
  (interactive)
  ;;archiving moves point to the next entry, which is congruent to
  ;;/forward/ killing.  however, mapping moves point /after/
  ;;running this.  save-excursion would do nothing useful here.
  ;;
  ;;i think it's undocumented whether mapping operates 1.
  ;;according to point after execution, 2.  goes to a prior
  ;;concept of point (e.g. going to a marker placed at the next
  ;;entry), or 3.  does some kind of save-excursion thing that
  ;;assumes no deletion.  this question is important.
  ;;
  ;;it seems to be 3.  try running this on 2 sequential entries
  ;;that need archiving.  it will skip over the second even if you
  ;;manually move to the previous entry.  thus, perhaps, any
  ;;kludging around it in this function is reversed.  the code is
  ;;incomprehensible to me.
  ;;
  ;;i think that 3. is probably incorrect behavior because
  ;;sometimes, as here, people want to delete
  ;;entries.  1. would at least leave everything up to user
  ;;control and I would recommend it, despite its drawbacks.  if
save-excursion, or whatever, was placed there to fix some other
problem, then doing so might require care in implementing.  perhaps
even with a parameter.
  (when (alpha-org-expired-p)
;;;        ;;(insert (prin1-to-string (alpha-org-days-since-closed)))
    (org-archive-subtree)
    ;;the above moves point to the next entry, and exiting this
    ;;form moves it again.  therefore we have to move back.  dunno
    ;;if visibility matters, so playing it safe by saying visible
    ;;here and show-all in the caller.  this will instantiate a
    ;;loop if archiving does not do as expected.  that would be a
    ;;bug.
    (outline-previous-visible-heading 1)))
(defun alpha-org-archive-expired-closed ()
  (interactive)
  ;;forestall issues with folding and visibility
  (show-all)
  (org-map-entries 'alpha-org-archive-heading
                   ;;this expression is hardcoded instead of
                   ;;specifying doneness.  otoh, there are
                   ;;sometimes mistakenly closed items that are
                   ;;not done in the kw, and we don't want to
                   ;;archive those.
                   ;;
                   ;;"/+DONE|+MOOT"
                   ;;TODO={^DONE$\\|^MOOT$}
                   ;;"+CLOSED<\"<-1m>\""
                   t
                   'file))

-- 
Myalgic encephalomyelitis denialism is causing death (decades early;
Jason et al. 2006) and severe suffering (worse than nearly all other
diseases studied; e.g. Schweitzer et al. 1995) and grossly corrupting
science.  http://www.meactionuk.org.uk/What_Is_ME_What_Is_CFS.htm

             reply	other threads:[~2009-04-04 23:07 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-04 23:06 Samuel Wales [this message]
2009-04-05 11:48 ` org-map-entries doesn't understand deletions Carsten Dominik
2009-04-06  4:24   ` Samuel Wales
2009-04-06  6:02     ` Carsten Dominik

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=20524da70904041606t6e1dcb51ma568894b171e465b@mail.gmail.com \
    --to=samologist@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /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.