all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "João Távora" <joaotavora@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Alan Mackenzie <acm@muc.de>, Noam Postavsky <npostavs@gmail.com>,
	35254@debbugs.gnu.org, Dima Kogan <dima@secretsauce.net>
Subject: bug#35254: 27.0.50; cc-mode/electric-pair-mode/electric-layout-mode: bad trailing whitespace behavior in cc-mode
Date: Wed, 15 May 2019 14:55:09 +0100	[thread overview]
Message-ID: <CALDnm53QtyAdHWYmRoUkJKsweVpEGbRkK-Lo71gDiGorZKi=QA@mail.gmail.com> (raw)
In-Reply-To: <jwv8sv76gjj.fsf-monnier+emacs@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 6458 bytes --]

On Wed, May 15, 2019 at 2:19 PM Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> > I've just come across the bug myself, and it is indeed annoying.
> > Can you check if this patch, which seems the simplest, serves
> > all purposes?
>
> FWIW, I find it rather ugly (makes the two minor modes too tightly
> intertwined).
>

It's no work of art. But the modes are already intertwined.
(And the code within a mode ain't no work of art, too :-))

> It also adds a test to prevent future regressions
>
> Another approach might be to do the whitespace erasure in
> electric-indent without paying any attention to electric-layout/pair,
> and then in electric-pair to explicitly cause (re)indentation
> after moving point to between the opened pair?
>

Maybe, I don't have time to implement that, and it looks like it
could hold surprises.  But if you do it and it passes the existing
tests and the new one, nothing against


> Yet another option is to tell electric-indent about the final position
> of point and have it refrain from deleting whitespace before that final
> position, as in the patch below.  WDYT?
>

It looks a little like an elaboration of a third abstraction to basically
create another intertwining between e-p-m and e-i-m. Sure it's the
best? Anyway, if it passes all  tests, new and old, great, push it!

(but why are you deleting plainer-c-mode in test/lisp/electric-tests.el?)

João




>
>
>         Stefan
>
>
> diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el
> index 3be09d87b4..a14efff241 100644
> --- a/lisp/elec-pair.el
> +++ b/lisp/elec-pair.el
> @@ -551,7 +551,8 @@ electric-pair-post-self-insert-function
>                           (goto-char pos)
>                           (funcall electric-pair-inhibit-predicate
>                                    last-command-event)))))
> -         (save-excursion (electric-pair--insert pair)))))
> +         (let ((electric-indent--destination (point-marker)))
> +           (save-excursion (electric-pair--insert pair))))))
>        (_
>         (when (and (if (functionp electric-pair-open-newline-between-pairs)
>                        (funcall electric-pair-open-newline-between-pairs)
> diff --git a/lisp/electric.el b/lisp/electric.el
> index 07da2f1d9e..71ebb9cf45 100644
> --- a/lisp/electric.el
> +++ b/lisp/electric.el
> @@ -231,6 +231,14 @@ electric-indent-functions-without-reindent
>  not try to reindent lines.  It is normally better to make the major
>  mode set `electric-indent-inhibit', but this can be used as a
> workaround.")
>
> +(defun electric-indent--inhibited-p ()
> +  (or electric-indent-inhibit
> +      (memq indent-line-function
> +            electric-indent-functions-without-reindent)))
> +
> +(defvar electric-indent--destination nil
> +  "If non-nil, position to which point will be later restored.")
> +
>  (defun electric-indent-post-self-insert-function ()
>    "Function that `electric-indent-mode' adds to `post-self-insert-hook'.
>  This indents if the hook `electric-indent-functions' returns non-nil,
> @@ -272,26 +280,26 @@ electric-indent-post-self-insert-function
>            (when at-newline
>              (let ((before (copy-marker (1- pos) t)))
>                (save-excursion
> -                (unless
> -                    (or (memq indent-line-function
> -                              electric-indent-functions-without-reindent)
> -                        electric-indent-inhibit)
> +                (unless (electric-indent--inhibited-p)
>                    ;; Don't reindent the previous line if the
>                    ;; indentation function is not a real one.
>                    (goto-char before)
>                    (condition-case-unless-debug ()
>                        (indent-according-to-mode)
> -                    (error (throw 'indent-error nil)))
> -                  ;; The goal here will be to remove the trailing
> -                  ;; whitespace after reindentation of the previous line
> -                  ;; because that may have (re)introduced it.
> -                  (goto-char before)
> -                  ;; We were at EOL in marker `before' before the call
> -                  ;; to `indent-according-to-mode' but after we may
> -                  ;; not be (Bug#15767).
> -                  (when (and (eolp))
> -                    (delete-horizontal-space t))))))
> -          (unless (and electric-indent-inhibit
> +                    (error (throw 'indent-error nil))))
> +                ;; The goal here will be to remove the trailing
> +                ;; whitespace after reindentation of the previous line
> +                ;; because that may have (re)introduced it.
> +                (goto-char before)
> +                ;; We were at EOL in marker `before' before the call
> +                ;; to `indent-according-to-mode' but after we may
> +                ;; not be (Bug#15767).
> +                (when (and (eolp)
> +                           ;; Don't delete "trailing space" before point!
> +                           (not (and electric-indent--destination
> +                                     (= (point)
> electric-indent--destination))))
> +                  (delete-horizontal-space t)))))
> +          (unless (and (electric-indent--inhibited-p)
>                         (not at-newline))
>              (condition-case-unless-debug ()
>                  (indent-according-to-mode)
> diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
> index 4f1e5729be..0b67fb3f1f 100644
> --- a/test/lisp/electric-tests.el
> +++ b/test/lisp/electric-tests.el
> @@ -876,15 +876,6 @@ electric-layout-for-c-style-du-jour
>        (call-interactively (key-binding `[,last-command-event])))
>      (should (equal (buffer-string) "int main () {\n  \n}"))))
>
> -(define-derived-mode plainer-c-mode c-mode "pC"
> -  "A plainer/saner 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)))
> -
>  (ert-deftest electric-modes-int-main-allman-style ()
>    (ert-with-test-buffer ()
>      (plainer-c-mode)
>
>

-- 
João Távora

[-- Attachment #2: Type: text/html, Size: 8338 bytes --]

  reply	other threads:[~2019-05-15 13:55 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-13  6:32 bug#35254: 27.0.50; cc-mode/electric-pair-mode/electric-layout-mode: bad trailing whitespace behavior in cc-mode Dima Kogan
2019-05-11  3:12 ` Noam Postavsky
2019-05-11 12:05   ` Alan Mackenzie
     [not found]   ` <20190511120524.GA15991@ACM>
2019-05-11 14:06     ` Noam Postavsky
2019-05-11 16:19       ` Alan Mackenzie
2019-05-11 19:34         ` Basil L. Contovounesios
2019-05-12 16:14           ` Alan Mackenzie
2019-05-12 21:45             ` Basil L. Contovounesios
2019-05-13 10:14               ` Alan Mackenzie
     [not found]               ` <20190513101448.GA5525@ACM>
2019-05-13 12:49                 ` Basil L. Contovounesios
2019-05-12 15:12         ` Alan Mackenzie
2019-05-12 18:42           ` Noam Postavsky
2019-05-13 19:53   ` Alan Mackenzie
     [not found]   ` <20190513195323.GB5525@ACM>
2019-05-13 22:39     ` João Távora
2019-05-13 23:38       ` Noam Postavsky
2019-05-14  1:20         ` João Távora
2019-05-14  1:28         ` Stefan Monnier
2019-05-14  1:56       ` Noam Postavsky
2019-05-14  8:38       ` Alan Mackenzie
2019-05-13 23:32     ` Stefan Monnier
     [not found]     ` <jwvimue9bzj.fsf-monnier+emacs@gnu.org>
2019-05-13 23:45       ` Noam Postavsky
2019-05-14  1:26         ` Stefan Monnier
2019-05-14  9:27       ` Alan Mackenzie
2019-05-14  9:34       ` Alan Mackenzie
     [not found]       ` <20190514092735.GB4231@ACM>
2019-05-14 10:34         ` João Távora
2019-05-15 10:03           ` Alan Mackenzie
2019-05-15 11:27             ` João Távora
2019-05-15 13:19               ` Stefan Monnier
2019-05-15 13:55                 ` João Távora [this message]
2019-05-15 14:03                   ` João Távora
2019-07-01 12:24                   ` João Távora
2019-07-01 13:34                     ` Alan Mackenzie
     [not found]                     ` <20190701133427.GA23312@ACM>
2019-07-06 16:24                       ` Noam Postavsky
2019-07-06 22:24                         ` João Távora
2019-07-06 22:50                           ` Noam Postavsky
2019-07-06 22:33                       ` João Távora
     [not found]       ` <20190514093415.GC4231@ACM>
2019-05-14 15:38         ` Stefan Monnier

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='CALDnm53QtyAdHWYmRoUkJKsweVpEGbRkK-Lo71gDiGorZKi=QA@mail.gmail.com' \
    --to=joaotavora@gmail.com \
    --cc=35254@debbugs.gnu.org \
    --cc=acm@muc.de \
    --cc=dima@secretsauce.net \
    --cc=monnier@iro.umontreal.ca \
    --cc=npostavs@gmail.com \
    /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.