1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-02 22:11:54 +02:00

32866: new replace-argument ZLE function.

Also a couple of read-from-minibuffer fixes: don't pass numeric
argument to recursive edit, and hide the minibuffer edit from
the undo history.
This commit is contained in:
Peter Stephenson 2014-07-17 09:45:46 +01:00
parent 7d5db0d277
commit 4e54648add
4 changed files with 89 additions and 0 deletions

View file

@ -1,3 +1,12 @@
2014-07-17 Peter Stephenson <p.stephenson@samsung.com>
* 32866 (plus extra undo fix in read-from-minibuffer):
Doc/Zsh/contrib.yo, Functions/Zle/read-from-minibuffer,
Functions/Zle/replace-argument: new replace-argument function;
fixes in read-from-minibuffer not to pass through numeric
argument to recursive edit and to hide minibuffer edit from
undo history.
2014-07-08 Peter Stephenson <p.stephenson@samsung.com>
* Dominic Hopf: 32837: Config/defs.mk.in: improve handling of

View file

@ -2328,6 +2328,31 @@ The name is a slight misnomer, as in fact the shell's own minibuffer is
not used. Hence it is still possible to call tt(executed-named-cmd) and
similar functions while reading a value.
)
tindex(replace-argument)
tindex(replace-argument-edit)
item(tt(replace-argument), tt(replace-argument-edit))
(
The function tt(replace-argument) can be used to replace a command
line argument in the current command line or, if the current command
line is empty, in the last command line executed (the new command line
is not executed). Arguments are as delimited by standard shell syntax,
If a numeric argument is given, that specifies the argument to be
replaced. 0 means the command name, as in history expansion.
If no numeric argument is given, the current argument is replaced;
this is the last argument if the previous history line is being used.
The function prompts for a replacement argument.
If the widget contains the string tt(edit), for example is defined as
example(zle -N replace-argument-edit replace-argument)
then the function presents the current value of the argument for
editing, otherwise the editing buffer for the replacement is
initially empty.
)
tindex(replace-string)
tindex(replace-string-again)
tindex(replace-pattern)

View file

@ -20,7 +20,9 @@ done
(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
local readprompt="$1" lbuf_init="$2" rbuf_init="$3"
integer changeno=$UNDO_CHANGE_NO
{
# 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.
@ -39,10 +41,17 @@ local readprompt="$1" lbuf_init="$2" rbuf_init="$3"
read -k $keys
stat=$?
else
local NUMERIC
unset NUMERIC
zle recursive-edit -K main
stat=$?
(( stat )) || REPLY=$BUFFER
fi
}
} always {
# 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
}
return $stat

View file

@ -0,0 +1,46 @@
# Replace an argument to a command, delimited by normal shell syntax.
# Prompts for the replacement.
# With no numeric argument, replace the current argument.
# With a numeric argument, replace that argument: 0 = command word,
# as in history expansion.
# If editing buffer is empty, use previous history line.
autoload -Uz split-shell-arguments read-from-minibuffer
if (( ${#BUFFER} == 0 )); then
(( HISTNO-- ))
CURSOR=${#BUFFER}
fi
local widget=$WIDGET
integer numeric cursor=CURSOR
if (( ${+NUMERIC} )); then
numeric=$NUMERIC
else
numeric=-1
fi
local reply REPLY REPLY2
integer index
split-shell-arguments
if (( numeric >= 0 )); then
index=$(( 2 + 2*numeric ))
else
index=$((REPLY & ~1 ))
fi
local edit
if [[ $widget = *edit* ]]; then
edit=$reply[$index]
fi
read-from-minibuffer "Replace $reply[$index] with: " $edit || return 1
integer diff=$(( ${#REPLY} - ${#reply[$index]} ))
reply[$index]=$REPLY
BUFFER=${(j..)reply}
if (( cursor > REPLY2 )); then
(( CURSOR = cursor + diff ))
else
(( CURSOR = REPLY2 ))
fi