emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Get list of top-level headings


From: Jonathan Gregory
Subject: Re: Get list of top-level headings
Date: Wed, 19 May 2021 10:48:29 -0300
User-agent: mu4e 1.5.11; emacs 27.1

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]