From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: Using orgstruct-mode to structure source code Date: Fri, 5 Sep 2008 09:15:35 +0200 Message-ID: <0E11839C-C0CE-41E8-A937-2CBCCB163BB1@uva.nl> References: <87od35fx3a.fsf@thinkpad.tsdh.de> <87k5dtfs3z.fsf@thinkpad.tsdh.de> Mime-Version: 1.0 (Apple Message framework v926) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KbVXz-0006Ni-Je for emacs-orgmode@gnu.org; Fri, 05 Sep 2008 03:15:59 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KbVXy-0006Mw-OX for emacs-orgmode@gnu.org; Fri, 05 Sep 2008 03:15:59 -0400 Received: from [199.232.76.173] (port=33794 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KbVXy-0006MV-4G for emacs-orgmode@gnu.org; Fri, 05 Sep 2008 03:15:58 -0400 Received: from mx20.gnu.org ([199.232.41.8]:39714) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KbVXx-0001Rp-Pk for emacs-orgmode@gnu.org; Fri, 05 Sep 2008 03:15:58 -0400 Received: from ug-out-1314.google.com ([66.249.92.172]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KbVXw-0004Au-Jj for emacs-orgmode@gnu.org; Fri, 05 Sep 2008 03:15:56 -0400 Received: by ug-out-1314.google.com with SMTP id a2so24872ugf.17 for ; Fri, 05 Sep 2008 00:15:56 -0700 (PDT) In-Reply-To: <87k5dtfs3z.fsf@thinkpad.tsdh.de> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Tassilo Horn Cc: emacs-orgmode@gnu.org 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: ;; BEGIN ORGSTRUCT ";; " ;; * heading 1 ;; with text ;; * heading 2 ;; ** subheading ;; END ORGSTRUCT (defun my-toggle-comment-or-orgstruct () "Toggle comment for orgstruc editing." (interactive) (let* ((re-beg "BEGIN ORGSTRUCT \"\\(.*?\\)\"") (re-end "END ORGSTRUCT") re rpl line1 line2) (save-excursion (save-excursion (unless (re-search-backward re-beg nil t) (error "Not in an orgstruct bock")) (setq line1 (org-current-line) leader (match-string 1))) (save-excursion (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))) 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 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 > > (progn > (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? > > Done! > > Bye, > Tassilo