emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Derek Feichtinger <derek.feichtinger@psi.ch>
To: emacs-orgmode@gnu.org
Subject: src block indentation causing problems due to tab/space mixing - proposed fix
Date: Fri, 27 Jul 2018 15:22:23 +0200	[thread overview]
Message-ID: <87zhycu834.fsf@psi.ch> (raw)

Dear Org developers

I think that the current way of indenting source blocks
(with org-src-preserve-indentation is set to nil) is not ideal in regard
to languages that dislike mixing of tabs and spaces.

I'm currently switching to python3 and this forbids the mixing.
Setting org-src-preserve-indentation to t would basically create
problems with many of my older files, and I also dislike the reduced
readability resulting from the code block contents being aligned at
column 0.

I just checked out the org mode master f79545f and made sure
that the relevant lines match my current active version of
org-plus-contrib-20180709.

Looking at the code:

org-edit-src-exit calls org-src--contents-for-write-back for writing the
contents of the source buffer. Inside of that function, all leading whitespace
of each line is replaced using indent-to. This leads to mixing tabs and
spaces and causes problems with python3.

in org-src--contents-for-write-back:

     #+BEGIN_SRC elisp
       (when (> indentation-offset 0)
	 (while (not (eobp))
	   (skip-chars-forward " \t")
	   (unless (eolp)		;ignore blank lines
	     (let ((i (current-column)))
	       (delete-region (line-beginning-position) (point))
	       (indent-to (+ i indentation-offset))))
	   (forward-line)))
     #+END_SRC

I tested this simple alternative which just uses indent-to to fill up
the columns needed for the source blocks basic indentation offset, but
which does not affect any leading whitespace from the code's buffer.

     #+BEGIN_SRC elisp
      (when (> indentation-offset 0)
	(while (not (eobp))
	  (unless (eolp)
	    (indent-to indentation-offset))
	  (forward-line)))
     #+END_SRC

This still allows org mode to use tabs for the block's basic indentation
offset, so that the block is nicely aligned with the rest of the org
buffer, but it prevents modification of the whitespace which is relevant
to the block itself.

I just tested it also with some tangled files, and it seems to work
nicely for my test cases. Still, I may have overlooked something, and
there is a deeper reason for the original implementation.

Best regards,
Derek

--
Paul Scherrer Institut
Dr. Derek Feichtinger                   Phone:   +41 56 310 47 33
Section Head Science-IT                 Email: derek.feichtinger@psi.ch
Building/Room No. WHGA/U126
CH-5232 Villigen PSI

             reply	other threads:[~2018-07-27 13:45 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-27 13:22 Derek Feichtinger [this message]
2018-08-19  8:40 ` src block indentation causing problems due to tab/space mixing - proposed fix Nicolas Goaziou

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=87zhycu834.fsf@psi.ch \
    --to=derek.feichtinger@psi.ch \
    --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).