Hello Florian
On 19 May 2021, Florian Lindner wrote:
Hello,
I, an Emacs Lisp newbie, want to get a list of all top-level
headings
of the current buffer. My approach so far is:
(defun test-org-map()
(interactive)
(setq headings '())
(org-map-entries (lambda ()
(setq current-header-item
(org-element-property :
title (org-element-at-point))
(message "Header: %s" current-header-item)
(message "Is String: %s" (stringp
(org-element-property :title (org-element-at-point))))
(setq headings (append current-header-item
headings))
)
"LEVEL=1"
)
(dolist (heading headings)
(message "Header Item: %s" heading)
)
)
This gives the otput:
Header: AAA
Is String: t
Header: BBB
Is String: t
Header Item: 66 [3 times]
Header Item: 65 [3 times]
so basically the (org-element-property :title
(org-element-at-point)
does exactly what I want, but building the list does not what I
want.
I suppose that comes from a fundamental misunderstanding of how
strings work in elisp.
I would appreciate a short explanation (or pointers) why this
does not
work. And of course, I am very open to completely different,
likely
better, approches to that simply problem!
Thanks,
Florian
The org-map-entries function calls FUNC at each headline, so you
have to (1) find the headline/title and (2) add it to your list.
One way to do this is with the push macro.
--8<---------------cut here---------------start------------->8---
(defun test-org-map ()
(interactive)
(let (headlines)
(org-map-entries
(lambda ()
(let* ((element (org-element-at-point))
(headline (org-element-property :title element)))
(push headline headlines)))
"LEVEL=1")
(print (nreverse headlines))))
--8<---------------cut here---------------end--------------->8---
Or by searching the buffer:
--8<---------------cut here---------------start------------->8---
(defun test-org-map ()
(interactive)
(let (headlines)
(save-excursion
(goto-char (point-max))
(while (re-search-backward org-complex-heading-regexp nil t)
(let ((headline (match-string-no-properties 4)))
(when (= (org-current-level) 1)
(push headline headlines))))
(print headlines))))
--8<---------------cut here---------------end--------------->8---
BTW you're missing a closing parenthesis in:
(setq current-header-item (org-element-property :title
(org-element-at-point)))
Maybe that's why you're getting errors.
--
Jonathan