Zsh zle 函数在“trap ‘zle reset-prompt’ EXIT”时发生段错误

Zsh zle 函数在“trap ‘zle reset-prompt’ EXIT”时发生段错误

我有以下函数来使用 fzf 选择 tmux 会话:

function tmx {
    [ -n "$ZLE_STATE" ] && trap 'zle reset-prompt' EXIT
    local tmux item
    tmux="$(which tmux)" || return $?
    if [ -z "$1" ] ; then
        # The 1st value is the query string.
        # The 2nd value is the selected, matched value, or empty if none.
        $tmux list-sessions -F '#{session_name}' |\
            fzf --header jump-to-session --print-query \
                --preview "$tmux capture-pane -ept {}" |\
            while read ; do  # Pick the last non-empty value.
                [ -n "$REPLY" ] && item="$REPLY"
            done
    else
        item="$1"
    fi
    [ -z "$item" ] && return 1
    (
        # Restore the standard std* file descriptors for tmux.
        # https://unix.stackexchange.com/a/512979/22339
        exec </dev/tty; exec <&1;
        if [ -z "$TMUX" ] ; then
            $tmux new-session -As "$item"
        else
            $tmux has-session -t "$item" || \
                $tmux new-session -ds "$item"
            $tmux switch-client -t "$item"
        fi
    )
}
zle -N tmx
bindkey "$(tput kf4)" tmx

当将该函数作为激活的 ZLE 小部件调用时,一旦我脱离选定的 tmux 会话,或者当我使用 Ctrl-C 中止 fzf 时,trap ... EXIT它通常会崩溃。Segmentation fault

看来罪魁祸首是trap 'zle reset-prompt' EXIT。当我注释掉这一行时,它工作正常。这是一个(已知的)ZSH 错误吗?还是我遗漏了一些重要的东西?


解决方法:这似乎可以解决这个问题:

function tmx {
    {
      # function body up to `exec` ...
    } always {
      zle reset-prompt
    }
    (
      exec # ...
      # ...
    )
}

相关内容