mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-27 18:21:10 +02:00
86 lines
2.7 KiB
Text
86 lines
2.7 KiB
Text
# This set of functions implements a sort of magic history searching.
|
|
# After predict-on, typing characters causes the editor to look backward
|
|
# in the history for the first line beginning with what you have typed so
|
|
# far. After predict-off, editing returns to normal for the line found.
|
|
# In fact, you often don't even need to use predict-off, because if the
|
|
# line doesn't match something in the history, adding a key performs
|
|
# standard completion --- though editing in the middle is liable to delete
|
|
# the rest of the line.
|
|
#
|
|
# The setting of compmatchers means that if you use the completion system,
|
|
# you should be able to type TAB at almost any point to advance the cursor
|
|
# to the next "interesting" character position (usually the end of the
|
|
# current word, but sometimes somewhere in the middle of the word). And
|
|
# of course as soon as the entire line is what you want, you can accept
|
|
# with RETURN, without needing to move the cursor to the end first.
|
|
#
|
|
# To use it:
|
|
# autoload -U predict-on
|
|
# zle -N predict-on
|
|
# zle -N predict-off
|
|
# bindkey '...' predict-on
|
|
# bindkey '...' predict-off
|
|
# Note that all functions are defined when you first type the predict-on
|
|
# key, which means typing the predict-off key before that gives a harmless
|
|
# error message.
|
|
|
|
predict-on() {
|
|
setopt localoptions unset noksharrays
|
|
zle -N self-insert insert-and-predict
|
|
zle -N magic-space insert-and-predict
|
|
zle -N backward-delete-char delete-backward-and-predict
|
|
zle -N delete-char-or-list delete-no-predict
|
|
}
|
|
predict-off() {
|
|
setopt localoptions unset noksharrays
|
|
zle -A .self-insert self-insert
|
|
zle -A .magic-space magic-space
|
|
zle -A .backward-delete-char backward-delete-char
|
|
}
|
|
insert-and-predict () {
|
|
emulate -L zsh
|
|
if [[ ${RBUFFER[1]} = ${KEYS[-1]} ]]
|
|
then
|
|
# same as what's typed, just move on
|
|
((++CURSOR))
|
|
else
|
|
LBUFFER="$LBUFFER$KEYS"
|
|
if [[ $LASTWIDGET == (self-insert|magic-space|backward-delete-char) ]]
|
|
then
|
|
if ! zle .history-beginning-search-backward
|
|
then
|
|
RBUFFER=""
|
|
if [[ ${KEYS[-1]} != ' ' ]]
|
|
then
|
|
integer curs=$CURSOR
|
|
zle complete-word
|
|
CURSOR=$curs
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
return 0
|
|
}
|
|
delete-backward-and-predict() {
|
|
emulate -L zsh
|
|
if [[ -n "$LBUFFER" ]]
|
|
then
|
|
# If the last widget was e.g. a motion, then probably the intent is
|
|
# to actually edit the line, not change the search prefix.
|
|
if [[ $LASTWIDGET == (self-insert|magic-space|backward-delete-char) ]]
|
|
then
|
|
((--CURSOR))
|
|
zle .history-beginning-search-forward || RBUFFER=""
|
|
return 0
|
|
else
|
|
# Depending on preference, you might call "predict-off" here.
|
|
LBUFFER="$LBUFFER[1,-2]"
|
|
fi
|
|
fi
|
|
}
|
|
delete-no-predict() {
|
|
predict-off
|
|
zle .$WIDGET "$@"
|
|
}
|
|
|
|
[[ -o kshautoload ]] || predict-on "$@"
|