emacs-orgmode
[Top][All Lists]
Advanced

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

[O] src block indentation causing problems due to tab/space mixing - pro


From: Derek Feichtinger
Subject: [O] src block indentation causing problems due to tab/space mixing - proposed fix
Date: Fri, 27 Jul 2018 15:22:23 +0200
User-agent: mu4e 1.0; emacs 26.1

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: address@hidden
Building/Room No. WHGA/U126
CH-5232 Villigen PSI



reply via email to

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