Чтобы вставить все, кроме первого слова предыдущей записи истории, вы можете определить пользовательский виджет, например:
insert-last-words() {
emulate -L zsh
set -o extendedglob # for the # wildcard operator
local direction
case $WIDGET in
(*-reverse) direction=-1;;
(*) direction=1;;
esac
if [[ ${WIDGET%-reverse} = ${LASTWIDGET%-reverse} ]]; then
# subsequent invocations go further back in history like
# insert-last-word
(($+INSERT_LAST_WORDS_SKIP_UNDO)) ||
NUMERIC=1 zle undo # previous invocation
# we honour $NUMERIC for Alt+4 Alt+/ to go back 4 in history
((INSERT_LAST_WORDS_INDEX += ${NUMERIC-1} * direction))
else
# head of history upon first invocation
INSERT_LAST_WORDS_INDEX=0
fi
unset INSERT_LAST_WORDS_SKIP_UNDO
local lastwords
local cmd=${history:$INSERT_LAST_WORDS_INDEX:1}
# cmdline split according to zsh tokenisation rules
lastwords=(${(z)cmd})
if (($#lastwords <= 1)); then
# return failure (causing beep or visual indication) when the
# corresponding cmd had no arguments. We also need to remember
# not to undo next time.
INSERT_LAST_WORDS_SKIP_UNDO=1
return 1
fi
# remove first word (preserving spacing between the remaining
# words).
cmd=${cmd##[[:space:]]#$lastwords[1][[:space:]]#}
LBUFFER+=$cmd
}
zle -N insert-last-words
zle -N insert-last-words-reverse insert-last-words
bindkey '\e/' insert-last-words
bindkey '\e\\' insert-last-words-reverse