我有以下函数来使用 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 # ...
# ...
)
}