unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
@ 2016-01-03  4:01 Jim Meyering
  2016-05-14  9:25 ` Eli Zaretskii
  0 siblings, 1 reply; 54+ messages in thread
From: Jim Meyering @ 2016-01-03  4:01 UTC (permalink / raw)
  To: 22295

Hello,
I noticed that viper-mode's "undo" ('u') command began to undo too much
and was able quickly to determine that it worked fine with my snapshot
built from git master some time on Nov 10, yet that it began to undo
too much four days later.

To demonstrate the problem (without risking changing anything in your
home directory), run this:

  mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
~/previously-nonexistent-file

then respond "y", "y", "5" to get past the "viperize" setup questions.
To reproduce the error, insert two lines, terminating each "insertion" with ESC,
so that each is recorded as a separate undo'able operation. I.e., type this

   a 1 ESC

to create the first line, then

  o 2 ESC

to create the second.
Finally, hit "u" to undo creation of the second and you'll see that it undoes
both operations, erasing both lines.  This is rather disruptive when that first
bit of text was a long paragraph or two -- the novice may think that it's lost,
because redo does not restore it -- however, it is available in emacs's
yank buffer.

Thanks for tending emacs,

Jim





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-01-03  4:01 bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14 Jim Meyering
@ 2016-05-14  9:25 ` Eli Zaretskii
  2016-05-14 10:01   ` Eli Zaretskii
  0 siblings, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-14  9:25 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Jim Meyering

> From: Jim Meyering <jim@meyering.net>
> Date: Sat, 2 Jan 2016 20:01:36 -0800
> 
> Hello,
> I noticed that viper-mode's "undo" ('u') command began to undo too much
> and was able quickly to determine that it worked fine with my snapshot
> built from git master some time on Nov 10, yet that it began to undo
> too much four days later.
> 
> To demonstrate the problem (without risking changing anything in your
> home directory), run this:
> 
>   mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
> ~/previously-nonexistent-file
> 
> then respond "y", "y", "5" to get past the "viperize" setup questions.
> To reproduce the error, insert two lines, terminating each "insertion" with ESC,
> so that each is recorded as a separate undo'able operation. I.e., type this
> 
>    a 1 ESC
> 
> to create the first line, then
> 
>   o 2 ESC
> 
> to create the second.
> Finally, hit "u" to undo creation of the second and you'll see that it undoes
> both operations, erasing both lines.  This is rather disruptive when that first
> bit of text was a long paragraph or two -- the novice may think that it's lost,
> because redo does not restore it -- however, it is available in emacs's
> yank buffer.

Phillip, could you please look into this?  This sounds like a annoying
problem for users of viper-mode, and AFAIU it happens on the release
branch as well.

TIA





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14  9:25 ` Eli Zaretskii
@ 2016-05-14 10:01   ` Eli Zaretskii
  2016-05-14 13:57     ` Phillip Lord
  0 siblings, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-14 10:01 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, jim, phillip.lord

> Date: Sat, 14 May 2016 12:25:13 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: 22295@debbugs.gnu.org, Jim Meyering <jim@meyering.net>
> 
> > From: Jim Meyering <jim@meyering.net>
> > Date: Sat, 2 Jan 2016 20:01:36 -0800
> > 
> > Hello,
> > I noticed that viper-mode's "undo" ('u') command began to undo too much
> > and was able quickly to determine that it worked fine with my snapshot
> > built from git master some time on Nov 10, yet that it began to undo
> > too much four days later.
> > 
> > To demonstrate the problem (without risking changing anything in your
> > home directory), run this:
> > 
> >   mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
> > ~/previously-nonexistent-file
> > 
> > then respond "y", "y", "5" to get past the "viperize" setup questions.
> > To reproduce the error, insert two lines, terminating each "insertion" with ESC,
> > so that each is recorded as a separate undo'able operation. I.e., type this
> > 
> >    a 1 ESC
> > 
> > to create the first line, then
> > 
> >   o 2 ESC
> > 
> > to create the second.
> > Finally, hit "u" to undo creation of the second and you'll see that it undoes
> > both operations, erasing both lines.  This is rather disruptive when that first
> > bit of text was a long paragraph or two -- the novice may think that it's lost,
> > because redo does not restore it -- however, it is available in emacs's
> > yank buffer.
> 
> Phillip, could you please look into this?  This sounds like a annoying
> problem for users of viper-mode, and AFAIU it happens on the release
> branch as well.

(Adding Michael to the addressees.)

I took a short look, and it sounds like we need more experts here.
Undo in viper has its own implementation, which tries to do something
that is not immediately clear to me, and is not really documented
anywhere.  I guess vi users will know that, but I'm not one of them.

The viper-undo command and related functions manipulate the Emacs undo
data structures directly, see viper-adjust-undo.  I guess the recent
changes in low-level undo implementation run afoul of what viper-mode
tries to do.

I hope the above provides enough hints to find the reason for this
problem and solve it.

Thanks.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 10:01   ` Eli Zaretskii
@ 2016-05-14 13:57     ` Phillip Lord
  2016-05-14 20:10       ` Michael Kifer
  2016-05-16  2:31       ` Jim Meyering
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-14 13:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Michael Kifer, 22295, jim

Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Sat, 14 May 2016 12:25:13 +0300
>> From: Eli Zaretskii <eliz@gnu.org>
>> Cc: 22295@debbugs.gnu.org, Jim Meyering <jim@meyering.net>
>> 
>> > From: Jim Meyering <jim@meyering.net>
>> > Date: Sat, 2 Jan 2016 20:01:36 -0800
>> > 
>> > Hello,
>> > I noticed that viper-mode's "undo" ('u') command began to undo too much
>> > and was able quickly to determine that it worked fine with my snapshot
>> > built from git master some time on Nov 10, yet that it began to undo
>> > too much four days later.
>> > 
>> > To demonstrate the problem (without risking changing anything in your
>> > home directory), run this:
>> > 
>> >   mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
>> > ~/previously-nonexistent-file
>> > 
>> > then respond "y", "y", "5" to get past the "viperize" setup questions.
>> > To reproduce the error, insert two lines, terminating each "insertion" with ESC,
>> > so that each is recorded as a separate undo'able operation. I.e., type this
>> > 
>> >    a 1 ESC
>> > 
>> > to create the first line, then
>> > 
>> >   o 2 ESC
>> > 
>> > to create the second.
>> > Finally, hit "u" to undo creation of the second and you'll see that it undoes
>> > both operations, erasing both lines.  This is rather disruptive when that first
>> > bit of text was a long paragraph or two -- the novice may think that it's lost,
>> > because redo does not restore it -- however, it is available in emacs's
>> > yank buffer.
>> 
>> Phillip, could you please look into this?  This sounds like a annoying
>> problem for users of viper-mode, and AFAIU it happens on the release
>> branch as well.
>
> (Adding Michael to the addressees.)
>
> I took a short look, and it sounds like we need more experts here.
> Undo in viper has its own implementation, which tries to do something
> that is not immediately clear to me, and is not really documented
> anywhere.  I guess vi users will know that, but I'm not one of them.
>
> The viper-undo command and related functions manipulate the Emacs undo
> data structures directly, see viper-adjust-undo.  I guess the recent
> changes in low-level undo implementation run afoul of what viper-mode
> tries to do.
>
> I hope the above provides enough hints to find the reason for this
> problem and solve it.
>


Sorry for slow response -- was travelling.

Yep, viper is doing strange things to undo -- it adds a symbol ('viper)
to the undo list, then removes it later, amalgamating everything upto
'viper.

I've got a complete test case (below in case anyone is interested --
I'll make a proper unit test of it on master eventually).


On e0f64e7b4f9c3bbc12c4909ca8c8aa751f1fca4a (a random commit around
the time of the error). This produced a undo list like so:

(nil 
 (2 . 4) 
 nil 
 (2 . 3) 
 (1 . 2) 
 (t . -1))

While on emacs-25 it gives (my comments):


((3 . 4) ;; insertion from 3 to 4
 (2 . 3) ;; insertion from 2 to 3
 nil     ;; boundary
 (2 . 3) ;; insertion from 2 to 3
 (1 . 2) ;; insertion from 1 to 2
 (t . -1) ;; buffer created with file that does not exist
)


So it looks like the amalgamation that Emacs is supposed to be doing is
failing. No idea at all where the head "nil" has gone.

Will work on this more.



(setq viper-inhibit-startup-message 't)
(setq viper-expert-level '5)

(find-file "/tmp/file.txt")
(setq viper-mode t)
(require 'viper)

;; leave emacs lisp in Emacs mode or edebug becomes impossible
(setq viper-vi-state-mode-list (delq
                                'emacs-lisp-mode
                                viper-vi-state-mode-list))

(setq viper-emacs-state-mode-list (cons
                                'emacs-lisp-mode
                                viper-vi-state-mode-list))
;; alas edebug "print last eval" is still broken


(require 'edebug)
(edebug-instrument-function 'viper-adjust-undo)

;; a 1
(execute-kbd-macro
   [?a ?1 escape ?o ?2 escape])





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 13:57     ` Phillip Lord
@ 2016-05-14 20:10       ` Michael Kifer
  2016-05-14 20:39         ` Phillip Lord
  2016-05-16  2:31       ` Jim Meyering
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Kifer @ 2016-05-14 20:10 UTC (permalink / raw)
  To: Phillip Lord, Eli Zaretskii; +Cc: 22295, jim



On 05/14/2016 09:57 AM, Phillip Lord wrote:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> Date: Sat, 14 May 2016 12:25:13 +0300
>>> From: Eli Zaretskii <eliz@gnu.org>
>>> Cc: 22295@debbugs.gnu.org, Jim Meyering <jim@meyering.net>
>>>
>>>> From: Jim Meyering <jim@meyering.net>
>>>> Date: Sat, 2 Jan 2016 20:01:36 -0800
>>>>
>>>> Hello,
>>>> I noticed that viper-mode's "undo" ('u') command began to undo too much
>>>> and was able quickly to determine that it worked fine with my snapshot
>>>> built from git master some time on Nov 10, yet that it began to undo
>>>> too much four days later.
>>>>
>>>> To demonstrate the problem (without risking changing anything in your
>>>> home directory), run this:
>>>>
>>>>    mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
>>>> ~/previously-nonexistent-file
>>>>
>>>> then respond "y", "y", "5" to get past the "viperize" setup questions.
>>>> To reproduce the error, insert two lines, terminating each "insertion" with ESC,
>>>> so that each is recorded as a separate undo'able operation. I.e., type this
>>>>
>>>>     a 1 ESC
>>>>
>>>> to create the first line, then
>>>>
>>>>    o 2 ESC
>>>>
>>>> to create the second.
>>>> Finally, hit "u" to undo creation of the second and you'll see that it undoes
>>>> both operations, erasing both lines.  This is rather disruptive when that first
>>>> bit of text was a long paragraph or two -- the novice may think that it's lost,
>>>> because redo does not restore it -- however, it is available in emacs's
>>>> yank buffer.
>>> Phillip, could you please look into this?  This sounds like a annoying
>>> problem for users of viper-mode, and AFAIU it happens on the release
>>> branch as well.
>> (Adding Michael to the addressees.)
>>
>> I took a short look, and it sounds like we need more experts here.
>> Undo in viper has its own implementation, which tries to do something
>> that is not immediately clear to me, and is not really documented
>> anywhere.  I guess vi users will know that, but I'm not one of them.
>>
>> The viper-undo command and related functions manipulate the Emacs undo
>> data structures directly, see viper-adjust-undo.  I guess the recent
>> changes in low-level undo implementation run afoul of what viper-mode
>> tries to do.
>>
>> I hope the above provides enough hints to find the reason for this
>> problem and solve it.
>>
>
> Sorry for slow response -- was travelling.
>
> Yep, viper is doing strange things to undo -- it adds a symbol ('viper)
> to the undo list, then removes it later, amalgamating everything upto
> 'viper.

I don't remember much myself, but the issue is this (and it is documented):

In VI, the granularity of undoing is much coarser than in Emacs. Several 
ops that Emacs undoes in multiple steps are supposed to be undone with
just one "undo" in VI. Viper simulates this by inserting 
viper-buffer-undo-list-mark onto buffer-undo-list to mark the point to 
which the Emacs undo's
are to be run in order to accomplish one VI-style undo. In Emacs, as I 
vaguely remember, this role is played by nil(?), but VI-style undos are 
coarser
than that, so viper requires its own marker on the unfo list.

Hope this helps.

Sorry that I don't have much time these days to work on viper.  :-(

--

        --- michael




>
> I've got a complete test case (below in case anyone is interested --
> I'll make a proper unit test of it on master eventually).
>
>
> On e0f64e7b4f9c3bbc12c4909ca8c8aa751f1fca4a (a random commit around
> the time of the error). This produced a undo list like so:
>
> (nil
>   (2 . 4)
>   nil
>   (2 . 3)
>   (1 . 2)
>   (t . -1))
>
> While on emacs-25 it gives (my comments):
>
>
> ((3 . 4) ;; insertion from 3 to 4
>   (2 . 3) ;; insertion from 2 to 3
>   nil     ;; boundary
>   (2 . 3) ;; insertion from 2 to 3
>   (1 . 2) ;; insertion from 1 to 2
>   (t . -1) ;; buffer created with file that does not exist
> )
>
>
> So it looks like the amalgamation that Emacs is supposed to be doing is
> failing. No idea at all where the head "nil" has gone.
>
> Will work on this more.
>
>
>
> (setq viper-inhibit-startup-message 't)
> (setq viper-expert-level '5)
>
> (find-file "/tmp/file.txt")
> (setq viper-mode t)
> (require 'viper)
>
> ;; leave emacs lisp in Emacs mode or edebug becomes impossible
> (setq viper-vi-state-mode-list (delq
>                                  'emacs-lisp-mode
>                                  viper-vi-state-mode-list))
>
> (setq viper-emacs-state-mode-list (cons
>                                  'emacs-lisp-mode
>                                  viper-vi-state-mode-list))
> ;; alas edebug "print last eval" is still broken
>
>
> (require 'edebug)
> (edebug-instrument-function 'viper-adjust-undo)
>
> ;; a 1
> (execute-kbd-macro
>     [?a ?1 escape ?o ?2 escape])






^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 20:10       ` Michael Kifer
@ 2016-05-14 20:39         ` Phillip Lord
  2016-05-14 20:50           ` Michael Kifer
  2016-05-15  8:06           ` Michael Albinus
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-14 20:39 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, jim

Michael Kifer <kifer@cs.stonybrook.edu> writes:

> On 05/14/2016 09:57 AM, Phillip Lord wrote:
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>>> Date: Sat, 14 May 2016 12:25:13 +0300
>>>> From: Eli Zaretskii <eliz@gnu.org>
>>>> Cc: 22295@debbugs.gnu.org, Jim Meyering <jim@meyering.net>
>>
>> Sorry for slow response -- was travelling.
>>
>> Yep, viper is doing strange things to undo -- it adds a symbol ('viper)
>> to the undo list, then removes it later, amalgamating everything upto
>> 'viper.
>
> I don't remember much myself, but the issue is this (and it is documented):

It's commented rather documented:-)

>
> In VI, the granularity of undoing is much coarser than in Emacs.
> Several ops that Emacs undoes in multiple steps are supposed to be
> undone with just one "undo" in VI. Viper simulates this by inserting
> viper-buffer-undo-list-mark onto buffer-undo-list to mark the point to
> which the Emacs undo's are to be run in order to accomplish one
> VI-style undo. In Emacs, as I vaguely remember, this role is played by
> nil(?), but VI-style undos are coarser than that, so viper requires
> its own marker on the unfo list.

Yes, you are correct -- boundaries are nil.

Viper puts it's own mark in, yes, but then deletes it later on and
replaces it with nil in this bit of code.


(setq tmp2 (cdr tmp)) ; the part after mark

;; cut tail from buffer-undo-list temporarily by direct
;; manipulation with pointers in buffer-undo-list
(setcdr tmp nil)

(setq buffer-undo-list (delq nil buffer-undo-list))
(setq buffer-undo-list
      (delq viper-buffer-undo-list-mark buffer-undo-list))
;; restore tail of buffer-undo-list
(setq buffer-undo-list (nconc buffer-undo-list tmp2)))

Essentially, it just kills the standard boundary handling and does it's
own thing.


> Hope this helps.

You don't by any chance remember why viper mode appears to turns itself
off in noninteractive mode? Turns out to be rather painful for testing.


> Sorry that I don't have much time these days to work on viper.  :-(

Too busy doing all logic and semantics?

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 20:39         ` Phillip Lord
@ 2016-05-14 20:50           ` Michael Kifer
  2016-05-16  9:50             ` Phillip Lord
  2016-05-15  8:06           ` Michael Albinus
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Kifer @ 2016-05-14 20:50 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, jim

[-- Attachment #1: Type: text/html, Size: 4578 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 20:39         ` Phillip Lord
  2016-05-14 20:50           ` Michael Kifer
@ 2016-05-15  8:06           ` Michael Albinus
  2016-05-16 12:37             ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Albinus @ 2016-05-15  8:06 UTC (permalink / raw)
  To: Phillip Lord; +Cc: Michael Kifer, 22295, jim

phillip.lord@russet.org.uk (Phillip Lord) writes:

> You don't by any chance remember why viper mode appears to turns itself
> off in noninteractive mode? Turns out to be rather painful for testing.

You could embed your test code like this:

(let (noninteractive)
  (run-your-tests))

> Phil

Best regards, Michael.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 13:57     ` Phillip Lord
  2016-05-14 20:10       ` Michael Kifer
@ 2016-05-16  2:31       ` Jim Meyering
  2016-05-16 12:41         ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Jim Meyering @ 2016-05-16  2:31 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Michael Kifer

On Sat, May 14, 2016 at 6:57 AM, Phillip Lord
<phillip.lord@russet.org.uk> wrote:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> Date: Sat, 14 May 2016 12:25:13 +0300
>>> From: Eli Zaretskii <eliz@gnu.org>
>>> Cc: 22295@debbugs.gnu.org, Jim Meyering <jim@meyering.net>
>>>
>>> > From: Jim Meyering <jim@meyering.net>
>>> > Date: Sat, 2 Jan 2016 20:01:36 -0800
>>> >
>>> > Hello,
>>> > I noticed that viper-mode's "undo" ('u') command began to undo too much
>>> > and was able quickly to determine that it worked fine with my snapshot
>>> > built from git master some time on Nov 10, yet that it began to undo
>>> > too much four days later.
>>> >
>>> > To demonstrate the problem (without risking changing anything in your
>>> > home directory), run this:
>>> >
>>> >   mkdir /tmp/x && HOME=/tmp/x emacs -Q -f viper-mode -nw
>>> > ~/previously-nonexistent-file
>>> >
>>> > then respond "y", "y", "5" to get past the "viperize" setup questions.
>>> > To reproduce the error, insert two lines, terminating each "insertion" with ESC,
>>> > so that each is recorded as a separate undo'able operation. I.e., type this
>>> >
>>> >    a 1 ESC
>>> >
>>> > to create the first line, then
>>> >
>>> >   o 2 ESC
>>> >
>>> > to create the second.
>>> > Finally, hit "u" to undo creation of the second and you'll see that it undoes
>>> > both operations, erasing both lines.  This is rather disruptive when that first
>>> > bit of text was a long paragraph or two -- the novice may think that it's lost,
>>> > because redo does not restore it -- however, it is available in emacs's
>>> > yank buffer.
>>>
>>> Phillip, could you please look into this?  This sounds like a annoying
>>> problem for users of viper-mode, and AFAIU it happens on the release
>>> branch as well.
>>
>> (Adding Michael to the addressees.)
>>
>> I took a short look, and it sounds like we need more experts here.
>> Undo in viper has its own implementation, which tries to do something
>> that is not immediately clear to me, and is not really documented
>> anywhere.  I guess vi users will know that, but I'm not one of them.
>>
>> The viper-undo command and related functions manipulate the Emacs undo
>> data structures directly, see viper-adjust-undo.  I guess the recent
>> changes in low-level undo implementation run afoul of what viper-mode
>> tries to do.
>>
>> I hope the above provides enough hints to find the reason for this
>> problem and solve it.
>
> Sorry for slow response -- was travelling.
>
> Yep, viper is doing strange things to undo -- it adds a symbol ('viper)
> to the undo list, then removes it later, amalgamating everything upto
> 'viper.
>
> I've got a complete test case (below in case anyone is interested --
> I'll make a proper unit test of it on master eventually).

Thank you for working on this. My fingers seem to have developed a
serious dependence on viper-mode over the last two decades.
I don't want to retrain them :-)





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-14 20:50           ` Michael Kifer
@ 2016-05-16  9:50             ` Phillip Lord
  2016-05-17  3:38               ` Michael Kifer
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-16  9:50 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, jim

Michael Kifer <kifer@cs.stonybrook.edu> writes:
> Right, it has to do its own marking. When something gets viper-undone,
> the latest viper-buffer-undo-list-mark is deleted and is replaced with
> a nil, so that things can be further viper-undone.
>
> Hope this helps.


It does yes. I am working on a solution; I think that the undo changes
mean that this should be easier to implement.



> You don't by any chance remember why viper mode appears to turns itself
> off in noninteractive mode? Turns out to be rather painful for testing.
>
> I am not sure what you are referring to here.

Consider this:

(defcustom viper-mode (cond (noninteractive nil)
			    (t 'ask))
                            .....
                            

And the viper-mode function...

(defun viper-mode ()
  "Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'."
  (interactive)
  (if (not noninteractive)
      (progn
         'actually-turn-viper-mode-on.....)
  (if (eq major-mode 'viper-mode)
      (setq major-mode 'fundamental-mode))
  )

I normally run tests in batch, but viper automatically switches itself
off. It's going to make testing viper essentially impossible without
working around it (easy to do, but it would be good to understand why
it's like this).

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-15  8:06           ` Michael Albinus
@ 2016-05-16 12:37             ` Phillip Lord
  2016-05-16 17:06               ` Michael Kifer
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-16 12:37 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Michael Kifer, 22295, jim

Michael Albinus <michael.albinus@gmx.de> writes:

> phillip.lord@russet.org.uk (Phillip Lord) writes:
>
>> You don't by any chance remember why viper mode appears to turns itself
>> off in noninteractive mode? Turns out to be rather painful for testing.
>
> You could embed your test code like this:
>
> (let (noninteractive)
>   (run-your-tests))


Yeah, been doing that. Ugly, though, it's not necessary.

The only reason I can think is for people who do lots of "--batch" jobs
and don't want viper to interfere. But, it shouldn't, really, and my
guess is that most people do "emacs --batch -q -l blah.el" for this use.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16  2:31       ` Jim Meyering
@ 2016-05-16 12:41         ` Phillip Lord
  2016-05-16 15:39           ` Jim Meyering
  2016-06-01 13:06           ` Stefan Monnier
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-16 12:41 UTC (permalink / raw)
  To: Jim Meyering; +Cc: 22295, Michael Kifer

Jim Meyering <jim@meyering.net> writes:

>> Sorry for slow response -- was travelling.
>>
>> Yep, viper is doing strange things to undo -- it adds a symbol ('viper)
>> to the undo list, then removes it later, amalgamating everything upto
>> 'viper.
>>
>> I've got a complete test case (below in case anyone is interested --
>> I'll make a proper unit test of it on master eventually).
>
> Thank you for working on this. My fingers seem to have developed a
> serious dependence on viper-mode over the last two decades.
> I don't want to retrain them :-)

It's okay. I don't want Eli forwarding bug reports once emacs-25 comes
out!

I have pushed a first attempt at a fix to branch fix/viper-undo.
Clearly, it's not finished yet, but I'd like to get your feedback as to
whether it works; it should fix the example given, but I haven't used
viper at all, so if it breaks other things I won't know.

I haven't managed to work out exactly why the error is happening --
probably though because the timing of the undo-boundary is somewhat
different, though. With this fix, viper just disables automatic boundary
addition and adds it's own as necessary, which seems cleaner.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 12:41         ` Phillip Lord
@ 2016-05-16 15:39           ` Jim Meyering
  2016-05-16 16:34             ` Eli Zaretskii
  2016-05-17  8:35             ` Phillip Lord
  2016-06-01 13:06           ` Stefan Monnier
  1 sibling, 2 replies; 54+ messages in thread
From: Jim Meyering @ 2016-05-16 15:39 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Michael Kifer

On Mon, May 16, 2016 at 5:41 AM, Phillip Lord
<phillip.lord@russet.org.uk> wrote:
...
> I have pushed a first attempt at a fix to branch fix/viper-undo.
> Clearly, it's not finished yet, but I'd like to get your feedback as to
> whether it works; it should fix the example given, but I haven't used
> viper at all, so if it breaks other things I won't know.
>
> I haven't managed to work out exactly why the error is happening --
> probably though because the timing of the undo-boundary is somewhat
> different, though. With this fix, viper just disables automatic boundary
> addition and adds it's own as necessary, which seems cleaner.

Thank you.
That does indeed fix the case I mentioned.
Here are some cases where it does not work as expected:

  start with an empty buffer in viper-mode
  type 'i 1 2 3 4 5ESC'
  type 'F2dw' to delete the 2 and a space.
  type 'wdw' to delete the 4 and a space.

Now, if I were to hit "u" to undo, I would expect that most recent
deletion to be undone and the 4 would reappear.
Then I would hit '.' to undo the deletion of the '2'. Finally one more
'.' would undo the creation of that first line.
However, with the current patches, that first 'u' undoes everything
and leaves me with the empty initial file.

Another example starting with an empty file:
Create some content via ':r!seq 999|fmt RETURN'
Then remove e.g., "222 " and "444 " via '/222' RET 'dw',
then '/444' RET 'dw'. Now, we expect a single 'u' to restore the '444 ',
yet it undoes everything, leaving an empty buffer.
Hmm... that's probably no different from the first example.

One more, then. Starting with this input:

  1 2 3 4 5 6

advance to the '2' with 'w', 'dw' to delete the 2, then three '.'s to
delete the 3, then 4 and 5.
Then begin to undo with 'u', then '.' to repeat it. Those first two
work, restoring the 5 and 4.
However, one more '.' restores both the 3 and the 2.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 15:39           ` Jim Meyering
@ 2016-05-16 16:34             ` Eli Zaretskii
  2016-05-16 17:14               ` Michael Kifer
  2016-05-17  8:25               ` Phillip Lord
  2016-05-17  8:35             ` Phillip Lord
  1 sibling, 2 replies; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-16 16:34 UTC (permalink / raw)
  To: Jim Meyering; +Cc: kifer, 22295, phillip.lord

> From: Jim Meyering <jim@meyering.net>
> Date: Mon, 16 May 2016 08:39:15 -0700
> Cc: Eli Zaretskii <eliz@gnu.org>, Michael Kifer <kifer@cs.stonybrook.edu>, 22295@debbugs.gnu.org
> 
> Thank you.
> That does indeed fix the case I mentioned.
> Here are some cases where it does not work as expected:
> 
>   start with an empty buffer in viper-mode
>   type 'i 1 2 3 4 5ESC'
>   type 'F2dw' to delete the 2 and a space.
>   type 'wdw' to delete the 4 and a space.
> 
> Now, if I were to hit "u" to undo, I would expect that most recent
> deletion to be undone and the 4 would reappear.
> Then I would hit '.' to undo the deletion of the '2'. Finally one more
> '.' would undo the creation of that first line.
> However, with the current patches, that first 'u' undoes everything
> and leaves me with the empty initial file.
> 
> Another example starting with an empty file:
> Create some content via ':r!seq 999|fmt RETURN'
> Then remove e.g., "222 " and "444 " via '/222' RET 'dw',
> then '/444' RET 'dw'. Now, we expect a single 'u' to restore the '444 ',
> yet it undoes everything, leaving an empty buffer.
> Hmm... that's probably no different from the first example.
> 
> One more, then. Starting with this input:
> 
>   1 2 3 4 5 6
> 
> advance to the '2' with 'w', 'dw' to delete the 2, then three '.'s to
> delete the 3, then 4 and 5.
> Then begin to undo with 'u', then '.' to repeat it. Those first two
> work, restoring the 5 and 4.
> However, one more '.' restores both the 3 and the 2.

Thanks.  It now looks like your expectations are close to what Emacs
does by default, whereas Michael said the VI undo is more coarse (and
in the original recipe, it indeed seemed to be that).

Is it possible to have a more general/formal description of what
'undo' in VI is supposed to do?  E.g., it looks like it has different
granularities wrt insertions and deletions, is that correct?

You see, when I said this is undocumented, I meant precisely that: the
expected effect of 'undo' in VI is not described, so someone who is
not a VI user doesn't know what to test and how to program that.

Michael said that this _is_ documented, but the only documentation I
see is comments that describe _what_ they do in terms of Emacs undo
structures, and are full of "rationale" such as "so that things will
be undone properly".  I don't see any description of the expected
effect of undoing in different situations, let alone some formal
specification of undo-related requirements.  If I missed some
description of how undo is supposed to work in viper, please just
point me there.

Another alternative is to make viper use the default Emacs undo, and
then ask you and other users of viper to tell where the results don't
match your expectations.  It could well be that starting with a clean
slate will get us to the goal faster and with less complex code.

TIA





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 12:37             ` Phillip Lord
@ 2016-05-16 17:06               ` Michael Kifer
  0 siblings, 0 replies; 54+ messages in thread
From: Michael Kifer @ 2016-05-16 17:06 UTC (permalink / raw)
  To: Phillip Lord, Michael Albinus; +Cc: 22295, jim

[-- Attachment #1: Type: text/html, Size: 1851 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 16:34             ` Eli Zaretskii
@ 2016-05-16 17:14               ` Michael Kifer
  2016-05-16 17:41                 ` Eli Zaretskii
  2016-05-17  8:46                 ` Phillip Lord
  2016-05-17  8:25               ` Phillip Lord
  1 sibling, 2 replies; 54+ messages in thread
From: Michael Kifer @ 2016-05-16 17:14 UTC (permalink / raw)
  To: Eli Zaretskii, Jim Meyering; +Cc: 22295, phillip.lord

[-- Attachment #1: Type: text/html, Size: 4794 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 17:14               ` Michael Kifer
@ 2016-05-16 17:41                 ` Eli Zaretskii
  2016-05-17  8:48                   ` Phillip Lord
  2016-05-17  8:46                 ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-16 17:41 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, jim, phillip.lord

> Cc: phillip.lord@russet.org.uk, 22295@debbugs.gnu.org
> From: Michael Kifer <kifer@cs.stonybrook.edu>
> Date: Mon, 16 May 2016 13:14:05 -0400
> 
> >  Another alternative is to make viper use the default Emacs undo, and
> > then ask you and other users of viper to tell where the results don't
> > match your expectations.  It could well be that starting with a clean
> > slate will get us to the goal faster and with less complex code.
> 
> This would be a non-starter and would cause a mass migration to vim. The undo would also then be
> implementation dependent. If, say, "delete 2 words" is implemented differently from how it is now then it would
> be undone via a different sequence of commands. 

Then I guess the current trial-and-error method will have to be the
way.  Too bad, I have hard time believing we will be ready with a
complete solution in time for Emacs 25.1, which is what I hoped.

Thanks.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16  9:50             ` Phillip Lord
@ 2016-05-17  3:38               ` Michael Kifer
  2016-05-17  8:52                 ` Phillip Lord
  0 siblings, 1 reply; 54+ messages in thread
From: Michael Kifer @ 2016-05-17  3:38 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, jim

[-- Attachment #1: Type: text/html, Size: 2866 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 16:34             ` Eli Zaretskii
  2016-05-16 17:14               ` Michael Kifer
@ 2016-05-17  8:25               ` Phillip Lord
  1 sibling, 0 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-17  8:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kifer, 22295, Jim Meyering

Eli Zaretskii <eliz@gnu.org> writes:

>> One more, then. Starting with this input:
>> 
>>   1 2 3 4 5 6
>> 
>> advance to the '2' with 'w', 'dw' to delete the 2, then three '.'s to
>> delete the 3, then 4 and 5.
>> Then begin to undo with 'u', then '.' to repeat it. Those first two
>> work, restoring the 5 and 4.
>> However, one more '.' restores both the 3 and the 2.
>
> Thanks.  It now looks like your expectations are close to what Emacs
> does by default, whereas Michael said the VI undo is more coarse (and
> in the original recipe, it indeed seemed to be that).
>
> Is it possible to have a more general/formal description of what
> 'undo' in VI is supposed to do?  E.g., it looks like it has different
> granularities wrt insertions and deletions, is that correct?
>
> You see, when I said this is undocumented, I meant precisely that: the
> expected effect of 'undo' in VI is not described, so someone who is
> not a VI user doesn't know what to test and how to program that.

AFAICT, once you enter insert mode, it squashes all undo boundaries,
until you leave again. Unfortunately, outside of insert mode (i.e. in
"vi" mode), it uses the default "one per command" emacs undo.


> Michael said that this _is_ documented, but the only documentation I
> see is comments that describe _what_ they do in terms of Emacs undo
> structures, and are full of "rationale" such as "so that things will
> be undone properly".  I don't see any description of the expected
> effect of undoing in different situations, let alone some formal
> specification of undo-related requirements.  If I missed some
> description of how undo is supposed to work in viper, please just
> point me there.


I guess it's "the same as vi". Although, the undo behaves differently
from vim at least: viper has "u" == "undo" and "." == "undo more". VIM
just uses repeated "u"'s to achieve the same thing.


> Another alternative is to make viper use the default Emacs undo, and
> then ask you and other users of viper to tell where the results don't
> match your expectations.  It could well be that starting with a clean
> slate will get us to the goal faster and with less complex code.
>
> TIA


It mostly does use the default Emacs undo, with a bit of weirdness in
one mode.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 15:39           ` Jim Meyering
  2016-05-16 16:34             ` Eli Zaretskii
@ 2016-05-17  8:35             ` Phillip Lord
       [not found]               ` <CA+8g5KG=XBCc8U3u3D=+bh74sMLAH9R7ZUZ=SeQL9de=WQ71vQ@mail.gmail.com>
  1 sibling, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-17  8:35 UTC (permalink / raw)
  To: Jim Meyering; +Cc: 22295, Michael Kifer

Jim Meyering <jim@meyering.net> writes:

> On Mon, May 16, 2016 at 5:41 AM, Phillip Lord
> <phillip.lord@russet.org.uk> wrote:
> ...
>> I have pushed a first attempt at a fix to branch fix/viper-undo.
>> Clearly, it's not finished yet, but I'd like to get your feedback as to
>> whether it works; it should fix the example given, but I haven't used
>> viper at all, so if it breaks other things I won't know.
>>
>> I haven't managed to work out exactly why the error is happening --
>> probably though because the timing of the undo-boundary is somewhat
>> different, though. With this fix, viper just disables automatic boundary
>> addition and adds it's own as necessary, which seems cleaner.
>
> Thank you.
> That does indeed fix the case I mentioned.
> Here are some cases where it does not work as expected:
>
>   start with an empty buffer in viper-mode
>   type 'i 1 2 3 4 5ESC'
>   type 'F2dw' to delete the 2 and a space.
>   type 'wdw' to delete the 4 and a space.
>
> Now, if I were to hit "u" to undo, I would expect that most recent
> deletion to be undone and the 4 would reappear.
> Then I would hit '.' to undo the deletion of the '2'. Finally one more
> '.' would undo the creation of that first line.
> However, with the current patches, that first 'u' undoes everything
> and leaves me with the empty initial file.
>
> Another example starting with an empty file:
> Create some content via ':r!seq 999|fmt RETURN'
> Then remove e.g., "222 " and "444 " via '/222' RET 'dw',
> then '/444' RET 'dw'. Now, we expect a single 'u' to restore the '444 ',
> yet it undoes everything, leaving an empty buffer.
> Hmm... that's probably no different from the first example.
>
> One more, then. Starting with this input:
>
>   1 2 3 4 5 6
>
> advance to the '2' with 'w', 'dw' to delete the 2, then three '.'s to
> delete the 3, then 4 and 5.
> Then begin to undo with 'u', then '.' to repeat it. Those first two
> work, restoring the 5 and 4.
> However, one more '.' restores both the 3 and the 2.

How do you ever learn all of these keypresses?

I've pushed to fix/viper-undo, and AFAICT, it handles all of these
situations.

I *thought* viper was essentially switching off Emacs undo-boundary
behaviour, but, actually, it only does this very specific circumstances
(which it does by adding 'viper, then deleting all the other boundaries
upto 'viper). So, the fix I have now just disables the addition of
undo-boundaries when 'viper would have been added, and switches them
back on again when the boundaries and 'viper would have been removed.
This *should* behave the same. As an added bonus, the code is quite a
bit simpler.

Can you test a bit further for me? Any key sequences you want to send
would be gratefully recieved; I'm converting them into kbd-macros and
will use them as test cases. So:

  (execute-kbd-macro
   [
    ?i
    ?1 ?  ?2 ?  ?3 ?  ?4 ?  ?5
    escape
    ?F ?2 ?d ?w
    ?w ?d ?w
    ?u
    ])

in a clean buffer should leave "1 2 4 5".

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 17:14               ` Michael Kifer
  2016-05-16 17:41                 ` Eli Zaretskii
@ 2016-05-17  8:46                 ` Phillip Lord
  2016-05-17 14:05                   ` Michael Kifer
  1 sibling, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-17  8:46 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, Jim Meyering

Michael Kifer <kifer@cs.stonybrook.edu> writes:

>> You see, when I said this is undocumented, I meant precisely that: the
>> expected effect of 'undo' in VI is not described, so someone who is
>> not a VI user doesn't know what to test and how to program that.
>
> In VI, an undo is supposed to undo the effect of the previous VI
> command. In Emacs terms, each such command usually means several
> inserts and deletes, which in Emacs would be undone via a series of
> undos. Such behavior is a non-no to a vi user.


Actually, by default inserts and (simple) deletes are amalgamated by
Emacs and undone in chunks of 20 rather than one at a time.


> I was referring to the insertion of a special marker into the undo
> list. Obviously, the usual Vi conventions are not documented because
> this would require to duplicate the Vi manual.

Actually, that would be a useful statement to have. Viper may replicate
"vi" behaviour, although I don't have a copy of vi to test it on. It
doesn't replicate vim's undo.


>> Another alternative is to make viper use the default Emacs undo, and
>> then ask you and other users of viper to tell where the results don't
>> match your expectations. It could well be that starting with a clean
>> slate will get us to the goal faster and with less complex code.
>
> This would be a non-starter and would cause a mass migration to vim.
> The undo would also then be implementation dependent. If, say, "delete
> 2 words" is implemented differently from how it is now then it would
> be undone via a different sequence of commands.

People will get a different sequence of commands if they migrate to vim
also!

Anyway, I have sent more code upstream. It changes the implementation,
but (hopefully) will preserve the currrent behaviour.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 17:41                 ` Eli Zaretskii
@ 2016-05-17  8:48                   ` Phillip Lord
  0 siblings, 0 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-17  8:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Michael Kifer, 22295, jim

Eli Zaretskii <eliz@gnu.org> writes:

>> Cc: phillip.lord@russet.org.uk, 22295@debbugs.gnu.org
>> From: Michael Kifer <kifer@cs.stonybrook.edu>
>> Date: Mon, 16 May 2016 13:14:05 -0400
>> 
>> >  Another alternative is to make viper use the default Emacs undo, and
>> > then ask you and other users of viper to tell where the results don't
>> > match your expectations.  It could well be that starting with a clean
>> > slate will get us to the goal faster and with less complex code.
>> 
>> This would be a non-starter and would cause a mass migration to vim. The undo would also then be
>> implementation dependent. If, say, "delete 2 words" is implemented differently from how it is now then it would
>> be undone via a different sequence of commands. 
>
> Then I guess the current trial-and-error method will have to be the
> way.  Too bad, I have hard time believing we will be ready with a
> complete solution in time for Emacs 25.1, which is what I hoped.

I worry about this as well. I still do not understand why my changes
have caused this problem; I'd rather not be taking the approach to
redoing the implementation of viper during release candidate.

Still, if, as I suspect, it's because the timing of boundaries has
changed slightly, it's likely to be the only choice.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-17  3:38               ` Michael Kifer
@ 2016-05-17  8:52                 ` Phillip Lord
  2016-05-17 13:58                   ` Michael Kifer
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-17  8:52 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, jim

Michael Kifer <kifer@cs.stonybrook.edu> writes:

> On 05/16/2016 05:50 AM, Phillip Lord wrote:
> OK. I don't remember this very clearly but there are cases (which I
> don't remember) where viper-mode gets kicked in implicitly for buffers
> where the user didn't ask it to and where it is not wanted. Maybe when
> one runs emacs in batch mode as a scripting tool.

AFAIK, noninteractive *only* happens in batch. Perhaps there are other
circumstances.

> One can defeat viper-mode in that case using emacs -q, but maybe there
> are other cases.

> Since I don't remember and since it is not good to have kludges
> around, one way to figure it out is to comment out the (not
> interactive) part and then see what happens. If and when you see
> undesired behavior, then uncomment and document :-)

I might well try that on master. We really need some unit tests for
viper; it was be a shame if Jim's examples just got archived in the bug
tracker.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-17  8:52                 ` Phillip Lord
@ 2016-05-17 13:58                   ` Michael Kifer
  0 siblings, 0 replies; 54+ messages in thread
From: Michael Kifer @ 2016-05-17 13:58 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, jim

[-- Attachment #1: Type: text/html, Size: 2194 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-17  8:46                 ` Phillip Lord
@ 2016-05-17 14:05                   ` Michael Kifer
  2016-05-17 22:35                     ` Phillip Lord
  0 siblings, 1 reply; 54+ messages in thread
From: Michael Kifer @ 2016-05-17 14:05 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Jim Meyering

[-- Attachment #1: Type: text/html, Size: 3650 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-17 14:05                   ` Michael Kifer
@ 2016-05-17 22:35                     ` Phillip Lord
  0 siblings, 0 replies; 54+ messages in thread
From: Phillip Lord @ 2016-05-17 22:35 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, Jim Meyering

Michael Kifer <kifer@cs.stonybrook.edu> writes:
> I used to have (may still have) access to Solaris where the One True
> Vi could still be found :-) True, vim undo is slightly different. But
> I am not sure there was a vim back when viper started. Besides, the
> '.' came from a precursor of viper, introduced by someone else, so I
> am not responsible :-) After all these years using it I prefer the
> viper behavior.

Trying to preserve the old behaviour (i.e. before I broke it!) is the
best I can offer then!


> Anyway, I have sent more code upstream. It changes the implementation,
> but (hopefully) will preserve the currrent behaviour.
>
> Cool, thanks! 

Please do send me any test cases that do not work. I've got ert unit
tests working now, so I can use any set of keypresses on a clean buffer
with the expected output (preferable as a keyboard macro, but I can
convert a description!).

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
       [not found]               ` <CA+8g5KG=XBCc8U3u3D=+bh74sMLAH9R7ZUZ=SeQL9de=WQ71vQ@mail.gmail.com>
@ 2016-05-18  9:15                 ` Phillip Lord
  2016-05-18 15:58                   ` Jim Meyering
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-18  9:15 UTC (permalink / raw)
  To: Jim Meyering; +Cc: 22295


Jim Meyering <jim@meyering.net> writes:
> Thank you!
> I've updated and built with that. It is much better.
> So far, I have noticed only one anomaly:
>
> Starting with an empty file, add three lines of text, terminating each
> addition with ESC.
> E.g., i1ESC then o2ESC and o3ESC
> Then, "u.." should restore to the original, empty file.
> The first "u" works fine and removes the "3" line, but the following
> "." has no visual effect, and I have to hit it again to remove the
> "2". Same story for the "1".

Yeah, I was adding two undo-boundaries to rather than just one. For no
readily apparent reason I was directly changing the buffer-undo-list,
rather than calling undo-boundary.

Anyway, that should be fixed.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-18  9:15                 ` Phillip Lord
@ 2016-05-18 15:58                   ` Jim Meyering
  2016-05-18 21:42                     ` Phillip Lord
  0 siblings, 1 reply; 54+ messages in thread
From: Jim Meyering @ 2016-05-18 15:58 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295

On Wed, May 18, 2016 at 2:15 AM, Phillip Lord
<phillip.lord@russet.org.uk> wrote:
> Yeah, I was adding two undo-boundaries to rather than just one. For no
> readily apparent reason I was directly changing the buffer-undo-list,
> rather than calling undo-boundary.
>
> Anyway, that should be fixed.

Confirmed.
Thanks again for fixing all of that.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-18 15:58                   ` Jim Meyering
@ 2016-05-18 21:42                     ` Phillip Lord
  2016-05-19  1:09                       ` Jim Meyering
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-18 21:42 UTC (permalink / raw)
  To: Jim Meyering; +Cc: John Wiegley, 22295

Jim Meyering <jim@meyering.net> writes:

> On Wed, May 18, 2016 at 2:15 AM, Phillip Lord
> <phillip.lord@russet.org.uk> wrote:
>> Yeah, I was adding two undo-boundaries to rather than just one. For no
>> readily apparent reason I was directly changing the buffer-undo-list,
>> rather than calling undo-boundary.
>>
>> Anyway, that should be fixed.
>
> Confirmed.
> Thanks again for fixing all of that.


Let me know if you find anything else.

John, this is a reasonably extensive change now -- affecting both
simple.el, but also a big rework of viper undo.

To Emacs-25 or not to Emacs-25 that is the question?

Phil






^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-18 21:42                     ` Phillip Lord
@ 2016-05-19  1:09                       ` Jim Meyering
  2016-05-20 10:00                         ` Eli Zaretskii
  0 siblings, 1 reply; 54+ messages in thread
From: Jim Meyering @ 2016-05-19  1:09 UTC (permalink / raw)
  To: Phillip Lord; +Cc: John Wiegley, 22295

On Wed, May 18, 2016 at 2:42 PM, Phillip Lord
<phillip.lord@russet.org.uk> wrote:
> Jim Meyering <jim@meyering.net> writes:
>
>> On Wed, May 18, 2016 at 2:15 AM, Phillip Lord
>> <phillip.lord@russet.org.uk> wrote:
>>> Yeah, I was adding two undo-boundaries to rather than just one. For no
>>> readily apparent reason I was directly changing the buffer-undo-list,
>>> rather than calling undo-boundary.
>>>
>>> Anyway, that should be fixed.
>>
>> Confirmed.
>> Thanks again for fixing all of that.
>
>
> Let me know if you find anything else.
>
> John, this is a reasonably extensive change now -- affecting both
> simple.el, but also a big rework of viper undo.
>
> To Emacs-25 or not to Emacs-25 that is the question?

Perspective of a viper-mode user: including this fix in Emacs-25 is a
must: without it, any existing viper-mode user will very quickly
notice how "undo" appears to destroy data, seemingly unrecoverably,
since "redo" does not restore it -- they'd have to go look in emacs'
yank buffer.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-19  1:09                       ` Jim Meyering
@ 2016-05-20 10:00                         ` Eli Zaretskii
  2016-05-20 11:46                           ` Phillip Lord
  2016-05-23  6:45                           ` John Wiegley
  0 siblings, 2 replies; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-20 10:00 UTC (permalink / raw)
  To: Jim Meyering; +Cc: jwiegley, 22295, phillip.lord

> From: Jim Meyering <jim@meyering.net>
> Date: Wed, 18 May 2016 18:09:36 -0700
> Cc: 22295@debbugs.gnu.org, John Wiegley <jwiegley@gmail.com>, Eli Zaretskii <eliz@gnu.org>
> 
> On Wed, May 18, 2016 at 2:42 PM, Phillip Lord
> <phillip.lord@russet.org.uk> wrote:
> > Jim Meyering <jim@meyering.net> writes:
> >
> >> On Wed, May 18, 2016 at 2:15 AM, Phillip Lord
> >> <phillip.lord@russet.org.uk> wrote:
> >>> Yeah, I was adding two undo-boundaries to rather than just one. For no
> >>> readily apparent reason I was directly changing the buffer-undo-list,
> >>> rather than calling undo-boundary.
> >>>
> >>> Anyway, that should be fixed.
> >>
> >> Confirmed.
> >> Thanks again for fixing all of that.
> >
> >
> > Let me know if you find anything else.
> >
> > John, this is a reasonably extensive change now -- affecting both
> > simple.el, but also a big rework of viper undo.
> >
> > To Emacs-25 or not to Emacs-25 that is the question?
> 
> Perspective of a viper-mode user: including this fix in Emacs-25 is a
> must: without it, any existing viper-mode user will very quickly
> notice how "undo" appears to destroy data, seemingly unrecoverably,
> since "redo" does not restore it -- they'd have to go look in emacs'
> yank buffer.

FWIW, I think this should go to emacs-25, since (a) the changes affect
only viper-mode, and (b) users of that mode will be most unhappy
without these changes.

However, we should add comments to viper-cmd.el that document the
special handling of 'undo' by viper-mode, and how that interacts with
the core 'undo' functionalities.  We should also comment in simple.el
that undo-auto-disable-boundaries is used by viper-mode, and document
that variable in the ELisp manual.  Phillip, can you add these bits to
the branch, please?

Thanks.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-20 10:00                         ` Eli Zaretskii
@ 2016-05-20 11:46                           ` Phillip Lord
  2016-05-20 13:32                             ` Eli Zaretskii
  2016-05-23  6:45                           ` John Wiegley
  1 sibling, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-20 11:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: jwiegley, 22295, Jim Meyering

Eli Zaretskii <eliz@gnu.org> writes:

> FWIW, I think this should go to emacs-25, since (a) the changes affect
> only viper-mode, and (b) users of that mode will be most unhappy
> without these changes.

Not quite true. I've changed simple.el.

The change is minimal, and just allows downstream developers to disable
the auto-undo boundary. However, if a developer does do this in a bad
way, then Emacs does produce pretty intrusive "this is probably a bug"
warnings.


> However, we should add comments to viper-cmd.el that document the
> special handling of 'undo' by viper-mode, and how that interacts with
> the core 'undo' functionalities.  We should also comment in simple.el
> that undo-auto-disable-boundaries is used by viper-mode, and document
> that variable in the ELisp manual.  Phillip, can you add these bits to
> the branch, please?


Oh, yeah, sorry forgot the manual. I updated most of the rest last
night. I think that the branch is ready, bar squashing.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-20 11:46                           ` Phillip Lord
@ 2016-05-20 13:32                             ` Eli Zaretskii
  0 siblings, 0 replies; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-20 13:32 UTC (permalink / raw)
  To: Phillip Lord, John Wiegley; +Cc: 22295, jim

> From: phillip.lord@russet.org.uk (Phillip Lord)
> Cc: Jim Meyering <jim@meyering.net>,  22295@debbugs.gnu.org,  jwiegley@gmail.com
> Date: Fri, 20 May 2016 12:46:14 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > FWIW, I think this should go to emacs-25, since (a) the changes affect
> > only viper-mode, and (b) users of that mode will be most unhappy
> > without these changes.
> 
> Not quite true. I've changed simple.el.

I've seen the change, of course.  As long as only viper-mode uses that
variable, I see no danger.

> > However, we should add comments to viper-cmd.el that document the
> > special handling of 'undo' by viper-mode, and how that interacts with
> > the core 'undo' functionalities.  We should also comment in simple.el
> > that undo-auto-disable-boundaries is used by viper-mode, and document
> > that variable in the ELisp manual.  Phillip, can you add these bits to
> > the branch, please?
> 
> Oh, yeah, sorry forgot the manual. I updated most of the rest last
> night. I think that the branch is ready, bar squashing.

Thanks.

John, we are waiting for your verdict.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-20 10:00                         ` Eli Zaretskii
  2016-05-20 11:46                           ` Phillip Lord
@ 2016-05-23  6:45                           ` John Wiegley
  2016-05-23 13:23                             ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: John Wiegley @ 2016-05-23  6:45 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 22295, Jim Meyering, phillip.lord

>>>>> Eli Zaretskii <eliz@gnu.org> writes:

> FWIW, I think this should go to emacs-25, since (a) the changes affect only
> viper-mode, and (b) users of that mode will be most unhappy without these
> changes.

I agree, Eli, let's push this to emacs-25.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-23  6:45                           ` John Wiegley
@ 2016-05-23 13:23                             ` Phillip Lord
  2016-05-24 15:43                               ` Eli Zaretskii
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-23 13:23 UTC (permalink / raw)
  To: John Wiegley; +Cc: 22295, Jim Meyering

John Wiegley <jwiegley@gmail.com> writes:

>>>>>> Eli Zaretskii <eliz@gnu.org> writes:
>
>> FWIW, I think this should go to emacs-25, since (a) the changes affect only
>> viper-mode, and (b) users of that mode will be most unhappy without these
>> changes.
>
> I agree, Eli, let's push this to emacs-25.


All done.

I've added my tests as well -- should have done that in the same commit
I guess, but forgot. Hope that's okay on emacs-25.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-23 13:23                             ` Phillip Lord
@ 2016-05-24 15:43                               ` Eli Zaretskii
  2016-05-25 12:43                                 ` Phillip Lord
  0 siblings, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-24 15:43 UTC (permalink / raw)
  To: Phillip Lord; +Cc: jwiegley, 22295, jim

> From: phillip.lord@russet.org.uk (Phillip Lord)
> Cc: Eli Zaretskii <eliz@gnu.org>,  Jim Meyering <jim@meyering.net>,  22295@debbugs.gnu.org
> Date: Mon, 23 May 2016 14:23:44 +0100
> 
> John Wiegley <jwiegley@gmail.com> writes:
> 
> >>>>>> Eli Zaretskii <eliz@gnu.org> writes:
> >
> >> FWIW, I think this should go to emacs-25, since (a) the changes affect only
> >> viper-mode, and (b) users of that mode will be most unhappy without these
> >> changes.
> >
> > I agree, Eli, let's push this to emacs-25.
> 
> 
> All done.

Thanks.

Any reason you didn't close the bug?





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-24 15:43                               ` Eli Zaretskii
@ 2016-05-25 12:43                                 ` Phillip Lord
  2016-05-25 16:28                                   ` Eli Zaretskii
  0 siblings, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-05-25 12:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: jwiegley, 22295, jim

Eli Zaretskii <eliz@gnu.org> writes:
>> >> FWIW, I think this should go to emacs-25, since (a) the changes affect only
>> >> viper-mode, and (b) users of that mode will be most unhappy without these
>> >> changes.
>> >
>> > I agree, Eli, let's push this to emacs-25.
>> 
>> 
>> All done.
>
> Thanks.
>
> Any reason you didn't close the bug?

Closed now.

(If I have done it right -- if I have done it wrong, tell me!)

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-25 12:43                                 ` Phillip Lord
@ 2016-05-25 16:28                                   ` Eli Zaretskii
  0 siblings, 0 replies; 54+ messages in thread
From: Eli Zaretskii @ 2016-05-25 16:28 UTC (permalink / raw)
  To: Phillip Lord; +Cc: jwiegley, 22295, jim

> From: Phillip Lord <phillip.lord@russet.org.uk>
> Cc: 22295@debbugs.gnu.org,  jwiegley@gmail.com,  jim@meyering.net
> Date: Wed, 25 May 2016 13:43:22 +0100
> 
> > Any reason you didn't close the bug?
> 
> Closed now.
> 
> (If I have done it right -- if I have done it wrong, tell me!)

You did OK, thanks.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-05-16 12:41         ` Phillip Lord
  2016-05-16 15:39           ` Jim Meyering
@ 2016-06-01 13:06           ` Stefan Monnier
  2016-06-01 22:23             ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Stefan Monnier @ 2016-06-01 13:06 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Jim Meyering, Michael Kifer

> different, though. With this fix, viper just disables automatic boundary
> addition and adds it's own as necessary, which seems cleaner.

I see an annoying side-effect of that change, tho:

    % emacs -Q -f viper-mode
    y 5 n                   ;; To get past viper's initial questions.
    i helo C-b k C-/

This last C-/ used to (and should) just undo the insertion of the last
"k", but instead it now completely wipes out the *scratch* buffer.

So I think that completely disabling undo boundaries is not a good idea:
while in many use-cases insertion mode is very transient, it is not so
unusual to spend more time in insertion mode (which is pretty much
"emacs mode") and to expect undo boundaries to properly inserted during
this time.

Have we been able to identify the original problem?  The old code seemed
"simple" enough that the problem was probably simple to fix (once
identified).


        Stefan





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 13:06           ` Stefan Monnier
@ 2016-06-01 22:23             ` Phillip Lord
  2016-06-01 22:34               ` Michael Kifer
  2016-06-10 17:05               ` Stefan Monnier
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-06-01 22:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 22295, Jim Meyering, Michael Kifer

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> different, though. With this fix, viper just disables automatic boundary
>> addition and adds it's own as necessary, which seems cleaner.
>
> I see an annoying side-effect of that change, tho:
>
>     % emacs -Q -f viper-mode
>     y 5 n                   ;; To get past viper's initial questions.
>     i helo C-b k C-/
>
> This last C-/ used to (and should) just undo the insertion of the last
> "k", but instead it now completely wipes out the *scratch* buffer.
>
> So I think that completely disabling undo boundaries is not a good idea:
> while in many use-cases insertion mode is very transient, it is not so
> unusual to spend more time in insertion mode (which is pretty much
> "emacs mode") and to expect undo boundaries to properly inserted during
> this time.

Oh dear. Yes, that is a problem. The difficulty is that viper modifies
the undo-list, removing boundaries only *after* we leave insert mode.
Hence, when you type C-/ above they are still there.

If you do

i helo C-b k escape C-/

before the undo changes, then the whole buffer is deleted also. So, undo
behaves different in insert mode and in <V> command mode.

Viper's solution of introducing a 'viper symbol is a nice one, but has
it's problems. If you do, for example

i helo C-b k C-/ C-/

We get an error from the undo system.

primitive-undo: Unrecognized entry in undo list viper

The deep problem here is that undo boundary == nil -- i.e. there is one
and only one symbol for undo-boundary. If it could carry a value, viper
could do this cleanly.

Only solution that leaps to mind is this:


1) Restore all the old viper code
2) Instead of adding a 'viper mark, copy the buffer-undo-list to
"viper-old-buffer-undo-list".
3) Instead of this....

(if (setq tmp (memq viper-buffer-undo-list-mark buffer-undo-list))

we should now already have the cons cell that represents the tail of the
buffer-undo-list.

This is also quite a big change, and I worry about buffer compaction --
viper-old-buffer-undo-list would not be open for GC.


> Have we been able to identify the original problem?

No, fraid not. Thought about it lots. Failed.

> The old code seemed "simple" enough that the problem was probably
> simple to fix (once identified).

Well, most problems are simple to fix once you actually know what they
are.

I shall look again at the old code, and see if I can figure it out.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 22:23             ` Phillip Lord
@ 2016-06-01 22:34               ` Michael Kifer
  2016-06-01 22:41                 ` Phillip Lord
  2016-06-02  0:11                 ` Stefan Monnier
  2016-06-10 17:05               ` Stefan Monnier
  1 sibling, 2 replies; 54+ messages in thread
From: Michael Kifer @ 2016-06-01 22:34 UTC (permalink / raw)
  To: Phillip Lord, Stefan Monnier; +Cc: 22295, Jim Meyering



On 06/01/2016 06:23 PM, Phillip Lord wrote:
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
>>> different, though. With this fix, viper just disables automatic boundary
>>> addition and adds it's own as necessary, which seems cleaner.
>> I see an annoying side-effect of that change, tho:
>>
>>      % emacs -Q -f viper-mode
>>      y 5 n                   ;; To get past viper's initial questions.
>>      i helo C-b k C-/
>>
>> This last C-/ used to (and should) just undo the insertion of the last
>> "k", but instead it now completely wipes out the *scratch* buffer.
>>
>> So I think that completely disabling undo boundaries is not a good idea:
>> while in many use-cases insertion mode is very transient, it is not so
>> unusual to spend more time in insertion mode (which is pretty much
>> "emacs mode") and to expect undo boundaries to properly inserted during
>> this time.
> Oh dear. Yes, that is a problem. The difficulty is that viper modifies
> the undo-list, removing boundaries only *after* we leave insert mode.
> Hence, when you type C-/ above they are still there.
>
> If you do
>
> i helo C-b k escape C-/
>
> before the undo changes, then the whole buffer is deleted also. So, undo
> behaves different in insert mode and in <V> command mode.
>
> Viper's solution of introducing a 'viper symbol is a nice one, but has
> it's problems. If you do, for example
>
> i helo C-b k C-/ C-/
>
> We get an error from the undo system.
>
> primitive-undo: Unrecognized entry in undo list viper

not in  25.0.50
viper worked fine with this for 20 years and I'd say it is Emacs 
breakage, not Viper's.


> The deep problem here is that undo boundary == nil -- i.e. there is one
> and only one symbol for undo-boundary. If it could carry a value, viper
> could do this cleanly.
>
> Only solution that leaps to mind is this:
>
>
> 1) Restore all the old viper code
> 2) Instead of adding a 'viper mark, copy the buffer-undo-list to
> "viper-old-buffer-undo-list".
> 3) Instead of this....
>
> (if (setq tmp (memq viper-buffer-undo-list-mark buffer-undo-list))
>
> we should now already have the cons cell that represents the tail of the
> buffer-undo-list.
>
> This is also quite a big change, and I worry about buffer compaction --
> viper-old-buffer-undo-list would not be open for GC.

Do you know who made the changes to the emacs undo list? Maybe complain 
to him?



>
>> Have we been able to identify the original problem?
> No, fraid not. Thought about it lots. Failed.

could not  understand what happened either.

--

        --- michael


>
>> The old code seemed "simple" enough that the problem was probably
>> simple to fix (once identified).
> Well, most problems are simple to fix once you actually know what they
> are.
>
> I shall look again at the old code, and see if I can figure it out.
>
> Phil






^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 22:34               ` Michael Kifer
@ 2016-06-01 22:41                 ` Phillip Lord
  2016-06-01 22:47                   ` Michael Kifer
  2016-06-02  0:11                 ` Stefan Monnier
  1 sibling, 1 reply; 54+ messages in thread
From: Phillip Lord @ 2016-06-01 22:41 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, Stefan Monnier, Jim Meyering

Michael Kifer <kifer@cs.stonybrook.edu> writes:

> On 06/01/2016 06:23 PM, Phillip Lord wrote:
>> Viper's solution of introducing a 'viper symbol is a nice one, but has
>> it's problems. If you do, for example
>>
>> i helo C-b k C-/ C-/
>>
>> We get an error from the undo system.
>>
>> primitive-undo: Unrecognized entry in undo list viper
>
> not in  25.0.50
> viper worked fine with this for 20 years and I'd say it is Emacs breakage, not
> Viper's.

Okay, will check on that and see what has changed. I was surprised no
one had complained about it.


>> we should now already have the cons cell that represents the tail of the
>> buffer-undo-list.
>>
>> This is also quite a big change, and I worry about buffer compaction --
>> viper-old-buffer-undo-list would not be open for GC.
>
> Do you know who made the changes to the emacs undo list? Maybe complain to
> him?

Sadly, that would be me. This is the reason I am trying to fix a mode
that I don't use! Although, by the time I have finished this, maybe I
will know the keystrokes well enough that I will switch.

Phil






^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 22:41                 ` Phillip Lord
@ 2016-06-01 22:47                   ` Michael Kifer
  0 siblings, 0 replies; 54+ messages in thread
From: Michael Kifer @ 2016-06-01 22:47 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Stefan Monnier, Jim Meyering

[-- Attachment #1: Type: text/html, Size: 796 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 22:34               ` Michael Kifer
  2016-06-01 22:41                 ` Phillip Lord
@ 2016-06-02  0:11                 ` Stefan Monnier
  2016-06-02  8:45                   ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Stefan Monnier @ 2016-06-02  0:11 UTC (permalink / raw)
  To: Michael Kifer; +Cc: 22295, Jim Meyering, Phillip Lord

>> Oh dear. Yes, that is a problem. The difficulty is that viper modifies
>> the undo-list, removing boundaries only *after* we leave insert mode.

I don't see any difficulty in there.

>> Viper's solution of introducing a 'viper symbol is a nice one, but has
>> it's problems.

Agreed.

>> primitive-undo: Unrecognized entry in undo list viper
> not in  25.0.50 viper worked fine with this for 20 years and I'd say
> it is Emacs breakage, not Viper's.

FWIW, Viper adds an entry to buffer-undo-list which is incompatible with
the documented format of the entries, so while it worked, Viper was
doing something unkosher.

In any case it shouldn't be difficult to fix that problem.
E.g. you could use

    (defconst viper--undo-marker '(1 . 1))

instead of a symbol.

>> The deep problem here is that undo boundary == nil

I know you like to think of it as a problem ;-)

>> 1) Restore all the old viper code
>> 2) Instead of adding a 'viper mark, copy the buffer-undo-list to
>> "viper-old-buffer-undo-list".

Don't copy, just (setq viper--original-undo-list buffer-undo-list).

>> This is also quite a big change, and I worry about buffer compaction --
>> viper-old-buffer-undo-list would not be open for GC.

Why not?

This said, AFAIK the OP's problem may not be directly linked to the addition
of a special symbol in the undo-list.  We should first figure out what's
actually going wrong there.


        Stefan





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-02  0:11                 ` Stefan Monnier
@ 2016-06-02  8:45                   ` Phillip Lord
  0 siblings, 0 replies; 54+ messages in thread
From: Phillip Lord @ 2016-06-02  8:45 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Kifer, 22295, Jim Meyering

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>> Oh dear. Yes, that is a problem. The difficulty is that viper modifies
>>> the undo-list, removing boundaries only *after* we leave insert mode.
>
> I don't see any difficulty in there.

Sorry, "difficulty" in the sense that this is the cause of the different
behaviour.


>
>>> Viper's solution of introducing a 'viper symbol is a nice one, but has
>>> it's problems.
>
> Agreed.
>
>>> primitive-undo: Unrecognized entry in undo list viper
>> not in  25.0.50 viper worked fine with this for 20 years and I'd say
>> it is Emacs breakage, not Viper's.
>
> FWIW, Viper adds an entry to buffer-undo-list which is incompatible with
> the documented format of the entries, so while it worked, Viper was
> doing something unkosher.
>
> In any case it shouldn't be difficult to fix that problem.
> E.g. you could use
>
>     (defconst viper--undo-marker '(1 . 1))
>
> instead of a symbol.

I think that has the advantage of fulfilling the spec by putting what is
a nop in the undo.


>>> The deep problem here is that undo boundary == nil
>
> I know you like to think of it as a problem ;-)

It is. In my poking through Emacs, I have found several places where the
code say "remove the last undo-boundary which should be..." or "don't
remove undo-boundary which are explicit". But we have to guess which is
which.

Instead we could do:

(nil . :explicit)
(nil . :auto)
(nil . :timer)


>>> 1) Restore all the old viper code
>>> 2) Instead of adding a 'viper mark, copy the buffer-undo-list to
>>> "viper-old-buffer-undo-list".
>
> Don't copy, just (setq viper--original-undo-list buffer-undo-list).

Agreed; meant "copy the reference". Poor choice of words.

>
>>> This is also quite a big change, and I worry about buffer compaction --
>>> viper-old-buffer-undo-list would not be open for GC.
>
> Why not?

Oh, yes, you are correct. I was thinking of this as some sort of weak
reference, but actually, buffer-undo-list is specifically truncated by
GC. It wouldn't matter if there were a copy elsewhere.


> This said, AFAIK the OP's problem may not be directly linked to the addition
> of a special symbol in the undo-list.  We should first figure out what's
> actually going wrong there.


I will try and investigate again, but I am running out of ideas to test.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-01 22:23             ` Phillip Lord
  2016-06-01 22:34               ` Michael Kifer
@ 2016-06-10 17:05               ` Stefan Monnier
  2016-06-10 22:18                 ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Stefan Monnier @ 2016-06-10 17:05 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Jim Meyering, Michael Kifer

>> The old code seemed "simple" enough that the problem was probably
>> simple to fix (once identified).
> Well, most problems are simple to fix once you actually know what they
> are.

The problem seems to be the following: when you hit ESC, Viper will remove
boundaries from the undo-list, without making any changes to the buffer,
so the top-level loop won't add a boundary before the next command and
ends up hence "amalgamating" the next command with the previous one.

In the old code, we just always blindly added a boundary to
current-buffer before running a command, whereas now we only do so if
the buffer has been modified since the last time we pushed a boundary.

I think the patch below fixes the original problem.
Another way to fix it would be to change undo-auto--add-boundary so it
always considers (current-buffer) regardless of
undo-auto--undoably-changed-buffers.


        Stefan


diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 93cf3b0..ca52f98 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -1715,7 +1715,8 @@ viper-adjust-undo
       (let ((inhibit-quit t)
 	    tmp tmp2)
 	(setq viper-undo-needs-adjustment nil)
-	(if (listp buffer-undo-list)
+	(when (listp buffer-undo-list)
+	  (let ((had-boundary (null (car buffer-undo-list))))
 	    (if (setq tmp (memq viper-buffer-undo-list-mark buffer-undo-list))
 		(progn
 		  (setq tmp2 (cdr tmp)) ; the part after mark
@@ -1729,8 +1730,11 @@ viper-adjust-undo
 			(delq viper-buffer-undo-list-mark buffer-undo-list))
 		  ;; restore tail of buffer-undo-list
 		  (setq buffer-undo-list (nconc buffer-undo-list tmp2)))
-	      (setq buffer-undo-list (delq nil buffer-undo-list)))))
-    ))
+	      (setq buffer-undo-list (delq nil buffer-undo-list)))
+            ;; The top-level loop only adds boundaries if there has been
+            ;; modifications in the buffer, so make sure we don't accidentally
+            ;; drop the "final" boundary (bug#22295).
+	    (if had-boundary (undo-boundary)))))))
 
 
 (defun viper-set-complex-command-for-undo ()





^ permalink raw reply related	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-10 17:05               ` Stefan Monnier
@ 2016-06-10 22:18                 ` Phillip Lord
  2016-06-11  4:04                   ` Stefan Monnier
  2016-06-11  7:34                   ` Eli Zaretskii
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-06-10 22:18 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 22295, Jim Meyering, Michael Kifer

Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

>>> The old code seemed "simple" enough that the problem was probably
>>> simple to fix (once identified).
>> Well, most problems are simple to fix once you actually know what they
>> are.
>
> The problem seems to be the following: when you hit ESC, Viper will remove
> boundaries from the undo-list, without making any changes to the buffer,
> so the top-level loop won't add a boundary before the next command and
> ends up hence "amalgamating" the next command with the previous one.
>
> In the old code, we just always blindly added a boundary to
> current-buffer before running a command, whereas now we only do so if
> the buffer has been modified since the last time we pushed a boundary.
>
> I think the patch below fixes the original problem.
> Another way to fix it would be to change undo-auto--add-boundary so it
> always considers (current-buffer) regardless of
> undo-auto--undoably-changed-buffers.

Stefan

Many thanks for working this out -- I was going crazy trying to track
this down, and I was looking in the wrong place all along. 

I've tried your patch against emacs-25 (after reverting c0139e32f1f3b)
and it appears to work. The current behaviour of undo-auto--add-boundary
seems sensible to me; the difference in behaviour only shows up because
viper is manipulating the undo-list. I can try modifying u-a--a-b though
-- viper is, I am sure, not the only package to fiddle with undo.

I'd propose adding this to emacs-25. Eli, are you happy with this --- my
last fix appears to not work and Stefans approach is much more discrete.


As a separate issue, I'd like to add part of c0139e32f1f3b back
though to master -- adding the variable undo-auto-disable-boundaries.
It's not immediately necessary now, but it seems a useful option to
have.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-10 22:18                 ` Phillip Lord
@ 2016-06-11  4:04                   ` Stefan Monnier
  2016-06-13 12:36                     ` Phillip Lord
  2016-06-11  7:34                   ` Eli Zaretskii
  1 sibling, 1 reply; 54+ messages in thread
From: Stefan Monnier @ 2016-06-11  4:04 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, Jim Meyering, Michael Kifer

> As a separate issue, I'd like to add part of c0139e32f1f3b back
> though to master -- adding the variable undo-auto-disable-boundaries.
> It's not immediately necessary now, but it seems a useful option to
> have.

FWIW, I'd rather not have such an option.

It's seeing this option which made me look further into your patch,
since it seemed like using such a thing would inevitably lead
to trouble.


        Stefan





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-10 22:18                 ` Phillip Lord
  2016-06-11  4:04                   ` Stefan Monnier
@ 2016-06-11  7:34                   ` Eli Zaretskii
  2016-06-13 12:37                     ` Phillip Lord
  1 sibling, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2016-06-11  7:34 UTC (permalink / raw)
  To: Phillip Lord; +Cc: kifer, 22295, monnier, jim

> From: phillip.lord@russet.org.uk (Phillip Lord)
> Cc: 22295@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>,  Jim Meyering <jim@meyering.net>,  Michael Kifer <kifer@cs.stonybrook.edu>
> Date: Fri, 10 Jun 2016 23:18:29 +0100
> 
> I'd propose adding this to emacs-25. Eli, are you happy with this --- my
> last fix appears to not work and Stefans approach is much more discrete.

Yes, thanks.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-11  4:04                   ` Stefan Monnier
@ 2016-06-13 12:36                     ` Phillip Lord
  0 siblings, 0 replies; 54+ messages in thread
From: Phillip Lord @ 2016-06-13 12:36 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 22295, Jim Meyering, Michael Kifer

Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

>> As a separate issue, I'd like to add part of c0139e32f1f3b back
>> though to master -- adding the variable undo-auto-disable-boundaries.
>> It's not immediately necessary now, but it seems a useful option to
>> have.
>
> FWIW, I'd rather not have such an option.
>
> It's seeing this option which made me look further into your patch,
> since it seemed like using such a thing would inevitably lead
> to trouble.

No worries, I will leave this out.

Phil





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-11  7:34                   ` Eli Zaretskii
@ 2016-06-13 12:37                     ` Phillip Lord
  2016-06-13 13:06                       ` Stefan Monnier
  2016-06-15  5:24                       ` Michael Kifer
  0 siblings, 2 replies; 54+ messages in thread
From: Phillip Lord @ 2016-06-13 12:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kifer, 22295, monnier, jim

Eli Zaretskii <eliz@gnu.org> writes:

>> From: phillip.lord@russet.org.uk (Phillip Lord)
>> Cc: 22295@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, Jim Meyering
>> <jim@meyering.net>, Michael Kifer <kifer@cs.stonybrook.edu>
>> Date: Fri, 10 Jun 2016 23:18:29 +0100
>> 
>> I'd propose adding this to emacs-25. Eli, are you happy with this --- my
>> last fix appears to not work and Stefans approach is much more discrete.
>
> Yes, thanks.

This has been added to Emacs-25. Everyone happy for me to close?






^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-13 12:37                     ` Phillip Lord
@ 2016-06-13 13:06                       ` Stefan Monnier
  2016-06-15  4:40                         ` Jim Meyering
  2016-06-15  5:24                       ` Michael Kifer
  1 sibling, 1 reply; 54+ messages in thread
From: Stefan Monnier @ 2016-06-13 13:06 UTC (permalink / raw)
  To: Phillip Lord; +Cc: 22295, jim, kifer

> This has been added to Emacs-25. Everyone happy for me to close?

Fine by me,


        Stefan





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-13 13:06                       ` Stefan Monnier
@ 2016-06-15  4:40                         ` Jim Meyering
  0 siblings, 0 replies; 54+ messages in thread
From: Jim Meyering @ 2016-06-15  4:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 22295, Michael Kifer, Phillip Lord

On Mon, Jun 13, 2016 at 6:06 AM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
>> This has been added to Emacs-25. Everyone happy for me to close?
>
> Fine by me,

Same here. Thanks for all the work.





^ permalink raw reply	[flat|nested] 54+ messages in thread

* bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14
  2016-06-13 12:37                     ` Phillip Lord
  2016-06-13 13:06                       ` Stefan Monnier
@ 2016-06-15  5:24                       ` Michael Kifer
  1 sibling, 0 replies; 54+ messages in thread
From: Michael Kifer @ 2016-06-15  5:24 UTC (permalink / raw)
  To: Phillip Lord, Eli Zaretskii; +Cc: 22295, monnier, jim



On 06/13/2016 08:37 AM, Phillip Lord wrote:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: phillip.lord@russet.org.uk (Phillip Lord)
>>> Cc: 22295@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, Jim Meyering
>>> <jim@meyering.net>, Michael Kifer <kifer@cs.stonybrook.edu>
>>> Date: Fri, 10 Jun 2016 23:18:29 +0100
>>>
>>> I'd propose adding this to emacs-25. Eli, are you happy with this --- my
>>> last fix appears to not work and Stefans approach is much more discrete.
>> Yes, thanks.
> This has been added to Emacs-25. Everyone happy for me to close?
>

Yes, thank you!

--

        --- michael







^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2016-06-15  5:24 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-03  4:01 bug#22295: viper-mode undo bug introduced between Nov 10 and Nov 14 Jim Meyering
2016-05-14  9:25 ` Eli Zaretskii
2016-05-14 10:01   ` Eli Zaretskii
2016-05-14 13:57     ` Phillip Lord
2016-05-14 20:10       ` Michael Kifer
2016-05-14 20:39         ` Phillip Lord
2016-05-14 20:50           ` Michael Kifer
2016-05-16  9:50             ` Phillip Lord
2016-05-17  3:38               ` Michael Kifer
2016-05-17  8:52                 ` Phillip Lord
2016-05-17 13:58                   ` Michael Kifer
2016-05-15  8:06           ` Michael Albinus
2016-05-16 12:37             ` Phillip Lord
2016-05-16 17:06               ` Michael Kifer
2016-05-16  2:31       ` Jim Meyering
2016-05-16 12:41         ` Phillip Lord
2016-05-16 15:39           ` Jim Meyering
2016-05-16 16:34             ` Eli Zaretskii
2016-05-16 17:14               ` Michael Kifer
2016-05-16 17:41                 ` Eli Zaretskii
2016-05-17  8:48                   ` Phillip Lord
2016-05-17  8:46                 ` Phillip Lord
2016-05-17 14:05                   ` Michael Kifer
2016-05-17 22:35                     ` Phillip Lord
2016-05-17  8:25               ` Phillip Lord
2016-05-17  8:35             ` Phillip Lord
     [not found]               ` <CA+8g5KG=XBCc8U3u3D=+bh74sMLAH9R7ZUZ=SeQL9de=WQ71vQ@mail.gmail.com>
2016-05-18  9:15                 ` Phillip Lord
2016-05-18 15:58                   ` Jim Meyering
2016-05-18 21:42                     ` Phillip Lord
2016-05-19  1:09                       ` Jim Meyering
2016-05-20 10:00                         ` Eli Zaretskii
2016-05-20 11:46                           ` Phillip Lord
2016-05-20 13:32                             ` Eli Zaretskii
2016-05-23  6:45                           ` John Wiegley
2016-05-23 13:23                             ` Phillip Lord
2016-05-24 15:43                               ` Eli Zaretskii
2016-05-25 12:43                                 ` Phillip Lord
2016-05-25 16:28                                   ` Eli Zaretskii
2016-06-01 13:06           ` Stefan Monnier
2016-06-01 22:23             ` Phillip Lord
2016-06-01 22:34               ` Michael Kifer
2016-06-01 22:41                 ` Phillip Lord
2016-06-01 22:47                   ` Michael Kifer
2016-06-02  0:11                 ` Stefan Monnier
2016-06-02  8:45                   ` Phillip Lord
2016-06-10 17:05               ` Stefan Monnier
2016-06-10 22:18                 ` Phillip Lord
2016-06-11  4:04                   ` Stefan Monnier
2016-06-13 12:36                     ` Phillip Lord
2016-06-11  7:34                   ` Eli Zaretskii
2016-06-13 12:37                     ` Phillip Lord
2016-06-13 13:06                       ` Stefan Monnier
2016-06-15  4:40                         ` Jim Meyering
2016-06-15  5:24                       ` Michael Kifer

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).