1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-09-28 15:01:21 +02:00

22559: add history-beginning-search-menu

This commit is contained in:
Peter Stephenson 2006-07-28 09:52:34 +00:00
parent 44e2e5979c
commit d88220042d
3 changed files with 117 additions and 0 deletions

@ -1,3 +1,8 @@
2006-07-28 Peter Stephenson <pws@csr.com>
* 22559: Doc/Zsh/contrib.yo,
Functions/Zle/history-beginning-search-menu: new Zle function.
2006-07-26 Peter Stephenson <pws@csr.com>
* 22558: Src/math.c: declaration after statement.

@ -605,6 +605,29 @@ zle -N history-beginning-search-forward-end \
bindkey '\e^P' history-beginning-search-backward-end
bindkey '\e^N' history-beginning-search-forward-end)
)
tindex(history-beginning-search-menu)
item(tt(history-beginning-search-menu))(
This function implements yet another form of history searching. The
text before the cursor is used to select lines from the history,
as for tt(history-beginning-search-backward) except that all matches are
shown in a numbered menu. Typing the appropriate digits inserts the
full history line. Note that leading zeroes must be typed (they are only
shown when necessary for removing ambiguity). The entire history is
searched; there is no distinction between forwards and backwards.
With a prefix argument, the search is not anchored to the start of
the line; the string typed by the use may appear anywhere in the line
in the history.
If the widget name contains `tt(-end)' the cursor is moved to the end of
the line inserted. If the widget name contains `tt(-space)' any space
in the text typed is treated as a wildcard and can match anything (hence
a leading space is equivalent to giving a prefix argument). Both
forms can be combined, for example:
example(zle -N history-beginning-search-menu-space-end \
history-beginning-search-menu)
)
tindex(history-pattern-search)
tindex(history-pattern-search-backward)
tindex(history-pattern-search-forward)

@ -0,0 +1,89 @@
# Menu-driven alternative to history-beginning-search-backward.
# As it uses a menu there is no sense of "forward" or "backward", however;
# the entire history is searched.
#
# Configuration:
# autoload -U history-beginning-search-menu
# zle -N history-beginning-search-menu
# bindkey '\eP' history-beginning-search-menu
#
# Example:
# % /bin/su<ESC-P>
# Enter digit:
# 1 /bin/su -c 'make install' 4 /bin/su - perforce
# 2 /bin/su 5 /bin/su -c
# 3 /bin/su -c 'chown pws:pws **/*(u0)'
#
# Typing "1" expands the line to
# % /bin/su -c 'make install'
#
# With a prefix argument, the search is not anchored to the beginning,
# so for example "/su" could expand to "p4 files //depot/support/..."
#
# If this is bound to a widget containing "-end", e.g.
# zle -N history-beginning-search-menu-end history-beginning-search-menu
# then the cursor is put at the end of the line, else it is left
# after the matched characters.
#
# If this is bound to a widget containing "-space", then any space in
# the line so far is matched as a wildcard. (This means putting a space
# at the start of the line is equivalent to specifying a prefix
# argument.)
emulate -L zsh
setopt extendedglob
zmodload -i zsh/parameter
local -aU matches
local -a display
local search=$LBUFFER
if [[ $WIDGET = *-space* ]]; then
search=${search//(#m)[*?#<>]/\\$MATCH/}
search=${search// /*}
fi
if (( ${+NUMERIC} )); then
matches=(${(o)history[(R)*${search}*]})
else
matches=(${(o)history[(R)${search}*]})
fi
# Filter out any match that's the same as the original.
# Note this isn't a pattern this time.
matches=(${matches:#${LBUFFER}})
integer n=${#matches}
integer width=${#n}
(( n == 0 )) && return 1
# Hey, this works...
integer i
display=(${matches/(#m)*/${(l.$width..0.):-$((++i))} $MATCH})
zle -R "Enter digit${${width##1}:+s}:" $display
local chars
read -k$width chars
if [[ $chars != [[:digit:]]## || $chars -eq 0 || $chars -gt $n ]]; then
return 1
fi
if [[ $WIDGET = *-end* ]]; then
LBUFFER=${matches[$chars]} RBUFFER=
else
integer newcursor
if (( ${+NUMERIC} )); then
# Advance cursor so that it's still after the string typed
local -a match mbegin mend
if [[ $matches[$chars] = (#b)(*${LBUFFER})* ]]; then
newcursor=${#match[1]}
fi
fi
BUFFER=${matches[$chars]}
(( newcursor )) && CURSOR=$newcursor
fi