From: Nicolas Goaziou <n.goaziou@gmail.com>
To: nicholas.dokos@hp.com
Cc: emacs-orgmode@gnu.org
Subject: Re: Iterate over list with `org-next-item'
Date: Tue, 07 Sep 2010 21:33:55 +0200 [thread overview]
Message-ID: <871v95l55o.wl%n.goaziou@gmail.com> (raw)
In-Reply-To: <9637.1283480887@gamaville.dokosmarshall.org>
Hello,
>>>>> Nick Dokos writes:
> Zachary Young <zacharysyoung@gmail.com> wrote:
>> I am trying to iterate over a list with `org-next-item'. I just
>> tried:
>>
>> (ignore-errors (while (equal nil (org-next-item))))
>>
>> and it worked.
>>
>> Is there a better way to do this? I'm not very versed in Elisp, and
>> `org-next-item' returning `nil' on success, and throwing an error
>> at the end of the list is throwing me a bit.
>>
> It's always a good idea to browse the org-mode code itself for
> examples: after all it's been written by (or vetted by) the experts,
> so it should provide a good foundation.
> I found three examples of org-next-item usage, two of which are
> shown here (the third one is a bit subtler):
> * org.el:
> --8<---------------cut here---------------start------------->8---
> (defun org-skip-over-state-notes () "Skip past the list of State
> notes in an entry." (if (looking-at "\n[ \t]*- State") (forward-char
> 1)) (while (looking-at "[ \t]*- State") (condition-case nil
> (org-next-item) (error (org-end-of-item))))) --8<---------------cut
> here---------------end--------------->8---
> * org-mouse.el:
> --8<---------------cut here---------------start------------->8---
> (defun org-mouse-for-each-item (function) (save-excursion
> (ignore-errors (while t (org-previous-item))) (ignore-errors (while
> t (funcall function) (org-next-item))))) --8<---------------cut
> here---------------end--------------->8---
> As you can see, the second almost matches what you came up with, but
> the condition is simpler: the code *uses* the error raised to get
> out of the (otherwise infinite) loop, so there is no need to check
> what org-next-item returns.
I strongly advise against using `org-next-item' in a defun. It is, in
its actual form, meant for interactive use only.
You should have a look at `org-get-next-item' and
`org-get-previous-item' instead. I left a note about it at line 874 in
org-list.el (yes, I know...).
There is also `org-apply-on-list' that might be of some help.
Regards,
-- Nicolas
next prev parent reply other threads:[~2010-09-07 20:02 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-03 0:47 Iterate over list with `org-next-item' Zachary Young
2010-09-03 2:28 ` Nick Dokos
2010-09-07 19:33 ` Nicolas Goaziou [this message]
2010-09-07 19:58 ` Nick Dokos
2010-09-07 20:14 ` Nicolas Goaziou
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=871v95l55o.wl%n.goaziou@gmail.com \
--to=n.goaziou@gmail.com \
--cc=emacs-orgmode@gnu.org \
--cc=nicholas.dokos@hp.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.