在zle reset-prompt之后,Zsh菜单完成会导致问题

时间:2014-10-23 10:30:32

标签: linux shell segmentation-fault zsh sigsegv

我的.zshrc中有以下代码:

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

触发菜单完成后,菜单中的所有项目除了突出显示的项目都会在TRAPALRM触发后消失,并且我会在短时间内继续在菜单zsh segvaults中导航

是否有任何修复或解决方法?

编辑:Linux Mint 17上的zsh版本是5.0.2

编辑:我在Gentoo上的zsh版本5.0.7上观察到同样的事情

2 个答案:

答案 0 :(得分:12)

我发现这个解决方法,基本上阻止在菜单选择中调用“reset-prompt”:

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

请注意,complete-word可能与您有所不同;我在echo $WIDGET电话中找到了TRAPALRM

答案 1 :(得分: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 }

"扩展或完成"可能是"完整的词"或者某种东西,基于对Tab键的键绑定。可以通过bindkey "^I"命令检查它。