[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