青蛙小白
博客 / 2026/06

Zellij:把终端会话变成可复用的工作区

2026/06/16 · — 字 · 阅读约 — 分钟 ·
目录

如果已经习惯了 tmux,第一次看到 Zellij 时,很容易把它理解成“另一个终端复用器”。这个判断不算错,但不完整。Zellij 的官方定位是 terminal workspace,它当然能做 pane、tab、session 这些终端复用器的基本工作,但更明显的特点是:它试图把一个临时打开的终端会话,变成一个可以声明、恢复、脚本化控制、继续扩展的工作区。

本文不从“什么是终端”讲起,而是从一个更实际的问题切入:如果每天都要打开编辑器、启动开发服务器、看日志、跑测试,Zellij 能不能让这个工作区更稳定、更少依赖手工操作?

1. 为什么需要 Zellij?

终端复用器解决的核心问题一直很朴素:一个终端窗口不够用,一个 SSH 连接不够稳,一个项目也不只有一个命令。

tmux 的常见价值是:

  • 在一个窗口里拆分多个 pane。
  • 用 tab/window 组织不同任务。
  • 断开 SSH 后让远程任务继续跑。
  • 回到机器后重新 attach 到原来的 session。

Zellij 也覆盖这些能力,但它的默认体验更偏“可见”和“可发现”。启动后,底部状态栏会提示当前模式下可用的快捷键。对新用户来说,这比一开始背一整套 prefix key 更容易进入状态。

Zellij 真正有意思的地方,是它把终端工作区继续往前推了几步:

  • layout 可以用 KDL 文件声明 pane 和 tab 的布局。
  • CLI 可以从 session 内外控制 Zellij。
  • 插件系统基于 WebAssembly / WASI。
  • 默认 UI 本身也由插件组成。
  • 还提供 session resurrection、web client、多人协作等更高阶能力。

所以,与其把 Zellij 看成“更漂亮的 tmux”,不如把它看成“终端里的项目工作区管理器”。

2. 快速开始

安装 Zellij 最直接的方式通常是使用操作系统的软件包。macOS 用户如果使用 Homebrew,可以直接安装:

brew install zellij

如果系统包不方便,也可以从 GitHub release 下载预编译二进制文件。Zellij 每个 release 会提供 Linux、macOS 和 Windows 的 pre-built binaries。Linux / macOS 下载后可以先解压:

tar -xvf zellij*.tar.gz

确认二进制文件有执行权限:

chmod +x zellij

然后直接运行:

./zellij

如果希望在任意目录执行 zellij,可以把当前目录加入 $PATH,或者把 zellij 移动到已经在 $PATH 中的目录。比如放到 /usr/local/bin

sudo mv zellij /usr/local/bin/

如果机器上已经有 Rust 工具链,可以用 cargo-binstall 安装二进制包:

cargo binstall zellij

也可以直接从 crates.io 编译安装:

cargo install --locked zellij

启动方式很简单:

zellij

第一次进入 Zellij,不需要急着背快捷键。先看底部状态栏。Zellij 的快捷键是 mode-based 的:我们会在 normal、pane、tab、resize、scroll 等不同模式之间切换。底部提示会告诉我们当前模式能做什么。

对于终端熟手,可以先建立一个最小心智模型:

  • pane 是一个可拆分的终端区域。
  • tab 是一组 pane 的容器。
  • session 是可以 detach 和重新 attach 的工作现场。
  • mode 决定当前按键是在输入 shell,还是在控制 Zellij。
  • layout 是把这些结构写成文件的方式。

这个模型足够支撑日常使用。更细的 keybindings、theme、plugin 可以后面再慢慢改。

3. 从会话到工作区

如果只是临时拆几个 pane,Zellij 和 tmux 的区别不会特别大。session 开始有价值,是在我们把它和“项目”绑定起来之后。

比如给一个项目起一个固定 session 名字:

zellij --session dev

之后可以查看当前机器上的 session:

zellij list-sessions

也可以重新 attach 回去:

zellij attach dev

这类命令的价值在远程机器上尤其明显。SSH 断开后,session 仍然可以留在远端;重新登录后 attach 回原来的工作现场,就不用重新打开编辑器、日志和服务命令。

Zellij 还支持通过 CLI 控制正在运行的 session。比如在当前 session 里新开一个 pane:

zellij action new-pane

也可以指定 session:

zellij --session dev action new-pane

这意味着 Zellij 不只是一个交互式界面,也可以被脚本驱动。比如某个项目的启动脚本可以负责创建 session、打开 pane、执行准备命令,把原来靠手工点击和输入的启动流程收拢起来。

4. 用 Layout 固定项目启动方式

当一个项目每天都要以类似方式启动时,layout 是最值得优先学习的能力。

Zellij 的 layout 使用 KDL 格式。一个最小 layout 大概是这样:

layout {
    pane
    pane split_direction="vertical" {
        pane
        pane command="htop"
    }
}

这个例子会创建一个普通 pane,再创建一个纵向拆分的区域,其中一个 pane 跑默认 shell,另一个 pane 执行 htop

更贴近开发项目的例子可以写成这样:

layout {
    cwd "/home/alice/projects/my-app"

    tab name="dev" split_direction="vertical" {
        pane name="editor" command="nvim" {
            args "."
        }

        pane split_direction="horizontal" {
            pane name="server" command="bash" {
                args "-c" "npm run dev"
            }

            pane name="logs" command="bash" {
                args "-c" "tail -f logs/app.log"
            }
        }
    }

    tab name="git" {
        pane command="bash" {
            args "-c" "git status && exec bash"
        }
    }
}

这个 layout 做了几件事:

  • 全局 cwd 指定项目目录。
  • dev tab 里打开编辑器、开发服务器和日志。
  • git tab 里先查看仓库状态,再回到 shell。
  • command 用来指定可执行文件。
  • args 必须写在 pane 的子节点里,用来传递命令参数。

启动时指定 layout 文件:

zellij --layout /path/to/my-app.kdl

如果 layout 放在 Zellij 的默认 layout 目录,也可以直接用名字启动:

zellij --layout my-app

默认 layout 目录位于 Zellij 配置目录下的 layouts 子目录。也就是说,常用项目可以各自沉淀一个 layout 文件,之后用一个命令恢复固定工作区。

官方文档还支持从远程 URL 加载 layout:

zellij --layout https://example.com/layout_file.kdl

这里有一个安全细节:远程 layout 中的命令会先被挂起,Zellij 会提示用户确认后再执行。这个设计很重要,因为 layout 不只是布局文件,它也可能包含要执行的命令。

5. 配置、插件和高级能力地图

Zellij 的配置也使用 KDL。可以先把默认配置导出来,再逐步修改:

mkdir -p ~/.config/zellij
zellij setup --dump-config > ~/.config/zellij/config.kdl

通常情况下,Zellij 第一次运行时也会自动创建配置文件。查找配置时,它会优先看命令行参数和环境变量,然后再看用户目录下的默认位置。常见入口包括:

  • --config-dir
  • ZELLIJ_CONFIG_DIR
  • $HOME/.config/zellij
  • 系统级配置目录

快捷键配置写在 keybinds block 中。Zellij 的 keybindings 不是一张扁平按键表,而是分 mode 组织。例如 normal mode 里可以绑定进入 pane mode 的按键,pane mode 里再绑定移动焦点、新建 pane 等动作。

一个简化后的结构类似这样:

keybinds {
    normal {
        bind "Ctrl p" { SwitchToMode "pane"; }
        bind "Alt n" { NewPane; }
    }

    pane {
        bind "h" "Left" { MoveFocus "Left"; }
        bind "l" "Right" { MoveFocus "Right"; }
        bind "j" "Down" { MoveFocus "Down"; }
        bind "k" "Up" { MoveFocus "Up"; }
    }
}

不建议一上来就大规模改快捷键。先用默认配置跑几天,确认自己真正高频使用的是 pane、tab、resize 还是 session,再改会更稳。

Zellij 另一个重要方向是插件。官方文档里把 Zellij plugin 描述为 workspace 里的 first class citizen,和 terminal pane 一样可以占据界面空间。插件可以渲染 UI、响应应用状态变化,也可以控制 Zellij 的行为。插件系统基于 WebAssembly / WASI,目前 Rust 是官方支持的插件开发语言。

本文对插件不展开介绍,但需要知道两点:

  • Zellij 的 tab bar、status bar 等默认 UI 也来自插件。
  • 插件让 Zellij 不只是在终端里“分屏”,还可以逐步变成可组合的终端 dashboard。

除了插件,后续还值得继续看这些能力:

  • session resurrection:恢复 session 状态。
  • web client:通过浏览器访问 Zellij。
  • multiplayer collaboration:多人协作使用同一个工作区。
  • zellij run / zellij edit:从命令行快速在新 pane 里运行命令或打开文件。
  • zellij watch:以只读方式查看某个 session。

这些能力不用到再学就可以,推荐的路径是:先用默认快捷键和 session,再用 layout 固定项目工作区,最后再进入 keybindings、插件和脚本化控制。

6. 总结

Zellij 的价值不是“替换 tmux”这么简单。它更像是把终端里的临时操作整理成一个工作区:session 负责保留现场,layout 负责声明结构,CLI 负责脚本化控制,插件系统负责继续扩展。

如果我们每天都在终端里打开同一组命令,最值得先试的是 layout。把一个项目的编辑器、服务、日志和辅助命令写进 KDL 文件之后,终端工作区就不再只是一次次手工拼出来的临时状态,而是可以复用、可以调整、可以分享的工程资产。

参考资料

评论