From: Alan Mackenzie <acm@muc.de>
To: "João Távora" <joaotavora@gmail.com>
Cc: Jim Porter <jporterbugs@gmail.com>,
Lars Ingebrigtsen <larsi@gnus.org>,
50538@debbugs.gnu.org, Dmitry Gutov <dgutov@yandex.ru>
Subject: bug#50538: [PATCH] 28.0.50; electric-pair-mode fails to pair double quotes in some cases in CC mode
Date: Thu, 16 Sep 2021 19:05:56 +0000 [thread overview]
Message-ID: <YUOVlH9MVbVOq4dU@ACM> (raw)
In-Reply-To: <87fsu4h2oa.fsf@gmail.com>
Hello, João.
On Thu, Sep 16, 2021 at 18:04:53 +0100, João Távora wrote:
> Lars Ingebrigtsen <larsi@gnus.org> writes:
> > Dmitry Gutov <dgutov@yandex.ru> writes:
> >>>> I don't use this minor mode, so I don't think my opinion on this
> >>>> matters much. I will defer to Lars and Alan here.
> >>> I seldom use electric-pair-mode, and since this touches cc-mode, I'll
> >>> defer to Alan.:-)
> >>> Alan?
> >> At risk of reigniting an old disagreement, perhaps we should ask Joao?
> > Sure; added to the CCs. João, do you have an opinion here?
> I couldn't understand the initial issue fully, but I can only confirm
> that the relationship between cc-mode and electric-pair-mode has been
> rocky. I think the situation is similar with electric-layout-mode and
> with electric-indent-mode, to a certain degree (though I am not sure for
> this last one).
I think it is up to both of us to make this relationship less rocky.
> I don't think there are any easy technical solutions for it. I certainly
> cannot invest the effort in any of them right now.
> It wasn't like this from the beginning: when I first created
> electric-pair-mode it worked mostly if not fully fine with cc-mode, like
> one expects e-p-m to work in other modes (ruby, python, js, elisp, rust,
> perl, even non-programming modes).
> At times, compatibility deteriorated as cc-mode added mechanisms for
> solving electricity problems or related problems in an idiosyncratic
> way. Sometimes these changes broke e-p-m's tests and the solution was
> -- incorrectly in my view --to disable the tests "temporarily". I see
> that for one of them at least, the test has been re-instated. A good
> sign, maybe.
> Regardless of history and current state of affairs, my personal solution
> to C in Emacs is to use a hand-rolled mode, a so-called plainer-cc-mode.
> The goal is to make it behave like most other modes w.r.t
> electric-pair-mode and keep the basic c syntax and indentation. I've
> used it reasonably successfully with C and C++. Here it is in its
> entirety. I think I use something similar for c++-mode.
> (define-derived-mode plainer-c-mode c-mode "pC"
> "A plainer C-mode with no internal electric machinery."
> (c-toggle-electric-state -1)
> (setq-local electric-indent-local-mode-hook nil)
> (setq-local electric-indent-mode-hook nil)
> (electric-indent-local-mode 1)
> (dolist (key '(?\" ?\' ?\{ ?\} ?\( ?\) ?\[ ?\]))
> (local-set-key (vector key) 'self-insert-command)))
> Among other simpler things, this makes the major mode not bind special
> keys to special commands. They are all bound to `self-insert-command`
> like most major modes. This simplifies electric-pair-mode, as far as I
> remember.
> The above is a hack, but not very dirty one. The one below much more so.
> It's a brute-force hack for solving electricity problems. It simply
> disables some cc internal functions. May be out of date by now, YMMV,
> warranty void, etc, as they say.
> (defun joaot/disable-some-cc-things ()
> (interactive)
> (dolist (name '(c-restore-string-fences
> c-remove-string-fences
> c-before-change-check-unbalanced-strings
> c-after-change-mark-abnormal-strings
> c-after-change-escape-NL-in-string))
> (advice-add name :override #'ignore '((name . joaot/remove-disable-some-cc-things)))
> (add-hook 'c-mode-common-hook
> (lambda ()
> (kill-local-variable 'electric-pair-inhibit-predicate)))))
Needless to say, my point of view with respect to the above is somewhat
different. Succinctly put, the minor modes electric-.... are MINOR
modes, and are quite new. They were implemented in a way which
interfered with major modes, and I can't see there was any need for
this. In particular, they interfered with CC Mode features which had
existed for 20 years at the time.
> On the C++/C editing-front, I am eagerly waiting for Treesitter to
> arrive so that is it becomes possible to write a new major mode for c++
> and c from scratch.
I am also looking forward to Treesitter, though I think starting a new
C++ Mode from scratch would not be a good use of time, and would be
needlessly disruptive for current CC Mode users.
> Reusing solid and efficient parsing logic based on language grammars.
> Another more closely available option, is to simply use LSP for
> indentation and fontification. Though that is almost certainly slower
> and less confortable/portable/etc... Anyway, whatever the solution,
> I'm quite confident that such a mode won't have these characteristics
> that cc-mode has when used with `electric-pair-mode`.
> If you're writing C, and not C++, my also try Stefan Monnier's aptly
> named sm-c-mode, installable via M-x package-install RET sm-c-mode.
> Works fine with electric-pair-mode, but seems to indent very oddly for
> some reason.
I would rather suggest using straight C Mode, which works and works
well. If there are incompatibilities between CC Mode and
electric-pair-mode, and it seems there are, let's get these fixed.
> Hope this helps. I'm sorry I can't offer any better solutions.
Could you please express your expert view? In Jim's opening post he
implies that:
(i) electric-pair-mode should be active inside comments.
(ii) In some circumstances at least, typing a " immediately in front
of another " causes two "s to be inserted. Are these circumstances
spelt out anywhere?
(iii) Typing a " inside a string causes two "s to be inserted, leaving
point between the two new adjacent strings formed. This feature is
not intended to work in C++ raw strings, or other similar multi-line
strings in other CC Mode modes.
Are these three features all intended in electric-pair-mode?
Thanks!
> João
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2021-09-16 19:05 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-12 3:58 bug#50538: [PATCH] 28.0.50; electric-pair-mode fails to pair double quotes in some cases in CC mode Jim Porter
2021-09-12 6:26 ` Eli Zaretskii
2021-09-12 18:05 ` Jim Porter
2021-09-15 22:17 ` Jim Porter
2021-09-16 5:25 ` Eli Zaretskii
2021-09-16 12:40 ` Lars Ingebrigtsen
2021-09-16 12:59 ` Dmitry Gutov
2021-09-16 13:17 ` Lars Ingebrigtsen
2021-09-16 17:04 ` João Távora
2021-09-16 17:11 ` Eli Zaretskii
2021-09-16 17:33 ` João Távora
2021-09-16 17:29 ` Jim Porter
2021-09-16 19:05 ` Alan Mackenzie [this message]
2021-09-16 20:51 ` João Távora
2021-09-17 18:12 ` Alan Mackenzie
2021-09-16 18:26 ` Alan Mackenzie
2021-09-16 20:49 ` Alan Mackenzie
2021-09-16 21:36 ` Jim Porter
2021-09-17 17:08 ` Alan Mackenzie
2021-09-23 2:01 ` bug#50538: [PATCH v3] " Jim Porter
2021-09-26 20:58 ` Alan Mackenzie
2021-09-28 4:57 ` bug#50538: [PATCH v4] " Jim Porter
2021-10-03 17:58 ` bug#50538: [PATCH v5] " Jim Porter
2021-11-06 0:22 ` bug#50538: [PATCH] " Lars Ingebrigtsen
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YUOVlH9MVbVOq4dU@ACM \
--to=acm@muc.de \
--cc=50538@debbugs.gnu.org \
--cc=dgutov@yandex.ru \
--cc=joaotavora@gmail.com \
--cc=jporterbugs@gmail.com \
--cc=larsi@gnus.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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.