Re: [O] src block indentation causing problems due to tab/space mixing - proposed fix

2018-08-19 Thread Nicolas Goaziou
Hello,

Derek Feichtinger  writes:

> 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.

For such languages, there is `org-src-preserve-indentation'...
>
> 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,

You can set it locally, for every new Python block, with "-i" switch.

> and I also dislike the reduced readability resulting from the code
> block contents being aligned at column 0.

I cannot see any other way around.

> 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.

Org removes indentation automatically, e.g., when editing a source block
or when exporting a document. If you indent lines in an indentation
preserved block, there is no more way to tell if the indentation is
added by Org -- and could be removed -- or required by the block. This
is why we also need to indent them from column 0.

Regards,

-- 
Nicolas Goaziou



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

2018-07-27 Thread Derek Feichtinger
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.feichtin...@psi.ch
Building/Room No. WHGA/U126
CH-5232 Villigen PSI