需求
我想在进入 zsh 后自动调用 zellij。
实现
有一点要特别注意的是,由于我同时使用了 powerlevel10k,如果在 .zshrc 中配置命令,则会导致 Powerlevel10k 的 instant prompt P10K 警告:初始化阶段不允许有任何控制台输出(包括运行外部命令)。
因此,通过 .zprofile 来实现。区别在于:
.zshrc 是启动时运行的程序,而 .zprofile 是在登录 shell 启动时执行的,这样就不会干扰 P10K 的 instant prompt。
实现的逻辑为:
- 优先 attach 到名为 main 的 session(如果存在)。
- 如果没有 main,就 attach 最早创建的 session。
- 如果没有任何 session,就新建一个。
: ${ZSH_ZELLIJ_AUTOSTART:=true}
: ${ZSH_ZELLIJ_AUTOCONNECT:=true}
: ${ZSH_ZELLIJ_AUTOQUIT:=$ZSH_ZELLIJ_AUTOSTART}
: ${ZSH_ZELLIJ_DEFAULT_SESSION:=main} # 默认 session 名称
function _zsh_zellij_plugin_run() {
if [[ -n "$@" ]]; then
command zellij "$@"
return $?
fi
local -a zellij_cmd
zellij_cmd=(command zellij)
if [[ -z "$ZELLIJ" && "$ZSH_ZELLIJ_AUTOCONNECT" == true ]]; then
# 获取 session 列表(包含名称和时间)
local sessions
sessions=($(zellij list-sessions --short | awk '{print $1}'))
if [[ ${#sessions[@]} -gt 0 ]]; then
# 如果有默认 session,就优先 attach
if [[ " ${sessions[*]} " =~ " ${ZSH_ZELLIJ_DEFAULT_SESSION} " ]]; then
$zellij_cmd attach "$ZSH_ZELLIJ_DEFAULT_SESSION"
else
# 否则选最早的 session
local oldest_session
oldest_session=$(zellij list-sessions --short | sort -k3,3 | head -n1 | awk '{print $1}')
$zellij_cmd attach "$oldest_session"
fi
else
# 没有 session 则新建
if [[ -n "$ZSH_ZELLIJ_LAYOUT" ]]; then
zellij_cmd+=(-l "$ZSH_ZELLIJ_LAYOUT")
fi
if [[ -n "$ZSH_ZELLIJ_LAYOUT_PATH" ]]; then
zellij_cmd+=(--layout-path "$ZSH_ZELLIJ_LAYOUT_PATH")
fi
$zellij_cmd
fi
fi
if [[ -z "$ZELLIJ" && "$ZSH_ZELLIJ_AUTOQUIT" == true ]]; then
exit
fi
}
if [[ -z "$ZELLIJ" && "$ZSH_ZELLIJ_AUTOSTART" == "true" ]]; then
if [[ "$ZSH_ZELLIJ_AUTOSTARTED" != "true" ]]; then
export ZSH_ZELLIJ_AUTOSTARTED=true
_zsh_zellij_plugin_run
fi
fi

