Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Undo is also confused with narrow-to-region



Peter wrote:
> 
> The example I've given shows an explicit save and restore.  It should
> also be possible to use the double function scope trick, though I didn't
> actually try.
> 
> I haven't imposed any arbitrary limits on the value in UNDO_LIMIT_NO as,
> on thinking about it, it seemed to create hostages to fortune for no
> obvious gain.

Thanks. Trying to apply this in read-from-minibuffer, I found that it
was necessary to add a split-undo in after the BUFFER etc were setup,
otherwise it was possible to do one initial undo. Also, I wonder if the
if condition should do a return 1 rather than break so that it beeps -
consistently with an undo that has reached the very first change. Or is
the setlastline() call needed?

Oliver
 
diff --git a/Functions/Zle/read-from-minibuffer b/Functions/Zle/read-from-minibuffer
index 8fec110..2b96a36 100644
--- a/Functions/Zle/read-from-minibuffer
+++ b/Functions/Zle/read-from-minibuffer
@@ -20,7 +20,7 @@ done
 (( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
 
 local readprompt="$1" lbuf_init="$2" rbuf_init="$3"
-integer changeno=$UNDO_CHANGE_NO
+integer savelim=$UNDO_LIMIT_NO changeno=$UNDO_CHANGE_NO
 
 {
 # Use anonymous function to make sure special values get restored,
@@ -43,6 +43,8 @@ integer changeno=$UNDO_CHANGE_NO
   else
     local NUMERIC
     unset NUMERIC
+    zle split-undo
+    UNDO_LIMIT_NO=$UNDO_CHANGE_NO
     zle recursive-edit -K main
     stat=$?
     (( stat )) || REPLY=$BUFFER
@@ -52,6 +54,7 @@ integer changeno=$UNDO_CHANGE_NO
   # This removes the edits relating to the read from the undo history.
   # These aren't useful once we get back to the main editing buffer.
   zle undo $changeno
+  UNDO_LIMIT_NO=save_limit
 }
 
 return $stat
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 198c0ba..8b55403 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -1587,7 +1587,7 @@ undo(char **args)
 	if (prev->changeno < last_change)
 	    break;
 	if (prev->changeno < undo_limitno && !*args)
-	    break;
+	    return 1;
 	if (unapplychange(prev))
 	    curchange = prev;
 	else



Messages sorted by: Reverse Date, Date, Thread, Author