2016-03-02 05:58:57 +08:00
|
|
|
|
|
|
|
#--------------------------------------------------------------------#
|
|
|
|
# Match Previous Command Suggestion Strategy #
|
|
|
|
#--------------------------------------------------------------------#
|
|
|
|
# Suggests the most recent history item that matches the given
|
|
|
|
# prefix, and whose preceding history item also matches the most
|
|
|
|
# recently executed command.
|
|
|
|
#
|
|
|
|
# For example, if your have just executed:
|
|
|
|
# pwd
|
|
|
|
# ls foo
|
|
|
|
# ls bar
|
|
|
|
# pwd
|
|
|
|
# And then you start typing 'ls', then the suggestion will be 'ls foo',
|
|
|
|
# rather than 'ls bar', as your most recently executed command (pwd)
|
|
|
|
# was followed by 'ls foo' on it's previous invocation.
|
|
|
|
#
|
|
|
|
|
|
|
|
_zsh_autosuggest_strategy_match_prev_cmd() {
|
2016-03-05 10:22:19 +08:00
|
|
|
local prefix="$(_zsh_autosuggest_escape_command "$1")"
|
2016-03-02 05:58:57 +08:00
|
|
|
|
|
|
|
# Get all history event numbers that correspond to history
|
|
|
|
# entries that match pattern $prefix*
|
|
|
|
local history_match_keys
|
|
|
|
history_match_keys=(${(k)history[(R)$prefix*]})
|
|
|
|
|
|
|
|
# By default we use the first history number (most recent history entry)
|
|
|
|
local histkey="${history_match_keys[1]}"
|
|
|
|
|
|
|
|
# Get the previously executed command
|
|
|
|
local prev_cmd="$(_zsh_autosuggest_prev_command)"
|
2016-03-05 10:22:19 +08:00
|
|
|
prev_cmd="$(_zsh_autosuggest_escape_command $prev_cmd)"
|
2016-03-02 05:58:57 +08:00
|
|
|
|
|
|
|
# Iterate up to the first 200 history event numbers that match $prefix
|
|
|
|
for key in "${(@)history_match_keys[1,200]}"; do
|
|
|
|
# Stop if we ran out of history
|
|
|
|
[[ $key -gt 1 ]] || break
|
|
|
|
|
|
|
|
# See if the history entry preceding the suggestion matches the
|
|
|
|
# previous command, and use it if it does
|
|
|
|
if [[ "${history[$((key - 1))]}" == $prev_cmd ]]; then
|
|
|
|
histkey="$key"
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# Echo the matched history entry
|
|
|
|
echo -E "$history[$histkey]"
|
|
|
|
}
|
|
|
|
|