From: Alan Mackenzie <acm@muc.de>
To: Dmitry Gutov <dgutov@yandex.ru>
Cc: 18826@debbugs.gnu.org
Subject: bug#18826: 24.3.94; c++-mode bad indentation after programmatic insert with locally changed syntax table
Date: 26 Oct 2014 17:38:49 -0000 [thread overview]
Message-ID: <20141026173849.82988.qmail@mail.muc.de> (raw)
In-Reply-To: <mailman.12080.1414336227.1147.bug-gnu-emacs@gnu.org>
Hi, Dmitry.
In article <mailman.12080.1414336227.1147.bug-gnu-emacs@gnu.org> you wrote:
> 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.
They're not syntax-table text properties, so the setting of them doesn't
belong in syntax-propertize. It wouldn't make sense to do these in
syntax-propertize for a variety of other reasons, such as efficiency.
>> 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.
Maybe it will, maybe it won't. `syntax-propertize' has the disadvantage
of inefficiency; at any buffer change, all syntax-table text properties
after the position of the change are effectively wiped out, even where
(as is usual) this isn't necessary. Also, restoring them means doing so
over a potentially large region of the buffer, rather than just locally
around point.
But, anyway ....
> 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.
Might it be possible that you could get mixed up with less-than and
greater-than (or even shift-right) operators? If so, be careful!
>> 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.
...., a change to use syntax-propertize needs the above change to happen
first.
> 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.
Any reason you don't use the current syntax table as the base to add the
descriptors for < and > to rather than creating a new, blank one? You
could use `copy-syntax-table'.
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2014-10-26 17:38 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-25 14:25 bug#18826: 24.3.94; c++-mode bad indentation after programmatic insert with locally changed syntax table Dmitry Gutov
[not found] ` <mailman.12024.1414247237.1147.bug-gnu-emacs@gnu.org>
2014-10-25 19:34 ` Alan Mackenzie
2014-10-25 22:45 ` Dmitry Gutov
[not found] ` <mailman.12048.1414277182.1147.bug-gnu-emacs@gnu.org>
2014-10-25 23:24 ` Alan Mackenzie
2014-10-26 15:09 ` Dmitry Gutov
2014-10-26 17:07 ` Stefan Monnier
2014-10-25 23:25 ` Stefan Monnier
[not found] ` <jwv61f7ohq0.fsf-monnier+emacsbugs@gnu.org>
2014-10-26 14:56 ` Dmitry Gutov
2014-10-26 14:56 ` Dmitry Gutov
2014-10-26 17:03 ` Stefan Monnier
[not found] ` <mailman.12080.1414336227.1147.bug-gnu-emacs@gnu.org>
2014-10-26 17:38 ` Alan Mackenzie [this message]
2014-10-27 1:06 ` Dmitry Gutov
2014-10-27 8:53 ` Alan Mackenzie
2014-10-27 10:21 ` Dmitry Gutov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141026173849.82988.qmail@mail.muc.de \
--to=acm@muc.de \
--cc=18826@debbugs.gnu.org \
--cc=dgutov@yandex.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).