Subject: bug#20698: closed (Re: bug#21885: 24.5; Transposing things with a negative argument)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 13 Nov 2015 09:49:03 +0000

Your bug report

#21885: 25.0.50; REGRESSION in `transpose-sexps' introduced in Emacs 24.4

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
21885: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21885
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#21885: 24.5; Transposing things with a negative argument
From: Eli Zaretskii <[email-masked]>
To: Eli Barzilay <[email-masked]>
Cc: [email-masked], [email-masked], [email-masked]
Date: Fri, 13 Nov 2015 11:47:54 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

> Date: Thu, 12 Nov 2015 14:27:07 -0500
> From: Eli Barzilay <[email-masked]>
> Cc: Stephen Leake <[email-masked]>, [email-masked], 
> 	martin rudalics <[email-masked]>
> 
> On Thu, Nov 12, 2015 at 1:24 PM, Eli Zaretskii <[email-masked]> wrote:
> >> From: Stephen Leake <[email-masked]>
> >> Date: Thu, 12 Nov 2015 12:11:42 -0600
> >> Cc: [email-masked]
> >>
> >> Eli Barzilay <[email-masked]> writes:
> >>
> >> > In the past (IIRC, up to around v24.3) transposing things (chars,
> >> > words, sexprs, lines) would always leave the point after the
> >> > transposed thing. ...  This is no longer happenning.
> > [...]
> >
> > I think I know the answer: the difference is visible only if you
> > invoke C-t with a negative argument, as in "C-- C-t".
> 
> Yes, exactly -- and yes, this is the same bug as #20698.  I looked at
> the code a bit more since then, and I think that my patch is a fine fix.

Thanks, pushed.

Subject: 25.0.50; REGRESSION in `transpose-sexps' introduced in Emacs 24.4
From: Drew Adams <[email-masked]>
To: [email-masked]
Date: Sat, 30 May 2015 10:12:00 -0700 (PDT)
List-Id: <debbugs-submit.debbugs.gnu.org>

I say regression, but perhaps there was a good reason for the change in
behavior.  I couldn't find anything about it, checking NEWS and looking
through some bug reports.

In all Emacs versions prior to 24.4 (back through Emacs 20, at least),
when you use a negative prefix arg with `transpose-sexps' point ends up
after the sexp that moved.  Starting with 24.4, point does not move.

For example:

((s1) (s2) (s3) (s4) | (s5))

With point at |, `C-- C-M-t' gives you this prior to 24.4:

((s1) (s2) (s4) | (s3) (s5))

For 24.4+ it gives you this:

((s1) (s2) (s4) (s3) | (s5))

With `C-- 2', you get this:

< 24.4:

((s1) (s4) | (s2) (s3) (s5))

24.4+:

((s1) (s4) (s2) (s3) | (s5))

Is this by design or a mistake (regression)?  There is no change in the
code of `transpose-sexps' itself.  Perhaps that is a sign that this is
an unplanned side effect (bug)?  Or perhaps it was planned (why?).

It would be good, I think, if the doc mentioned what happens to point.

It would be good, I think - unless there is some great reason for this
change in behavior, to fix this bug.

As an example, the bug interferes with using repetition with a negative
prefix arg.  With the change (bug), repeating a negative prefix arg just
reverses the prefix transposition.

E.g., prior to this bug, you can effectively use `C-- C-M-t' repeatedly
to move a sexp backward:

((s1) (s2) (s3) (s4) | (s5))

C-- C-M-t

((s1) (s2) (s4) | (s3) (s5))

C-- C-M-t

((s1) (s4) | (s2) (s3) (s5))

After this bug:

((s1) (s2) (s3) (s4) | (s5))

C-- C-M-t

((s1) (s2) (s4) (s3) | (s5))

C-- C-M-t  ; Back to where we started.

((s1) (s2) (s3) (s4) | (s5))

Here is a command I use, for example, that lets you repeatedly
transpose and use a negative arg to reverse the direction.
Note the hack to compensate for this bug (I don't claim it is
the best hack for this).

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3))) ; Emacs 24.4+
      (backward-sexp (abs arg))
      (skip-syntax-backward " ."))
    (setq this-command 'rev-transp-sexps-back)))

In GNU Emacs 25.0.50.1 (i686-pc-mingw32)
 of 2014-10-20 on LEG570
Bzr revision: 118168 [email-masked]
Windowing system distributor `Microsoft Corp.', version 6.1.7601
Configured using:
 `configure --enable-checking=yes,glyphs CPPFLAGS=-DGLYPH_DEBUG=1'