From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: joaotavora@gmail.com, cpitclaudel@gmail.com,
stephen_leake@stephe-leake.org, monnier@IRO.UMontreal.CA,
emacs-devel@gnu.org
Subject: Re: CC Mode and electric-pair "problem".
Date: Sat, 30 Jun 2018 20:14:47 +0000 [thread overview]
Message-ID: <20180630201447.GE6816@ACM> (raw)
In-Reply-To: <83tvpkkr93.fsf@gnu.org>
Hello, Eli.
On Sat, Jun 30, 2018 at 22:29:12 +0300, Eli Zaretskii wrote:
> > Date: Sat, 30 Jun 2018 19:03:27 +0000
> > From: Alan Mackenzie <acm@muc.de>
> > Cc: Clément Pit-Claudel <cpitclaudel@gmail.com>,
> > Stephen Leake <stephen_leake@stephe-leake.org>,
> > João Távora <joaotavora@gmail.com>,
> > emacs-devel@gnu.org
> > I am in the middle of writing a trial implementation (code speaks louder
> > than words). Thus far, it has already worked in shell-script-mode
> > (which required a one-line change, this:
> > - ?\n ">#"
> > + ?\n ">#s"
> > the new `s' flag is how I've constructed it, so far).
> > > But that's for Eli to judge.
> > > So let's look at the technical issues:
> > > You suggest introducing a new syntax-table thingy similar to > but for
> > > strings. Let's call it ]
> > As I noted above, I have implemented it as another flag, `s'.
> > > - This implies we'll need a new C-level function `back_string` to jump
> > > backward over such a ]-terminated string, corresponding to
> > > back_comment.
> > Yes.
> > > `back_comment` has proved to be rather nasty, so while
> > > we can learn from it, part of what we learn is that jumping backward
> > > over such things is much easier ....
> > much less easy. :-)
> > > .... than jumping forward, so this
> > > innocuous ] will be more costly than might meet the eye.
> > It requires the new function, which at the moment seems somewhat less
> > complicated than back_comment, and this requires to be called from
> > scan_lists.
> > > - In CC-mode, \n already has syntax > so it can't also have syntax ]
> > > How do you intend to deal with that: will you mark those few \n that
> > > terminate strings with syntax-table text-properties?
> > This is simple with the flag `s'. NL would thus have end-comment syntax
> > _and_ the `s' flag. In scan_lists, back_comment will be tried before
> > what I'm calling `back_maybe_string', since being a comment ender must have
> > precedence over being a string terminator.
> > > If so, what's the benefit over using string-fences?
> > String-fence stopped the 'chomp facility of electric-pair-mode working
> > properly (for the currently accepted value of "properly").
> > > - Another approach would be to make it possible to mark \n as both ] and
> > > > at the same time, which would make the CC-mode feature much cleaner
> > > (no need to muck with syntax-table text-properties) but the cost of
> > > yet more complexity in the syntax.c code.
> > That's what I'm doing with `s'. The extra complexity in syntax.c
> > doesn't seem all that bad at the moment. back_maybe_string is currently
> > 137 lines long (including a macro analogous to INC_FROM, and a lossage:
> > clause modelled on the one in back_comment)), compared with
> > back_comment's 289 lines. I'm planning on committing this new code to a
> > branch in the next few days, then you can judge better whether the new
> > facility is worth it.
> Could you please recap what problem(s) you are trying to fix with
> these changes? (I'm sorry for not following, but this thread spans
> two months and many long messages with several days in-between. It's
> hard to keep focused on the main issues.)
Sorry. That's just the way things go, sometimes.
The initial problem I tried to solve was for CC Mode source files with
things like:
char foo[] = "foo
char bar[] = "bar";
Historically, the missing " on "foo has caused subsequent lines to have
their string quoting reversed. This is not good.
A recent series of CC Mode commits "solved" this by putting string-fence
syntax-table text properties on the " and the NL around foo. This caused
a "make check" test to fail. With electric-pair-mode enabled and
electric-pair-skip-whitespace set to 'chomp, in the following:
" (
) "
, typing ) on line 1 should replace the ) on line 2, "chomping" the space
between ) and ). However the string-fence property on L1's NL prevented
electric-pair-mode from functioning correctly. João and I have discussed
at length ways of fixing this.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Also, the CC Mode solution has the disadvantage that other languages
cannot get the same fontification advantages, namely that the "foo gets
warning-face on the ", and string face extends ONLY to EOL.
What I'm now proposing, and implementing as a trial, is to enhance the
syntax table facilities to support unterminated strings. There will be
an extra syntax flag `s' on newlines meaning "terminate any open string".
This is straightforward for forward scanning, but somewhat complicated
for backward scanning. However, it does enable unterminated strings to
be easily fontified to EOL in any language, with minimal effort.
It should allow the desired fontification without causing problems for
electric-pair-mode.
Stefan is concerned that the extra functionality may not justify the
increase in complexity in syntax.c.
> Thanks.
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2018-06-30 20:14 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-22 7:42 [Emacs-diffs] master bb591f139f: Enhance CC Mode's fontification, etc., of unterminated strings Tino Calancha
2018-05-22 17:40 ` Alan Mackenzie
2018-05-22 19:21 ` João Távora
2018-05-22 19:34 ` Eli Zaretskii
2018-05-22 20:25 ` João Távora
2018-05-22 22:17 ` João Távora
2018-05-23 14:52 ` Eli Zaretskii
2018-05-23 20:46 ` Alan Mackenzie
2018-05-23 21:12 ` João Távora
2018-05-23 23:21 ` Michael Welsh Duggan
2018-05-31 12:37 ` CC Mode and electric-pair "problem". (Was: ... master bb591f139f: Enhance CC Mode's fontification, etc., of unterminated strings.) Alan Mackenzie
2018-05-31 16:07 ` CC Mode and electric-pair "problem" João Távora
2018-05-31 17:28 ` Alan Mackenzie
2018-05-31 18:37 ` João Távora
2018-06-02 13:02 ` Alan Mackenzie
2018-06-03 3:00 ` João Távora
2018-06-17 16:58 ` Glenn Morris
2018-06-17 20:13 ` Alan Mackenzie
2018-06-17 21:07 ` Stefan Monnier
2018-06-17 21:27 ` João Távora
2018-06-18 10:36 ` Alan Mackenzie
2018-06-18 13:24 ` João Távora
2018-06-18 15:18 ` Eli Zaretskii
2018-06-18 15:37 ` João Távora
2018-06-18 16:46 ` Eli Zaretskii
2018-06-18 17:21 ` Eli Zaretskii
2018-06-18 23:49 ` João Távora
2018-06-19 2:37 ` Eli Zaretskii
2018-06-19 8:13 ` João Távora
2018-06-19 16:59 ` Eli Zaretskii
2018-06-19 19:40 ` João Távora
2018-06-18 20:24 ` Glenn Morris
2018-06-19 2:03 ` João Távora
2018-06-18 15:42 ` Alan Mackenzie
2018-06-18 17:01 ` João Távora
2018-06-18 18:07 ` Yuri Khan
2018-06-18 22:52 ` João Távora
2018-06-18 18:08 ` Alan Mackenzie
2018-06-18 23:43 ` João Távora
2018-06-19 1:35 ` João Távora
2018-06-19 1:48 ` Stefan Monnier
2018-06-19 3:52 ` Clément Pit-Claudel
2018-06-19 6:38 ` Stefan Monnier
2018-06-20 13:48 ` Clément Pit-Claudel
2018-06-26 16:08 ` Fontifying unterminated strings [was: CC Mode and electric-pair "problem".] Alan Mackenzie
2018-06-26 20:02 ` João Távora
2018-06-28 23:56 ` Stefan Monnier
2018-06-29 0:43 ` Stefan Monnier
2018-06-18 22:41 ` CC Mode and electric-pair "problem" Stephen Leake
2018-06-19 0:02 ` João Távora
2018-06-19 3:15 ` Clément Pit-Claudel
2018-06-19 8:16 ` João Távora
2018-06-19 5:02 ` Alan Mackenzie
2018-06-20 14:16 ` Stefan Monnier
2018-06-26 18:23 ` Alan Mackenzie
2018-06-27 13:37 ` João Távora
2018-06-29 3:42 ` Stefan Monnier
2018-06-30 18:09 ` Alan Mackenzie
2018-07-01 3:37 ` Stefan Monnier
2018-07-01 15:24 ` Eli Zaretskii
2018-07-06 21:58 ` Stephen Leake
2018-07-01 15:57 ` Paul Eggert
2018-06-27 18:27 ` Alan Mackenzie
2018-06-29 4:11 ` Stefan Monnier
2018-06-30 19:03 ` Alan Mackenzie
2018-06-30 19:29 ` Eli Zaretskii
2018-06-30 20:14 ` Alan Mackenzie [this message]
2018-07-01 3:50 ` Stefan Monnier
2018-07-01 9:58 ` Alan Mackenzie
2018-07-01 11:22 ` João Távora
2018-07-01 15:25 ` Eli Zaretskii
2018-07-01 15:22 ` Eli Zaretskii
2018-07-01 16:38 ` scratch/fontify-open-string. [Was: CC Mode and electric-pair "problem".] Alan Mackenzie
2018-07-08 8:29 ` Stephen Leake
2018-07-15 9:00 ` Stephen Leake
2018-07-15 15:13 ` Eli Zaretskii
2018-07-15 18:45 ` Alan Mackenzie
2018-07-16 2:23 ` Indentation of ?: in C-mode (was: scratch/fontify-open-string. [Was: CC Mode and electric-pair "problem".]) Stefan Monnier
2018-07-16 14:18 ` Eli Zaretskii
2018-07-16 15:54 ` Indentation of ?: in C-mode Stefan Monnier
2018-07-15 16:56 ` scratch/fontify-open-string. [Was: CC Mode and electric-pair "problem".] Alan Mackenzie
2018-07-17 3:41 ` Stephen Leake
2018-07-01 4:02 ` CC Mode and electric-pair "problem" Stefan Monnier
2018-07-01 10:58 ` Alan Mackenzie
2018-07-01 11:46 ` João Távora
2018-07-01 16:13 ` Stefan Monnier
2018-07-01 18:18 ` Alan Mackenzie
2018-07-01 23:16 ` Stefan Monnier
2018-07-02 19:18 ` Alan Mackenzie
2018-07-03 2:10 ` Stefan Monnier
2018-06-26 18:52 ` Alan Mackenzie
2018-06-26 19:45 ` João Távora
2018-06-26 20:09 ` Alan Mackenzie
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=20180630201447.GE6816@ACM \
--to=acm@muc.de \
--cc=cpitclaudel@gmail.com \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=joaotavora@gmail.com \
--cc=monnier@IRO.UMontreal.CA \
--cc=stephen_leake@stephe-leake.org \
/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).