2014-10-23 3 views
5

У меня следующий код в моем .zshrc:завершение меню Zsh вызывает проблемы после ZLE сброса-подсказки

TMOUT=1 
TRAPALRM() { zle reset-prompt } 

После запуска завершения меню все элементы из меню, за исключением выделенного один исчезает после TRAPALRM триггеров и, когда я держать навигации в меню zsh segvaults через короткое время

Есть ли какое-либо исправление или обходное решение для этого?

EDIT: ЗШ версия 5.0.2 на Linux Mint 17

EDIT: я наблюдать то же самое на ЗШ версии 5.0.7 на Gentoo

+0

Какую версию zsh вы используете? Я могу подтвердить, что элементы с удалением выбранного исчезают, но только если выбрано что-либо (zsh 5.0.5 на Ubuntu 14.04 и zsh 5.0.7 на Arch, оба amd64). Но я не получаю ошибки сегментации, даже если я продолжаю нажимать Tab. Таким образом, эти две вещи могут быть не такими тесно связанными. – Adaephon

+1

Запуск в этом, а также. Есть ли способ обновить экран без очистки элементов завершения? Кажется, что ошибка - почему элементы завершения будут очищены от просмотра, но все же можно выбрать? –

ответ

5

Я нашел обходной путь, чтобы в основном предотвратить вызова «reset- подскажите», когда в меню выбора:

TRAPALRM() { 
    if [ "$WIDGET" != "complete-word" ]; then 
     zle reset-prompt 
    fi 
} 

Обратите внимание, что complete-word может отличаться для вас; Я нашел его с echo $WIDGET в вызове TRAPALRM.

+0

Это похоже на мой обходной путь для этого, который должен был сделать новый виджет для каждого виджета завершения, который отключает TRAPALRM, вызывает этот виджет завершения и снова включает TRAPALRM, но это решение кажется более простым и чистым. – Ryba

+0

Кажется, это производит segfault на zsh 5.0.5 - пока он работает безупречно с 5.0.7. – Drasill

0

Мое решение для этой проблемы - проверить значения $ 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".

Смежные вопросы