[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-25 291fe0a 1/2: Revert "Fix viper undo breakage from

From: Phillip Lord
Subject: [Emacs-diffs] emacs-25 291fe0a 1/2: Revert "Fix viper undo breakage from undo-boundary changes"
Date: Sat, 11 Jun 2016 19:33:19 +0000 (UTC)

branch: emacs-25
commit 291fe0aade6560490abbe5c08d231c18edbb4737
Author: Phillip Lord <address@hidden>
Commit: Phillip Lord <address@hidden>

    Revert "Fix viper undo breakage from undo-boundary changes"
    This reverts commit c0139e32f1f3bb287b04e02a69a7848d6a040003.
 lisp/emulation/viper-cmd.el  |   43 ++++++++++++++++++++++++++++++------------
 lisp/emulation/viper-init.el |    9 +++++++--
 lisp/simple.el               |   23 +++++-----------------
 3 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 6b8fa46..93cf3b0 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -631,7 +631,7 @@
-    (viper-complete-complex-command-for-undo)
+    (viper-adjust-undo)
     (if (eq viper-current-state 'emacs-state)
        (viper-restore-cursor-color 'after-emacs-mode)
@@ -1570,7 +1570,7 @@ If the prefix argument ARG is non-nil, it is used instead 
of `val'."
        (if (and (eolp) (not (bolp)))
            (backward-char 1))
-  (viper-complete-complex-command-for-undo) ; take care of undo
+  (viper-adjust-undo) ; take care of undo
   ;; If the prev cmd was rotating the command ring, this means that `.' has
   ;; just executed a command from that ring.  So, push it on the ring again.
   ;; If we are just executing previous command , then don't push viper-d-com
@@ -1671,7 +1671,6 @@ invokes the command before that, etc."
     (undo-more 2)
-    (viper-complete-complex-command-for-undo)
     ;;(setq undo-beg-posn (or undo-beg-posn (point))
     ;;    undo-end-posn (or undo-end-posn (point)))
     ;;(setq undo-beg-posn (or undo-beg-posn before-undo-pt)
@@ -1711,17 +1710,37 @@ invokes the command before that, etc."
 ;; The following two functions are used to set up undo properly.
 ;; In VI, unlike Emacs, if you open a line, say, and add a bunch of lines,
 ;; they are undone all at once.
-(defun viper-complete-complex-command-for-undo ()
-  (setq undo-auto-disable-boundaries nil)
-  (setq viper-undo-in-complex-command nil)
-  (undo-boundary))
+(defun viper-adjust-undo ()
+  (if viper-undo-needs-adjustment
+      (let ((inhibit-quit t)
+           tmp tmp2)
+       (setq viper-undo-needs-adjustment nil)
+       (if (listp buffer-undo-list)
+           (if (setq tmp (memq viper-buffer-undo-list-mark buffer-undo-list))
+               (progn
+                 (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)))
+             (setq buffer-undo-list (delq nil buffer-undo-list)))))
+    ))
 (defun viper-set-complex-command-for-undo ()
-  (when (not viper-undo-in-complex-command)
-    (setq undo-auto-disable-boundaries t)
-    (setq viper-undo-in-complex-command t)
-    (undo-boundary)))
+  (if (listp buffer-undo-list)
+      (if (not viper-undo-needs-adjustment)
+         (let ((inhibit-quit t))
+           (setq buffer-undo-list
+                 (cons viper-buffer-undo-list-mark buffer-undo-list))
+           (setq viper-undo-needs-adjustment t)))))
 ;;; Viper's destructive Command ring utilities
@@ -2585,7 +2604,7 @@ These keys are ESC, RET, and LineFeed."
                (delete-char 1 t)
                (insert char))
-    (viper-complete-complex-command-for-undo)
+    (viper-adjust-undo)
     (backward-char arg)
diff --git a/lisp/emulation/viper-init.el b/lisp/emulation/viper-init.el
index c1e7662..104245b 100644
--- a/lisp/emulation/viper-init.el
+++ b/lisp/emulation/viper-init.el
@@ -370,8 +370,13 @@ Use `\\[viper-set-expert-level]' to change this.")
 ;; VI-style Undo
 ;; Used to 'undo' complex commands, such as replace and insert commands.
-(viper-deflocalvar viper-undo-in-complex-command nil)
-(put 'viper-undo-in-complex-command 'permanent-local t)
+(viper-deflocalvar viper-undo-needs-adjustment nil)
+(put 'viper-undo-needs-adjustment 'permanent-local t)
+;; A mark that Viper puts on buffer-undo-list.  Marks the beginning of a
+;; complex command that must be undone atomically.  If inserted, it is
+;; erased by viper-change-state-to-vi and viper-repeat.
+(defconst viper-buffer-undo-list-mark 'viper)
 (defcustom viper-keep-point-on-undo nil
   "Non-nil means not to move point while undoing commands.
diff --git a/lisp/simple.el b/lisp/simple.el
index e38bf70..b66827d 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2839,18 +2839,6 @@ buffers that were changed during the last command.")
 If set to non-nil, this will effectively disable the timer.")
-(defvar-local undo-auto-disable-boundaries nil
-  "Disable the automatic addition of boundaries.
-If set to non-nil, `undo-boundary' will not be called
-automatically in a buffer either at the end of a command, or as a
-result of `undo-auto-current-boundary-timer'.
-When this is set to non-nil, it is important to ensure that
-`undo-boundary' is called frequently enough. Failure to do so
-will result in user-visible warnings that the situation is
-probably a bug.")
 (defvar undo-auto--this-command-amalgamating nil
   "Non-nil if `this-command' should be amalgamated.
 This variable is set to nil by `undo-auto--boundaries' and is set
@@ -2890,8 +2878,7 @@ REASON describes the reason that the boundary is being 
added; see
   (dolist (b undo-auto--undoably-changed-buffers)
           (when (buffer-live-p b)
             (with-current-buffer b
-              (unless undo-auto-disable-boundaries
-                (undo-auto--ensure-boundary cause)))))
+              (undo-auto--ensure-boundary cause))))
   (setq undo-auto--undoably-changed-buffers nil))
 (defun undo-auto--boundary-timer ()
@@ -2916,10 +2903,10 @@ default values.")
   "Add an `undo-boundary' in appropriate buffers."
    (let ((amal undo-auto--this-command-amalgamating))
-     (setq undo-auto--this-command-amalgamating nil)
-     (if amal
-         'amalgamate
-       'command))))
+       (setq undo-auto--this-command-amalgamating nil)
+       (if amal
+           'amalgamate
+         'command))))
 (defun undo-auto-amalgamate ()
   "Amalgamate undo if necessary.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]