about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2011-11-04 14:31:23 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2011-11-04 14:31:23 +0000
commita6e039e12e5b9e480b876971ff644c3180efb2bc (patch)
treea6f25cf495e08c034b265354d3415a44827741a7 /Functions
parent45faf8f5b2758a638e0958928262ca9d26980885 (diff)
downloadzsh-a6e039e12e5b9e480b876971ff644c3180efb2bc.tar.gz
zsh-a6e039e12e5b9e480b876971ff644c3180efb2bc.tar.xz
zsh-a6e039e12e5b9e480b876971ff644c3180efb2bc.zip
29892: fix regular expression replacements in replace-string
improve variable save and restore in read-from-minibuffer
Diffstat (limited to 'Functions')
-rw-r--r--Functions/Zle/read-from-minibuffer35
-rw-r--r--Functions/Zle/replace-string-again6
2 files changed, 15 insertions, 26 deletions
diff --git a/Functions/Zle/read-from-minibuffer b/Functions/Zle/read-from-minibuffer
index fce6b5319..57e926884 100644
--- a/Functions/Zle/read-from-minibuffer
+++ b/Functions/Zle/read-from-minibuffer
@@ -19,26 +19,19 @@ while getopts "k:" opt; do
 done
 (( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
 
+local readprompt="$1" lbuf_init="$2" rbuf_init="$3"
+
+# Use anonymous function to make sure special values get restored,
+# even if this function is called as a widget.
+# local +h ensures special parameters stay special.
+() {
   local pretext="$PREDISPLAY$LBUFFER$RBUFFER$POSTDISPLAY
 "
-# We could use the local variables mechanism to save these
-# values, but if read-from-minibuffer is called as a widget
-# (which isn't actually all that useful) the values won't be
-# restored because the variables are already local at the current
-# level and don't get restored when they go out of scope.
-# We could do it with an additional function level.
-  local save_lbuffer=$LBUFFER
-  local save_rbuffer=$RBUFFER
-  local save_predisplay=$PREDISPLAY
-  local save_postdisplay=$POSTDISPLAY
-  local -a save_region_highlight
-  save_region_highlight=("${region_highlight[@]}")
-
-{
-  LBUFFER="$2"
-  RBUFFER="$3"
-  PREDISPLAY="$pretext${1:-? }"
-  POSTDISPLAY=
+  local +h LBUFFER="$lbuf_init"
+  local +h RBUFFER="$rbuf_init"
+  local +h PREDISPLAY="$pretext${readprompt:-? }"
+  local +h POSTDISPLAY=
+  local +h -a region_highlight
   region_highlight=("P${#pretext} ${#PREDISPLAY} bold")
 
   if [[ -n $keys ]]; then
@@ -50,12 +43,6 @@ done
     stat=$?
     (( stat )) || REPLY=$BUFFER
   fi
-} always {
-  LBUFFER=$save_lbuffer
-  RBUFFER=$save_rbuffer
-  PREDISPLAY=$save_predisplay
-  POSTDISPLAY=$save_postdisplay
-  region_highlight=("${save_region_highlight[@]}")
 }
 
 return $stat
diff --git a/Functions/Zle/replace-string-again b/Functions/Zle/replace-string-again
index f24c14f88..dac3db755 100644
--- a/Functions/Zle/replace-string-again
+++ b/Functions/Zle/replace-string-again
@@ -40,8 +40,10 @@ if [[ $curwidget = *(pattern|regex)* ]]; then
     rep2+=$rep
     if [[ $curwidget = *regex* ]]; then
       autoload -Uz regexp-replace
-      regexp-replace LBUFFER $_replace_string_src $rep2 || return 1
-      regexp-replace RBUFFER $_replace_string_src $rep2 || return 1
+      integer ret=1
+      regexp-replace LBUFFER $_replace_string_src $rep2 && ret=0
+      regexp-replace RBUFFER $_replace_string_src $rep2 && ret=0
+      return ret
     else
       LBUFFER=${LBUFFER//(#bm)$~_replace_string_src/${(e)rep2}}
       RBUFFER=${RBUFFER//(#bm)$~_replace_string_src/${(e)rep2}}