|
From: | Dmitry Gutov |
Subject: | bug#18826: 24.3.94; c++-mode bad indentation after programmatic insert with locally changed syntax table |
Date: | Sun, 26 Oct 2014 22:09:25 +0700 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 |
On 10/26/2014 06:24 AM, Alan Mackenzie wrote:
Because the syntax table change is temporary and its effect should be limited to my code?It's no so limited. The before-change-functions and after-change-functions hooks will be run with that syntax table active. This is not good.
I see, thanks. Somehow, I figured that those hooks would run before or after the current command, whereas they're triggered right near any code that makes changes to the buffer. Question answered, closing.
On the other hand, you're doing some pretty unusual things with this. If `c-in-sws' and `c-is-sws' were added in syntax-propertize-function (which is called on-demand), this conflict wouldn't have manifested.
OK. Can I suggest an alternative? In C++ (and Java) Modes, the template (generic) delimiters are marked with syntax-table text properties. Unfortunately, at the moment this is done as part of font-locking, so isn't done until you display. However, if you put "(sit-for 0)" into your code after inserting "< ... >", this will cause a redisplay, allowing subsequent code to use the text properties, and a backward-sexp will then work.
Sounds like it should be performed during `syntax-propertize' instead. Even if you don't like this idea now, I suspect it'll happen eventually anyway, if only for consistency with other major modes.
In that sense, the `sit-for' suggestion is not future-proof. So I'll try only changing the syntax table around specific functions that don't modify the buffer text, but just move point, since that was the actual goal.
In the medium future (several weeks away), I'm hoping to fix CC Mode so that the text properties are applied to < ... > on an after-change function rather than at redisplay.
Hmm. My current workaround is to use a temporary syntax table that inherits from c++-mode-syntax-table (but has angle brackets in the 'paren' class). Sounds like it might also create a conflict, if maybe a more subtle one.
[Prev in Thread] | Current Thread | [Next in Thread] |