* Using orgstruct-mode to structure source code @ 2008-09-03 8:32 Tassilo Horn 2008-09-03 9:36 ` Carsten Dominik 0 siblings, 1 reply; 9+ messages in thread From: Tassilo Horn @ 2008-09-03 8:32 UTC (permalink / raw) To: emacs-orgmode Hi, this is a resend of my message from <2008-08-20 Wed>. So far nobody answered and since Carsten is back now, I thought I may try again. I'd like to switch from outline-minor-mode to orgstruct-mode for various source code files, because the outline keybindings are not really quick nor easy to remember. For example in shell scripts (sh-mode) a headline looks like #* Foobar and in an elisp file it would be ;;* Foobar Now I've found out that `org-context-p' returns nil for these lines, and thus no org-mode command will be executed. So I've redefined it to this version: --8<---------------cut here---------------start------------->8--- (defun org-context-p (&rest contexts) "Check if local context is and of CONTEXTS. Possible values in the list of contexts are `table', `headline', and `item'." (let ((pos (point)) (comment-starter (replace-regexp-in-string "[ ]+$" "" (or comment-start "")))) (goto-char (point-at-bol)) (prog1 (or (and (memq 'table contexts) (looking-at (concat comment-starter "?[ \t]*|"))) (and (memq 'headline contexts) (looking-at (concat comment-starter "?\\*+"))) (and (memq 'item contexts) (looking-at (concat comment-starter "?[ \t]*\\([-+*] \\|[0-9]+[.)] \\)")))) (goto-char pos)))) --8<---------------cut here---------------end--------------->8--- Now it does return t for headlines like above, but still no org-mode command is issued. What do I have to do to get that working correctly? Bye, Tassilo ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-03 8:32 Using orgstruct-mode to structure source code Tassilo Horn @ 2008-09-03 9:36 ` Carsten Dominik 2008-09-03 10:20 ` Tassilo Horn 0 siblings, 1 reply; 9+ messages in thread From: Carsten Dominik @ 2008-09-03 9:36 UTC (permalink / raw) To: Tassilo Horn; +Cc: emacs-orgmode Hi Tassilo, "?..." is not a correct regular expression in Emacs. You are using wildcard synax, it seems. If you want to allow extra characters # and ; at the begin of the line, try something like "[;#]*..." I am not sure if this will work, in particular if it will make structure editing work. Give it a try and send us a report, ok? - Carsten On Sep 3, 2008, at 10:32 AM, Tassilo Horn wrote: > Hi, > > this is a resend of my message from <2008-08-20 Wed>. So far nobody > answered and since Carsten is back now, I thought I may try again. > > I'd like to switch from outline-minor-mode to orgstruct-mode for > various > source code files, because the outline keybindings are not really > quick > nor easy to remember. > > For example in shell scripts (sh-mode) a headline looks like > > #* Foobar > > and in an elisp file it would be > > ;;* Foobar > > Now I've found out that `org-context-p' returns nil for these lines, > and > thus no org-mode command will be executed. So I've redefined it to > this > version: > > --8<---------------cut here---------------start------------->8--- > (defun org-context-p (&rest contexts) > "Check if local context is and of CONTEXTS. > Possible values in the list of contexts are `table', `headline', and > `item'." > (let ((pos (point)) > (comment-starter (replace-regexp-in-string "[ ]+$" "" (or > comment-start "")))) > (goto-char (point-at-bol)) > (prog1 (or (and (memq 'table contexts) > (looking-at (concat comment-starter "?[ \t]*|"))) > (and (memq 'headline contexts) > (looking-at (concat comment-starter "?\\*+"))) > (and (memq 'item contexts) > (looking-at (concat comment-starter "?[ \t]*\\([-+*] \\|[0-9]+ > [.)] \\)")))) > (goto-char pos)))) > --8<---------------cut here---------------end--------------->8--- > > Now it does return t for headlines like above, but still no org-mode > command is issued. > > What do I have to do to get that working correctly? > > Bye, > Tassilo > > > > _______________________________________________ > Emacs-orgmode mailing list > Remember: use `Reply All' to send replies to the list. > Emacs-orgmode@gnu.org > http://lists.gnu.org/mailman/listinfo/emacs-orgmode ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-03 9:36 ` Carsten Dominik @ 2008-09-03 10:20 ` Tassilo Horn 2008-09-03 14:39 ` Eric Schulte 2008-09-05 7:15 ` Carsten Dominik 0 siblings, 2 replies; 9+ messages in thread From: Tassilo Horn @ 2008-09-03 10:20 UTC (permalink / raw) To: Carsten Dominik; +Cc: emacs-orgmode Carsten Dominik <dominik@science.uva.nl> 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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-03 10:20 ` Tassilo Horn @ 2008-09-03 14:39 ` Eric Schulte 2008-09-03 15:39 ` Tassilo Horn 2008-09-05 7:15 ` Carsten Dominik 1 sibling, 1 reply; 9+ messages in thread From: Eric Schulte @ 2008-09-03 14:39 UTC (permalink / raw) To: Tassilo Horn; +Cc: emacs-orgmode Instead of putting org into the source file, would it make sense to put the source code into an org file. Using MuMaMo-Mode http://www.emacswiki.org/cgi-bin/wiki/MuMaMo and delimiters like #+BEGIN_LISP #+END_LISP it would be possible to activate the appropriate source mode inside of the blocks, and it shouldn't be too hard to define an `org-export-to-source-code' function. -- Eric ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-03 14:39 ` Eric Schulte @ 2008-09-03 15:39 ` Tassilo Horn 0 siblings, 0 replies; 9+ messages in thread From: Tassilo Horn @ 2008-09-03 15:39 UTC (permalink / raw) To: Eric Schulte; +Cc: emacs-orgmode "Eric Schulte" <schulte.eric@gmail.com> writes: Hi Eric, > Instead of putting org into the source file, would it make sense to > put the source code into an org file. Using MuMaMo-Mode > http://www.emacswiki.org/cgi-bin/wiki/MuMaMo and delimiters like > > #+BEGIN_LISP > > #+END_LISP > > it would be possible to activate the appropriate source mode inside of > the blocks, and it shouldn't be too hard to define an > `org-export-to-source-code' function. I wouldn't like that for at least two reasons. 1) Not all files I where I use headlines for structuring are private to me. Such a headline doesn't disturb anybody, but your suggestion works out only if everybody who needs to edit those files uses emacs and org. 2) All the links to files you get with `describe-function' and friends would point to generated files. If I want to change something, I'd have to find the corresponding org file first. Bye, Tassilo ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-03 10:20 ` Tassilo Horn 2008-09-03 14:39 ` Eric Schulte @ 2008-09-05 7:15 ` Carsten Dominik 2008-09-05 8:02 ` Tassilo Horn 1 sibling, 1 reply; 9+ messages in thread From: Carsten Dominik @ 2008-09-05 7:15 UTC (permalink / raw) To: Tassilo Horn; +Cc: emacs-orgmode 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 <dominik@science.uva.nl> 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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-05 7:15 ` Carsten Dominik @ 2008-09-05 8:02 ` Tassilo Horn 2008-09-05 9:07 ` Carsten Dominik 0 siblings, 1 reply; 9+ messages in thread From: Tassilo Horn @ 2008-09-05 8:02 UTC (permalink / raw) To: Carsten Dominik; +Cc: emacs-orgmode Carsten Dominik <dominik@science.uva.nl> writes: Hi Carsten, > 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. Too bad. I thought that it would be easy (at least for headlines) by simply allowing `comment-start' before the headline. > 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 The problem with this is, that "with text" will be commented, too. But in my case this would be source code, which should not be commented. So now I think I'll stay with outline-minor-mode. The thing which is much better with orgstruct-mode is that TAB has a special meaning depending on the context point is on. So I'll use that feature to make outline-minor-mode do what I want. IMO this facility could be of use in may other places, too. I think it would be nice to rip that out of org-mode into something more generic, like (define-context-key some-keymap (kbd "TAB") 'foobar-context-p 'do-foo). I played a bit with the code and tried to elicit how you get the command that normally would have been invoked if the stealing function wasn't there, but I failed. Could you please enlighten me? All the best, Tassilo ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-05 8:02 ` Tassilo Horn @ 2008-09-05 9:07 ` Carsten Dominik 2008-09-05 9:41 ` Tassilo Horn 0 siblings, 1 reply; 9+ messages in thread From: Carsten Dominik @ 2008-09-05 9:07 UTC (permalink / raw) To: Tassilo Horn; +Cc: emacs-orgmode On Sep 5, 2008, at 10:02 AM, Tassilo Horn wrote: > Carsten Dominik <dominik@science.uva.nl> writes: > > Hi Carsten, > >> 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. > > Too bad. I thought that it would be easy (at least for headlines) by > simply allowing `comment-start' before the headline. > >> 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 > > The problem with this is, that "with text" will be commented, too. > But > in my case this would be source code, which should not be commented. > > So now I think I'll stay with outline-minor-mode. The thing which is > much better with orgstruct-mode is that TAB has a special meaning > depending on the context point is on. So I'll use that feature to > make > outline-minor-mode do what I want. IMO this facility could be of > use in > may other places, too. I think it would be nice to rip that out of > org-mode into something more generic, like > > (define-context-key some-keymap (kbd "TAB") > 'foobar-context-p > 'do-foo). > > I played a bit with the code and tried to elicit how you get the > command > that normally would have been invoked if the stealing function wasn't > there, but I failed. Could you please enlighten me? I am explaining this in detail near the end of the google tech talk, with a code example. Basically, it works by temporarily turning of the minor mode that defines the command and doing a key lookup. - Carsten > > > All the best, > Tassilo ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using orgstruct-mode to structure source code 2008-09-05 9:07 ` Carsten Dominik @ 2008-09-05 9:41 ` Tassilo Horn 0 siblings, 0 replies; 9+ messages in thread From: Tassilo Horn @ 2008-09-05 9:41 UTC (permalink / raw) To: Carsten Dominik; +Cc: emacs-orgmode Carsten Dominik <dominik@science.uva.nl> writes: Hi Carsten, >> I played a bit with the code and tried to elicit how you get the >> command that normally would have been invoked if the stealing >> function wasn't there, but I failed. Could you please enlighten me? > > I am explaining this in detail near the end of the google tech talk, > with a code example. Basically, it works by temporarily turning of > the minor mode that defines the command and doing a key lookup. Watching that video is on my TODO list anyway. :-) Bye, Tassilo ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-09-05 9:43 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-09-03 8:32 Using orgstruct-mode to structure source code Tassilo Horn 2008-09-03 9:36 ` Carsten Dominik 2008-09-03 10:20 ` Tassilo Horn 2008-09-03 14:39 ` Eric Schulte 2008-09-03 15:39 ` Tassilo Horn 2008-09-05 7:15 ` Carsten Dominik 2008-09-05 8:02 ` Tassilo Horn 2008-09-05 9:07 ` Carsten Dominik 2008-09-05 9:41 ` Tassilo Horn
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).