linux zle reset-prompt后,Zsh菜单完成导致问题

e0uiprwp  于 2023-03-17  发布在  Linux
关注(0)|答案(3)|浏览(81)

我有以下代码在我的.zshrc:

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

触发菜单完成后,菜单中的所有项目(除了突出显示的项目)在TRAPALRM触发后消失,并且当我在菜单中继续导航时,zsh segvaults在短时间后消失
对此是否有任何修复或变通方案?
编辑:Linux Mint 17上的zsh版本为5.0.2
编辑:我在Gentoo上的zsh版本5.0.7上观察到同样的事情

jogvjijk

jogvjijk1#

我发现了这个变通方案,基本上可以防止在菜单选择时调用“reset-prompt”:

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

请注意,complete-word对您来说可能不同;我在TRAPALRM调用中用echo $WIDGET找到了它。

wpcxdonn

wpcxdonn2#

我对此问题的解决方案是同时检查$WIDGET和$_lastcomp[insert]值,以便更精确地了解menu-select此时是否处于活动状态。

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 }

“expand-or-complete”可能是“complete-word”或者其他什么,这取决于绑定到tab键的键,可以通过bindkey "^I"命令检查。

63lcw9qa

63lcw9qa3#

一个让你在所有情况下都能使用reset-prompt的变通方法是根本不使用中断。在.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信号,以使其适应您的用例。

相关问题