mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
users/15759 for send-invisible
This commit is contained in:
parent
bc71ffe6c9
commit
d5e53b0077
2 changed files with 86 additions and 0 deletions
|
@ -33,6 +33,7 @@ read-from-minibuffer
|
|||
replace-string
|
||||
replace-string-again
|
||||
select-word-style
|
||||
send-invisible
|
||||
smart-insert-last-word
|
||||
split-shell-arguments
|
||||
transpose-lines
|
||||
|
|
85
Functions/Zle/send-invisible
Normal file
85
Functions/Zle/send-invisible
Normal file
|
@ -0,0 +1,85 @@
|
|||
#autoload
|
||||
|
||||
# send-invisible reads a line from the terminal, displaying an
|
||||
# asterisk for each character typed. It stores the line in the
|
||||
# global variable INVISIBLE, and when finished reading, inserts
|
||||
# the string ${INVISIBLE} into the original command buffer.
|
||||
|
||||
# If one argument is given, it is the prompt. The default is
|
||||
# "Non-echoed text: "
|
||||
|
||||
# If two or three arguments are given, they form the prefix and
|
||||
# suffix of the inserted INVISIBLE. Defaults are '${' and '}'
|
||||
# but these can be replaced, for example with '"${' and '}"' to
|
||||
# enclose the whole word in double quotes, or '${(z)' and '}' to
|
||||
# split the value of $INVISIBLE like the shell parser.
|
||||
|
||||
# To use:
|
||||
# autoload -Uz send-invisible
|
||||
# zle -N send-invisible
|
||||
# bindkey '^X ' send-invisible
|
||||
# Or more elaborately:
|
||||
# hidden-command() { send-invisible '% ' '${(z)' '}' }
|
||||
# zle -N hidden-command
|
||||
# bindkey '^X%' hidden-command
|
||||
|
||||
# Shamelessly cribbed from read-from-minibuffer.
|
||||
|
||||
emulate -L zsh
|
||||
|
||||
# Hide the value of INVISIBLE in any output of set and typeset
|
||||
typeset -g -H INVISIBLE=
|
||||
|
||||
local pretext="$PREDISPLAY$LBUFFER$RBUFFER$POSTDISPLAY"$'\n'
|
||||
|
||||
# Can't directly make these locals because send-invisible is
|
||||
# called as a widget, so these special variables are already
|
||||
# local at the current level and wouldn't get restored
|
||||
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[@]}")
|
||||
|
||||
{
|
||||
local lb rb opn=${2:-'${'} cls=${3:-'}'}
|
||||
LBUFFER=
|
||||
RBUFFER=
|
||||
PREDISPLAY="$pretext${1:-Non-echoed text: }"
|
||||
POSTDISPLAY=
|
||||
region_highlight=("P${(m)#pretext} ${(m)#PREDISPLAY} bold")
|
||||
|
||||
while zle -R && zle .read-command
|
||||
do
|
||||
# There are probably more commands that should go into
|
||||
# the first clause here to harmlessly beep, because ...
|
||||
case $REPLY in
|
||||
(send-invisible|run-help|undefined-key|where-is|which-command)
|
||||
zle .beep;;
|
||||
(push-*|send-break) INVISIBLE=;&
|
||||
(accept-*) break;;
|
||||
(*)
|
||||
LBUFFER=$lb
|
||||
RBUFFER=$rb
|
||||
zle $REPLY # ... this could expose something
|
||||
lb=$LBUFFER
|
||||
rb=$RBUFFER
|
||||
INVISIBLE=$BUFFER
|
||||
LBUFFER=${(l:$#LBUFFER::*:):-}
|
||||
RBUFFER=${(l:$#RBUFFER::*:):-}
|
||||
;;
|
||||
esac
|
||||
done
|
||||
} always {
|
||||
LBUFFER=$save_lbuffer
|
||||
RBUFFER=$save_rbuffer
|
||||
PREDISPLAY=$save_predisplay
|
||||
POSTDISPLAY=$save_postdisplay
|
||||
region_highlight=("${save_region_highlight[@]}")
|
||||
zle -R
|
||||
|
||||
# Now that the highlight has been restored with all the old
|
||||
# text and cursor positioning, insert the new text.
|
||||
LBUFFER+=${INVISIBLE:+${opn}INVISIBLE${cls}}
|
||||
}
|
Loading…
Reference in a new issue