Завершение 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, чтобы адаптировать его к вашему варианту использования.

Другие вопросы по тегам