Auto Start Zellij Session

需求

我想在进入 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

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注