Re: erlang.el mis-indents whole-buffer selection

Magnus Henoch <[email protected]> Sun, 29 Jun 2014 15:10:15 +0100
Newsgroups gmane.comp.lang.erlang.bugs,gmane.comp.lang.erlang.patches
Message-ID <[email protected]>
Magnus Henoch <[email protected]> writes:

> Tuncer Ayaz <[email protected]> writes:
>
>> Previously it was just a certain[1] function in rebar.erl which got
>> mis-indented when you did a whole-buffer indent, but now there's also
>> a second[2] function which gets mis-indented.
>>
>> In both cases indenting the function itself separately works, and the
>> bug happens if you select the whole buffer and indent that with
>> erlang.el (C-x C-q).
>>
>> I'm using Emacs 24.3.1 with latest erlang.el from maint.
>>
>> Is it possible to fix this in the existing indenter?
>>
>> [1] https://github.com/rebar/rebar/blob/620c4b01c/src/rebar.erl#L318-L365
>> [2] https://github.com/rebar/rebar/blob/620c4b01c/src/rebar_erlc_compiler.erl#L92-L112
>
> It seems like this happens when the code being indented has not yet been
> made visible, and thus lazy syntax highlighting has not yet happened.
> The syntax table for erlang-mode is unable to handle some combinations
> of characters; in particular, when a string ends with a dollar sign (as
> in "foo$"), the dollar sign plus the double quote would be treated as a
> character constant were it not for some magic regexps in
> font-lock-syntactic-keywords.  Manually scrolling through the buffer
> before reindenting seems to make the problem go away.
>
> This is less than satisfactory, of course.  Looking up online help for
> font-lock-syntactic-keywords in a modern Emacs gives:
>
>   This variable is obsolete since 24.1;
>   use `syntax-propertize-function' instead.
>
> And the NEWS file for Emacs 24.1 contains:
>
>   *** New variable `syntax-propertize-function'.
>   This replaces `font-lock-syntactic-keywords' which is now obsolete.
>   This allows syntax-table properties to be set independently from font-lock:
>   just call syntax-propertize to make sure the text is propertized.
>   Together with this new variable come a new hook
>   syntax-propertize-extend-region-functions, as well as two helper functions:
>   syntax-propertize-via-font-lock to reuse old font-lock-syntactic-keywords
>   as-is; and syntax-propertize-rules which provides a new way to specify
>   syntactic rules.
>
> This sounds like the right way to solve the problem, though of course
> you won't know until you try...

While playing with the code, I realised that there's a much simpler
solution: explicitly run syntax highlighting before indenting; that way
all syntax properties will be set.

git fetch git://github.com/legoscia/otp.git fontify-before-indentation

https://github.com/legoscia/otp/compare/fontify-before-indentation

Regards,
Magnus
_______________________________________________
erlang-bugs mailing list
[email protected]
http://erlang.org/mailman/listinfo/erlang-bugs