emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Carsten Dominik <carsten.dominik@gmail.com>
To: Dan Davison <davison@stats.ox.ac.uk>
Cc: emacs org-mode mailing list <emacs-orgmode@gnu.org>
Subject: Re: [PATCH] org-src code indentation, etc
Date: Thu, 8 Oct 2009 21:34:02 +0200	[thread overview]
Message-ID: <327CA9A6-7D1E-457C-B1F5-D3376845EC29@gmail.com> (raw)
In-Reply-To: <878wfln8ct.fsf@stats.ox.ac.uk>

Hi Dan,

I have applied the patch, thank you very much.

- Carsten

On Oct 8, 2009, at 6:44 PM, Dan Davison wrote:

> Branch ded-src-indent at
>
> http://repo.or.cz/r/org-mode/babel.git
>
> proposes two improvements to org-src-mode, one related improvement to
> org-babel, and fixes two small bugs in org-mode. The diff is below  
> for a
> quick look. Carsten, if you approve, could you pull this from the git
> repo? It should add 4 commits to current org.
>
> Improvements to org-src-mode
>
> - Point stays in same location relative to text when switching between
>  org and code buffers.
>
> - A new customisable variable org-src-preserve-indentation allows the
>  user to prevent org from making any automatic alterations to code
>  indentation when moving between org and code buffers. One requirement
>  for this is when extracting source code embedded in an org buffer  
> (see
>  below).
>
> Org Bugs fixed
>
> - Setting org-edit-src-content-indentation to zero resulted in an
>  infinite loop in org-edit-src-exit.
>
> - Fixed width regions are defined by lines starting with a colon, with
>  optional leading whitespace. However, if there was any leading
>  whitespace, org-edit-src-exit behaved incorrectly causing the leading
>  whitespace to grow.
>
> - Also some docstring typos and a docstring correction, and some
>  variable name clarification.
>
> Org-babel new feature
>
> - Make the tangling (source code extraction) process respect the new
>  variable org-src-preserve-indentation. This allows python code to be
>  tangled correctly, regardless of how classes/methods/functions are
>  distributed among org code blocks. Previously, for example, a class
>  method in a separate source block would have been incorrectly  
> indented
>  as a top-level function in tangled output.
>
> In addition, there is an unimportant org-mode bug that is *not* yet
> fixed
>
> - If a source block contains an empty line and nothing else, repeated
>  invocations of org-edit-src-code followed by org-edit-src-exit will
>  add spaces to that line, indefinitely. This is because
>  org-do-remove-indentation does not do anything when the 'code'
>  consists only of space characters.
>
> Dan
>
>
> Please obtain commits from branch ded-src-indent at
>
> http://repo.or.cz/r/org-mode/babel.git
>
> --8<---------------cut here---------------start------------->8---
> diff --git a/contrib/babel/lisp/org-babel.el b/contrib/babel/lisp/ 
> org-babel.el
> index db09231..8b0b11e 100644
> --- a/contrib/babel/lisp/org-babel.el
> +++ b/contrib/babel/lisp/org-babel.el
> @@ -366,13 +366,14 @@ may be specified in the properties of the  
> current outline entry."
> (defun org-babel-parse-src-block-match ()
>   (let* ((lang (org-babel-clean-text-properties (match-string 1)))
>          (lang-headers (intern (concat "org-babel-default-header- 
> args:" lang)))
> -         (body (org-babel-clean-text-properties (match-string 4))))
> +         (body (org-babel-clean-text-properties (match-string 4)))
> +	 (preserve-indentation org-src-preserve-indentation))
>     (list lang
>           ;; get src block body removing properties, protective  
> commas, and indentation
>           (with-temp-buffer
>             (save-match-data
>               (insert (org-babel-strip-protective-commas body))
> -              (org-do-remove-indentation)
> +	      (unless preserve-indentation (org-do-remove-indentation))
>               (buffer-string)))
> 	  (org-babel-merge-params
> 	   org-babel-default-header-args
> diff --git a/lisp/org-src.el b/lisp/org-src.el
> index 3427b7f..796e914 100644
> --- a/lisp/org-src.el
> +++ b/lisp/org-src.el
> @@ -81,11 +81,22 @@ These are the regions where each line starts  
> with a colon."
> 	  (const fundamental-mode)
> 	  (function :tag "Other (specify)")))
>
> +(defcustom org-src-preserve-indentation nil
> +  "If non-nil, leading whitespace characters in source code
> +  blocks are preserved. Otherwise, after editing with
> +  \\[org-edit-src-code], the minimum (across-lines) number of
> +  leading whitespace characters are removed from all lines, and
> +  the code block is then uniformly indented according to the
> +  value of `org-edit-src-content-indentation'."
> +  :group 'org-edit-structure
> +  :type 'boolean)
> +
> (defcustom org-edit-src-content-indentation 2
> -  "Indentation for the content is a source code block.
> +  "Indentation for the content of a source code block.
> This should be the number of spaces added to the indentation of the # 
> +begin
> line in order to compute the indentation of the block content after
> -editing it with \\[org-edit-src-code]."
> +editing it with \\[org-edit-src-code]. Has no effect if
> +`org-src-preserve-indentation' is non-nil."
>   :group 'org-edit-structure
>   :type 'integer)
>
> @@ -135,7 +146,7 @@ For example, there is no ocaml-mode in Emacs,  
> but the mode to use is
> (defvar org-edit-src-beg-marker nil)
> (defvar org-edit-src-end-marker nil)
> (defvar org-edit-src-overlay nil)
> -(defvar org-edit-src-nindent nil)
> +(defvar org-edit-src-block-indentation nil)
>
> (define-minor-mode org-src-mode
>   "Minor mode for language major mode buffers generated by org.
> @@ -153,6 +164,7 @@ This will remove the original code in the Org  
> buffer, and replace it with
> the edited version."
>   (interactive)
>   (let ((line (org-current-line))
> +	(col (current-column))
> 	(case-fold-search t)
> 	(msg (substitute-command-keys
> 	      "Edit, then exit with C-c ' (C-c and single quote)"))
> @@ -160,7 +172,8 @@ the edited version."
> 	(org-mode-p (eq major-mode 'org-mode))
> 	(beg (make-marker))
> 	(end (make-marker))
> -	nindent	ovl lang lang-f single lfmt code begline buffer)
> +	(preserve-indentation org-src-preserve-indentation)
> +	block-nindent total-nindent ovl lang lang-f single lfmt code  
> begline buffer)
>     (if (not info)
> 	nil
>       (setq beg (move-marker beg (nth 0 info))
> @@ -171,7 +184,7 @@ the edited version."
> 	    lang (if (symbolp lang) (symbol-name lang) lang)
> 	    single (nth 3 info)
> 	    lfmt (nth 4 info)
> -	    nindent (nth 5 info)
> +	    block-nindent (nth 5 info)
> 	    lang-f (intern (concat lang "-mode"))
> 	    begline (save-excursion (goto-char beg) (org-current-line)))
>       (unless (functionp lang-f)
> @@ -204,11 +217,13 @@ the edited version."
> 	(insert code)
> 	(remove-text-properties (point-min) (point-max)
> 				'(display nil invisible nil intangible nil))
> -	(org-do-remove-indentation)
> +	(unless preserve-indentation
> +	  (setq total-nindent (or (org-do-remove-indentation) 0)))
> 	(let ((org-inhibit-startup t))
> 	  (funcall lang-f))
> 	(set (make-local-variable 'org-edit-src-force-single-line) single)
> 	(set (make-local-variable 'org-edit-src-from-org-mode) org-mode-p)
> +	(set (make-local-variable 'org-src-preserve-indentation) preserve- 
> indentation)
> 	(when lfmt
> 	  (set (make-local-variable 'org-coderef-label-format) lfmt))
> 	(when org-mode-p
> @@ -216,10 +231,12 @@ the edited version."
> 	  (while (re-search-forward "^," nil t)
> 	    (replace-match "")))
> 	(org-goto-line (1+ (- line begline)))
> +	(org-move-to-column
> +	 (if preserve-indentation col (max 0 (- col total-nindent))))
> 	(org-set-local 'org-edit-src-beg-marker beg)
> 	(org-set-local 'org-edit-src-end-marker end)
> 	(org-set-local 'org-edit-src-overlay ovl)
> -	(org-set-local 'org-edit-src-nindent nindent)
> +	(org-set-local 'org-edit-src-block-indentation block-nindent)
> 	(org-src-mode)
> 	(set-buffer-modified-p nil)
> 	(and org-edit-src-persistent-message
> @@ -263,13 +280,15 @@ exit with \\[org-edit-src-exit].  The edited  
> text will then replace
> the fragment in the Org-mode buffer."
>   (interactive)
>   (let ((line (org-current-line))
> +	(col (current-column))
> 	(case-fold-search t)
> 	(msg (substitute-command-keys
> 	      "Edit, then exit with C-c ' (C-c and single quote)"))
> 	(org-mode-p (eq major-mode 'org-mode))
> 	(beg (make-marker))
> 	(end (make-marker))
> -	nindent ovl beg1 end1 code begline buffer)
> +	(preserve-indentation org-src-preserve-indentation)
> +	block-nindent ovl beg1 end1 code begline buffer)
>     (beginning-of-line 1)
>     (if (looking-at "[ \t]*[^:\n \t]")
> 	nil
> @@ -314,7 +333,7 @@ the fragment in the Org-mode buffer."
> 	(insert code)
> 	(remove-text-properties (point-min) (point-max)
> 				'(display nil invisible nil intangible nil))
> -	(setq nindent (org-do-remove-indentation))
> +	(setq block-nindent (or (org-do-remove-indentation) 0))
> 	(cond
> 	 ((eq org-edit-fixed-width-region-mode 'artist-mode)
> 	  (fundamental-mode)
> @@ -327,10 +346,13 @@ the fragment in the Org-mode buffer."
> 	(while (re-search-forward "^[ \t]*: ?" nil t)
> 	  (replace-match ""))
> 	(org-goto-line (1+ (- line begline)))
> +	(org-move-to-column (max 0 (- col block-nindent 2)))
> 	(org-set-local 'org-edit-src-beg-marker beg)
> 	(org-set-local 'org-edit-src-end-marker end)
> 	(org-set-local 'org-edit-src-overlay ovl)
> -	(org-set-local 'org-edit-src-nindent nindent)
> +	(org-set-local 'org-edit-src-block-indentation block-nindent)
> +	(org-set-local 'org-edit-src-content-indentation 0)
> +	(org-set-local 'org-src-preserve-indentation nil)
> 	(org-src-mode)
> 	(set-buffer-modified-p nil)
> 	(and org-edit-src-persistent-message
> @@ -341,7 +363,7 @@ the fragment in the Org-mode buffer."
> (defun org-edit-src-find-region-and-lang ()
>   "Find the region and language for a local edit.
> Return a list with beginning and end of the region, a string  
> representing
> -the language, a switch telling of the content should be in a single  
> line."
> +the language, a switch telling if the content should be in a single  
> line."
>   (let ((re-list
> 	 (append
> 	  org-edit-src-region-extra
> @@ -422,7 +444,7 @@ the language, a switch telling of the content  
> should be in a single line."
> 	(match-string 1 s))))
>
> (defun org-edit-src-get-indentation (pos)
> -  "Extract the label format."
> +  "Count leading whitespace characters on line"
>   (save-match-data
>     (goto-char pos)
>     (org-get-indentation)))
> @@ -438,8 +460,10 @@ the language, a switch telling of the content  
> should be in a single line."
> 	 (buffer (current-buffer))
> 	 (single (org-bound-and-true-p org-edit-src-force-single-line))
> 	 (macro (eq single 'macro-definition))
> -	 (nindent org-edit-src-nindent)
> -	 code line)
> +	 (total-nindent (+ (or org-edit-src-block-indentation 0)
> +			   org-edit-src-content-indentation))
> +	 (preserve-indentation org-src-preserve-indentation)
> +	 code line col indent)
>     (untabify (point-min) (point-max))
>     (save-excursion
>       (goto-char (point-min))
> @@ -448,7 +472,8 @@ the language, a switch telling of the content  
> should be in a single line."
> 	(if (re-search-forward "\n[ \t\n]*\\'" nil t) (replace-match ""))))
>     (setq line (if (org-bound-and-true-p org-edit-src-force-single- 
> line)
> 		   1
> -		 (org-current-line)))
> +		 (org-current-line))
> +	  col (current-column))
>     (when single
>       (goto-char (point-min))
>       (if (re-search-forward "\\s-+\\'" nil t) (replace-match ""))
> @@ -467,16 +492,18 @@ the language, a switch telling of the content  
> should be in a single line."
> 	      (if (org-mode-p) "^\\(.\\)" "^\\([*]\\|[ \t]*#\\+\\)") nil t)
> 	(replace-match ",\\1")))
>     (when (org-bound-and-true-p org-edit-src-picture)
> +      (setq preserve-indentation nil)
>       (untabify (point-min) (point-max))
>       (goto-char (point-min))
>       (while (re-search-forward "^" nil t)
> 	(replace-match ": ")))
> -    (when (and nindent (not single))
> -      (setq nindent (make-string (+ org-edit-src-content- 
> indentation nindent)
> -				 ?\ ))
> +    (unless (or single preserve-indentation (= total-nindent 0))
> +      (setq indent (make-string total-nindent ?\ ))
>       (goto-char (point-min))
>       (while (re-search-forward "^" nil t)
> -      (replace-match nindent)))
> +	(replace-match indent)))
> +    (if (org-bound-and-true-p org-edit-src-picture)
> +	(setq total-nindent (+ total-nindent 2)))
>     (setq code (buffer-string))
>     (set-buffer-modified-p nil)
>     (switch-to-buffer (marker-buffer beg))
> @@ -487,6 +514,7 @@ the language, a switch telling of the content  
> should be in a single line."
>     (goto-char beg)
>     (if single (just-one-space))
>     (org-goto-line (1- (+ (org-current-line) line)))
> +    (org-move-to-column (if preserve-indentation col (+ col total- 
> nindent)))
>     (move-marker beg nil)
>     (move-marker end nil)))
>
> --8<---------------cut here---------------end--------------->8---
>
>
> _______________________________________________
> 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

      reply	other threads:[~2009-10-08 19:34 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-08 16:44 [PATCH] org-src code indentation, etc Dan Davison
2009-10-08 19:34 ` Carsten Dominik [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=327CA9A6-7D1E-457C-B1F5-D3376845EC29@gmail.com \
    --to=carsten.dominik@gmail.com \
    --cc=davison@stats.ox.ac.uk \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).