summaryrefslogtreecommitdiff
path: root/lisp/emulation
diff options
context:
space:
mode:
authorPhillip Lord <phillip.lord@russet.org.uk>2016-05-21 10:06:12 +0100
committerPhillip Lord <phillip.lord@russet.org.uk>2016-05-23 09:12:49 +0100
commitc0139e32f1f3bb287b04e02a69a7848d6a040003 (patch)
treebb3f6f0038516f4ef0a41b6c49497c9f5070aa4c /lisp/emulation
parent920d76c2084f0621dec8664840dd3fb2e9b34891 (diff)
downloademacs-c0139e32f1f3bb287b04e02a69a7848d6a040003.tar.gz
emacs-c0139e32f1f3bb287b04e02a69a7848d6a040003.tar.bz2
emacs-c0139e32f1f3bb287b04e02a69a7848d6a040003.zip
Fix viper undo breakage from undo-boundary changes
* lisp/simple.el (undo-auto-disable-boundaries): New variable * lisp/emulation/viper-init.el (viper-undo-in-complex-command, viper-undo-needs-adjustment): Rename variable to reflect new purpose, (viper-buffer-undo-list-mark): Remove * lisp/emulation/viper-cmd.el (viper-set-complex-command-for-undo): Add undo using `undo-boundary', disable default undo-boundary addition. * lisp/emulation/viper-cmd.el (viper-complete-complex-command-for-undo,viper-adjust-undo): Change function name, remove old undo list manipulation. * lisp/emulation/viper-cmd.el (viper-undo,viper-repeat, viper-change-state-to-vi,viper-change-state): Update for function name change. Addresses Bug #22295
Diffstat (limited to 'lisp/emulation')
-rw-r--r--lisp/emulation/viper-cmd.el43
-rw-r--r--lisp/emulation/viper-init.el9
2 files changed, 14 insertions, 38 deletions
diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 93cf3b0fb10..6b8fa46362d 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -631,7 +631,7 @@
(viper-over-whitespace-line))
(indent-to-left-margin))
(viper-add-newline-at-eob-if-necessary)
- (viper-adjust-undo)
+ (viper-complete-complex-command-for-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-adjust-undo) ; take care of undo
+ (viper-complete-complex-command-for-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,6 +1671,7 @@ invokes the command before that, etc."
(undo-start)
(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)
@@ -1710,37 +1711,17 @@ 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-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-complete-complex-command-for-undo ()
+ (setq undo-auto-disable-boundaries nil)
+ (setq viper-undo-in-complex-command nil)
+ (undo-boundary))
(defun viper-set-complex-command-for-undo ()
- (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)))))
-
+ (when (not viper-undo-in-complex-command)
+ (setq undo-auto-disable-boundaries t)
+ (setq viper-undo-in-complex-command t)
+ (undo-boundary)))
;;; Viper's destructive Command ring utilities
@@ -2604,7 +2585,7 @@ These keys are ESC, RET, and LineFeed."
(delete-char 1 t)
(insert char))
- (viper-adjust-undo)
+ (viper-complete-complex-command-for-undo)
(backward-char arg)
))
diff --git a/lisp/emulation/viper-init.el b/lisp/emulation/viper-init.el
index 104245b7571..c1e76629477 100644
--- a/lisp/emulation/viper-init.el
+++ b/lisp/emulation/viper-init.el
@@ -370,13 +370,8 @@ 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-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)
+(viper-deflocalvar viper-undo-in-complex-command nil)
+(put 'viper-undo-in-complex-command 'permanent-local t)
(defcustom viper-keep-point-on-undo nil
"Non-nil means not to move point while undoing commands.