emacs-devel
[Top][All Lists]
Advanced

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

Re: Help understanding ruby.el percent literal syntax


From: Stefan Monnier
Subject: Re: Help understanding ruby.el percent literal syntax
Date: Wed, 19 Jun 2019 09:20:05 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux)

> We are trying to solve a bug in evil-surround at
> https://github.com/emacs-evil/evil-surround/issues/154. The bug is that
> percent literals refuse to be replaced when you try to replace a pair of
> "{}" with "()" using evil-surround, because ruby.el modifies the percent
> literal syntax table in a special way (when we use `fundamental-mode' then
> things works as expected).

ruby-mode uses syntax-propertize to make it so that

    config.allow_sites = %w{twitter facebook pinterest linkedin}
    
is treated somewhat like

    config.allow_sites = "w{twitter facebook pinterest linkedin"

So if you go to the end of the line and try to skip back over the
previous `sexp` you'll end up in front of the `%` rather than in front
of the `{`.

The purpose is probably to handle things like:

    config.allow_sites = %w{twitter facebook # pinterest linkedin}

where the `#` would otherwise be taken as the beginning of a comment.

> If I comment out the call to `ruby-syntax-propertize-percent-literal', then
> the bug in evil-surround is gone, and everything just looks the same
> visually (the percent literals are correctly highlighted).

Not sure what "comment out the call" means exactly, but from my reading
of the code, it would result in mayhem (the %w{ above would probably
be highlighted as if he extended to the end of the buffer).

In order to interact better with things like Evil's
delimiter-replacement, ruby-mode.el could be changed so that instead of
marking the opening `%` and the closing `}` with the `|` syntax, it
would mark the `%` and `w` part with `'` syntax and then arrange to mark
the inside of the delimited text with an ad-hoc syntax table that
doesn't treat `#` as a comment started nor `"` as a string delimiter
(i.e., the same syntax-table used by the `with-syntax-table`
in `ruby-syntax-propertize-percent-literal`).  Or alternatively, it
could look for things like `#` and `"` and give them a `.` syntax.


        Stefan




reply via email to

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