Может быть, что-то вроде:
accept-line() {
if [[ ${BUFFER//![\$!]} = *!* ]]; then
set -o histverify
else
set +o histverify
fi
zle.$WIDGET
}
zle -N accept-line
добавлен к вашему ~/.zshrc
как эвристика. То есть переопределить виджет accept-line
(, вызываемый при нажатии Enter ), чтобы он устанавливал параметр histverify
только в том случае, если после !
следует символ, отличный от !
и $
в текущей строке.
Это обман для командных строк, таких как echo '!e' !!
или \!!rm
, но кажется, что это должно быть приемлемым ограничением.
Лично я добавляю set +o banghist
к своему ~/.zshrc
и предпочитаю полагаться на history-search-backward
(, привязанный к Alt + p по умолчанию в режиме emacs
)или history-beginning-search-backward
(, который я привязываю к PageUp ), который экономит ввод текста и всегда дает мне визуальную обратную связь, прежде чем я приму команду.