Завершение Zsh меню вызывает проблемы после zle reset-prompt
У меня есть следующий код в моем.zshrc:
TMOUT=1
TRAPALRM() { zle reset-prompt }
После запуска меню все пункты меню, кроме выделенного, исчезают после TRAPALRM
триггеры и когда я продолжаю навигацию в меню Zsh Segvaults через короткое время
Есть ли какое-то исправление или обходной путь для этого?
РЕДАКТИРОВАТЬ: zsh версия 5.0.2 на Linux Mint 17
РЕДАКТИРОВАТЬ: я наблюдаю то же самое на Zsh версии 5.0.7 на Gentoo
3 ответа
Я нашел этот обходной путь, чтобы в основном предотвратить вызов "reset-prompt" при выборе меню:
TRAPALRM() {
if [ "$WIDGET" != "complete-word" ]; then
zle reset-prompt
fi
}
Обратите внимание, что complete-word
может отличаться для вас; Я нашел это с echo $WIDGET
в TRAPALRM
вызов.
Мое решение этой проблемы состоит в том, чтобы проверить значения $WIDGET и $_lastcomp[insert], чтобы узнать, активен ли в данный момент выбор меню в данный момент.
autoload -U is-at-least
TMOUT=1
if is-at-least 5.1; then
# avoid menuselect to be cleared by reset-prompt
redraw_tmout() {
[ "$WIDGET" = "expand-or-complete" ] && [[ "$_lastcomp[insert]" =~ "^automenu$|^menu:" ]] || zle reset-prompt
}
else
# evaluating $WIDGET in TMOUT may crash :(
redraw_tmout() { zle reset-prompt }
fi
TRAPALRM() { redraw_tmout }
"Расширить или завершить" может быть "полным словом" или чем-то другим, в зависимости от привязки клавиш к клавише табуляции. Это может быть проверено bindkey "^I"
команда.
Обходной путь, который позволяет вамreset-prompt
во всех ситуациях — вообще не использовать прерывания. Я хотел, чтобы ctrl-c очистил командную строку; в.zshrc
:
function _clear-line {
zle -K viins
zle reset-prompt
zle kill-whole-line
}
zle -N _clear-line
precmd() {
# Bind ctrl-b to the interrupt signal.
stty intr \^b
bindkey '^C' _clear-line
bindkey -M vicmd '^C' _clear-line
# Optionally, react differently from inside menuselect :
#bindkey -M menuselect '^C' undo
}
preexec() {
# Restore the ctrl-c binding.
stty intr \^c
}
Вам нужно будет узнать, какstty
вызывает ваш сигнал ALRM, чтобы адаптировать его к вашему варианту использования.