Hello, Brent Goodrick <bgo...@gmail.com> writes:
> I found a bug in org-mode where emacs-lisp code that is in a > already-indented source block in an org-mode buffer is improperly > indented when editing it via C-c '. Take the following contrived > example emacs-lisp source code: > > 1. Here is a list item with a emacs-lisp source block: > > #+BEGIN_SRC emacs-lisp :results value > (let ((uuid "c2327c73-6da3-4421-8bda-194783a00e8f")) > (progn > (let ((xxx 'yyy)) > (let ((xxx 'yyy)) > (while t > (message "infinite loop")))))) > #+END_SRC > > > After C-c ', indenting it, and C-c ' again, it renders as > follows (tabs converted to spaces for this email, since I have > `indent-tabs-mode' set to t in my emacs-lisp mode, which > is the Emacs default): > > 1. Here is a list item with a emacs-lisp source block: > > #+BEGIN_SRC emacs-lisp :results value > (let ((uuid "c2327c73-6da3-4421-8bda-194783a00e8f")) > (progn > (let ((xxx 'yyy)) > (let ((xxx 'yyy)) > (while t > (message "infinite loop")))))) > #+END_SRC > > Notice how the indentation looks bad due to the mixture of tabs > and spaces. Indeed. Thank you. > The bug is in the `org-src--contents-for-write-back' function. It > uses a temp buffer. The temp buffer's major-mode is left to be > the default, which is fundamental-mode, which knows nothing about > how to indent lisp code properly. And it doesn't need to. This function doesn't care about the code, but indents it rigidly according to original source block. IOW, I don't think changing the major mode is required. > So in the fix below, I run the major-mode function from the original > buffer. But even with that fix, the indentation must also use spaces > in order to avoid mixing tabs and spaces in the resulting Org buffer. Why do you think it is a good thing that tabs and spaces shouldn't be mixed. For example, imagine that the source code requires `indent-tabs-mode' being non-nil, but Org source buffer indentation is space only, i.e., with `indent-tabs-mode' being nil. Shouldn't the resulting block be indented with spaces from column 0 to block boundaries' indentation, and then follow with space indentation? WDYT? Regards, -- Nicolas Goaziou