我有以下代码在我的.zshrc:
TMOUT=1 TRAPALRM() { zle reset-prompt }
触发菜单完成后,菜单中的所有项目(除了突出显示的项目)在TRAPALRM触发后消失,并且当我在菜单中继续导航时,zsh segvaults在短时间后消失对此是否有任何修复或变通方案?编辑:Linux Mint 17上的zsh版本为5.0.2编辑:我在Gentoo上的zsh版本5.0.7上观察到同样的事情
TRAPALRM
jogvjijk1#
我发现了这个变通方案,基本上可以防止在菜单选择时调用“reset-prompt”:
TRAPALRM() { if [ "$WIDGET" != "complete-word" ]; then zle reset-prompt fi }
请注意,complete-word对您来说可能不同;我在TRAPALRM调用中用echo $WIDGET找到了它。
complete-word
echo $WIDGET
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"命令检查。
bindkey "^I"
63lcw9qa3#
一个让你在所有情况下都能使用reset-prompt的变通方法是根本不使用中断。在.zshrc中:
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信号,以使其适应您的用例。
stty
3条答案
按热度按时间jogvjijk1#
我发现了这个变通方案,基本上可以防止在菜单选择时调用“reset-prompt”:
请注意,
complete-word
对您来说可能不同;我在TRAPALRM
调用中用echo $WIDGET
找到了它。wpcxdonn2#
我对此问题的解决方案是同时检查$WIDGET和$_lastcomp[insert]值,以便更精确地了解menu-select此时是否处于活动状态。
“expand-or-complete”可能是“complete-word”或者其他什么,这取决于绑定到tab键的键,可以通过
bindkey "^I"
命令检查。63lcw9qa3#
一个让你在所有情况下都能使用
reset-prompt
的变通方法是根本不使用中断。在.zshrc
中:您需要了解
stty
如何调用您的ALRM信号,以使其适应您的用例。