diff options
-rw-r--r-- | Functions/Zle/history-search-end | 28 | ||||
-rw-r--r-- | Functions/Zle/predict-on | 64 |
2 files changed, 92 insertions, 0 deletions
diff --git a/Functions/Zle/history-search-end b/Functions/Zle/history-search-end new file mode 100644 index 000000000..24e7a0a87 --- /dev/null +++ b/Functions/Zle/history-search-end @@ -0,0 +1,28 @@ +# function history-search-end { +# +# This implements functions like history-beginning-search-{back,for}ward, +# but takes the cursor to the end of the line after moving in the +# history, like history-search-{back,for}ward. To use them: +# zle -N history-beginning-search-backward-end history-search-end +# zle -N history-beginning-search-forward-end history-search-end +# bindkey '...' history-beginning-search-backward-end +# bindkey '...' history-beginning-search-forward-end + +integer ocursor=$CURSOR + +if [[ $LASTWIDGET = history-beginning-search-*-end ]]; then + # Last widget called set $hbs_pos. + CURSOR=$hbs_pos +else + hbs_pos=$CURSOR +fi + +if zle .${WIDGET%-end}; then + # success, go to end of line + zle .end-of-line +else + # failure, restore position + CURSOR=$ocursor + return 1 +fi +# } diff --git a/Functions/Zle/predict-on b/Functions/Zle/predict-on new file mode 100644 index 000000000..07ce0703a --- /dev/null +++ b/Functions/Zle/predict-on @@ -0,0 +1,64 @@ +# 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 at the end +# behaves as normal --- though editing in the middle is liable to delete +# the rest of the line. +# +# To use it: +# autoload -U predict-on +# zle -N predict-on +# zle -N predict-off +# bindkey '...' predict-on +# bindkey '...' predict-off +# Note that all the functions are defined when you first call type the +# predict-on key, which means typing the predict-off key before that gives +# a harmless error message. + +predict-on() { + zle -N self-insert insert-and-predict + zle -N magic-space insert-and-predict + zle -N backward-delete-char delete-backward-and-predict +} +predict-off() { + 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 + zle .history-beginning-search-backward || RBUFFER="" + 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, + # and also set up forward deletions to turn off prediction. + LBUFFER="$LBUFFER[1,-2]" + fi + fi +} + +[[ -o kshautoload ]] || predict-on "$@" |