[Top][All Lists]

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

Re: [Orgmode] Using orgstruct-mode to structure source code

From: Carsten Dominik
Subject: Re: [Orgmode] Using orgstruct-mode to structure source code
Date: Fri, 5 Sep 2008 09:15:35 +0200

Hi Tassilo,

I though a little bit about this, and using org-struct-mode in a commented block of text is going to be bumpy. No easy path.

What I do in such cases:

I put tow markers into the buffer hat delimit the text I want to edit in orgstruct-mode. And then I have custom function that toggles the comment starters on an off, like so:

;; * heading 1
;;   with text
;; * heading 2
;; ** subheading

(defun my-toggle-comment-or-orgstruct ()
 "Toggle comment for orgstruc editing."
 (let* ((re-beg "BEGIN ORGSTRUCT \"\\(.*?\\)\"")
         (re-end "END ORGSTRUCT")
         re rpl line1 line2)
        (unless (re-search-backward re-beg nil t)
          (error "Not in an orgstruct bock"))
        (setq line1 (org-current-line)
              leader (match-string 1)))
        (unless (re-search-forward re-end nil t)
          (error "Not in an orgstruct bock"))
        (setq line2 (org-current-line)))
     (goto-line (1+ line1))
     (if (equal (buffer-substring
                  (point) (+ (point) (length leader)))
          (setq re (concat "^" (regexp-quote leader))
                rpl "")
        (setq re "^" rpl leader))
     (while (and (re-search-forward re nil t)
                  (< (org-current-line) line2))
        (replace-match rpl t t)))))

Hope this helps

- Carsten

On Sep 3, 2008, at 12:20 PM, Tassilo Horn wrote:

Carsten Dominik <address@hidden> writes:

Hi Carsten,

"?..." is not a correct regular expression in Emacs.  You are using
wildcard synax, it seems.

No, I used (concat comment-starter "?...") to make the comment starter
optional.  But that's not fully correct.  In elisp the comment starter
may be there multiple times.  So now I go with this:

--8<---------------cut here---------------start------------->8---
(defun org-context-p (&rest contexts)
(let* ((pos (point))
(comment-starter (replace-regexp-in-string "[ ]+$" "" (or comment-start "")))
       (regexp-start (if (string= "" comment-start)
                       (concat comment-start "*"))))
  (goto-char (point-at-bol))
  (let ((ret (prog1
                 (or (and (memq 'table contexts)
(looking-at (concat regexp-start "[ \t]*|")))
                     (and (memq 'headline contexts)
                          (looking-at (concat regexp-start "\\*+")))
                     (and (memq 'item contexts)
                          (looking-at (concat regexp-start
"[ \t]*\\([-+*] \\| [0-9]+[.)] \\)"))))
               (goto-char pos))))
(message "org-context-p with regexp-start = %s ==> %s" regexp- start ret))))
--8<---------------cut here---------------end--------------->8---

Here's a short elisp test file:

--8<---------------cut here---------------start------------->8---
;;* First Headline    ; org-context-p ==> t, no visible action
                    ; org-context-p ==> nil, no visible action
(defun foo ()
nil)                ; org-context-p ==> nil, TAB deletes indentation!
; org-context-p ==> nil, TAB indents to nil's column ;;** Level2 ; org-context-p ==> t, TAB indents heading to nil's column

(+ 1 2 3)

;;** Another Level2

(- 1 1)

;;*** Three

;;* Second part

(list 1 2 3)        ; org-context-p ==> nil, TAB deletes indentation!
(* 1 2 3))          ; org-context-p ==> nil, TAB deletes indentation!

;;* Third part        ; org-context-p ==> t, TAB indents heading to
                    ; column of (* 1 2 3)
--8<---------------cut here---------------end--------------->8---

Behind the lines I've written what my redefinition of `org-context-p'
returns and what TAB does (*without* these comments).  As you can see
`org-context-p' seems to work correctly, but TAB doesn't cycle through
the visibility states but instead breakes indentation.

And if I invoke `M-x org-cycle' on a headline nothing happens.  As it
seems, `org-context-p' is not the only function which has to be adapted
to do the right thing if headlines are inside comments.

If you want to allow extra characters # and ; at the begin of the line, try
something like


Yes, see the code above.

I am not sure if this will work, in particular if it will make
structure editing work.

Sadly, it's not that easy.

Give it a try and send us a report, ok?



reply via email to

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