Zellij 是什么?

Zellij 是一个用 Rust 编写的现代终端工作区(terminal workspace),定位为 tmux 和 GNU Screen 的下一代替代品。它的核心理念是「自带电池」(batteries included)——开箱即用,无需复杂配置即可获得强大的终端多路复用能力。

为什么需要 Zellij?

如果你经常使用终端进行开发、运维或系统管理,以下场景你一定不陌生:

  • 同时运行多个服务(前端、后端、数据库),需要在不同窗口间切换
  • SSH 连接到远程服务器后,断开连接导致所有进程中断
  • 想要保存某个复杂的工作状态,下次直接恢复
  • 团队协作时需要共享终端会话进行调试或代码审查

传统的解决方案是 tmuxGNU Screen,但它们的学习曲线陡峭,默认配置简陋,很多高级功能需要手动编写配置文件才能实现。

Zellij 的目标就是解决这些痛点:

特性 tmux Zellij
学习曲线 陡峭,需记忆大量快捷键 平缓,内置帮助和默认布局
浮动面板 ❌ 不支持 ✅ 原生支持
堆叠面板 ❌ 不支持 ✅ 原生支持
Web 客户端 ❌ 需第三方工具 ✅ 内置
会话恢复 ⚠️ 需插件(tmux-resurrect) ✅ 原生支持
插件系统 Shell 脚本 WebAssembly(Rust/任何语言)
布局自动化 需编写 shell 脚本 KDL 声明式配置
编程语言 C Rust

Zellij vs tmux:核心差异

  1. 用户友好性:Zellij 默认提供直观的 UI(状态栏、标签栏),而 tmux 需要手动配置才能看到类似效果。
  2. 浮动面板:Zellij 允许面板「浮动」在其他面板之上,适合监控命令(如 tophtop)的同时进行其他工作。
  3. Web 客户端:Zellij 内置 Web 服务器,可以通过浏览器访问终端会话,无需额外工具。
  4. 会话复活:关闭 Zellij 后重新打开,可以恢复之前的所有面板、命令和历史记录,甚至跨重启也有效。
  5. 插件生态:Zellij 的插件基于 WebAssembly,可以用 Rust、Go、C 等任何能编译为 WASM 的语言编写,安全性更高。

安装 Zellij

Zellij 支持 Linux、macOS 和 Windows(WSL)。以下是几种常见的安装方式:

方法一:官方一键安装脚本(推荐)

# Bash/Zsh
bash <(curl -L https://zellij.dev/launch)

# Fish
bash (curl -L https://zellij.dev/launch | psub)

# PowerShell
irm https://zellij.dev/launch.ps1 | iex

这个脚本会自动检测你的操作系统和架构,下载并安装最新版本的 Zellij。

方法二:包管理器安装

macOS (Homebrew):

brew install zellij

Linux (Ubuntu/Debian):

# 添加 APT 仓库
echo "deb [trusted=yes] https://dl.cloudsmith.io/public/zellij-org/releases/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/zellij.list
sudo apt update
sudo apt install zellij

Arch Linux:

sudo pacman -S zellij

Fedora:

sudo dnf install zellij

方法三:从源码编译

如果你需要从源码编译(例如定制版本):

# 确保已安装 Rust 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 克隆仓库
git clone https://github.com/zellij-org/zellij.git
cd zellij

# 编译并安装
cargo install --path zellij

验证安装

zellij --version

应该输出类似 zellij 0.42.0 的版本号。


快速上手:第一个 Zellij 会话

启动 Zellij

在终端中直接运行:

zellij

你会看到一个全新的界面,顶部有标签栏,底部有状态栏。默认情况下,Zellij 会创建一个名为 "main" 的标签页和一个终端面板。

基本操作

Zellij 的所有快捷键都以 Ctrl + g 作为前缀(称为 "mode key")。以下是常用操作:

操作 快捷键 说明
新建面板 Ctrl+gn 水平分割当前面板
新建垂直面板 Ctrl+gh 垂直分割当前面板
切换面板 Ctrl+g → 方向键 在面板间移动焦点
调整面板大小 Ctrl+gr → 方向键 进入 resize 模式
新建标签页 Ctrl+gt 创建新标签页
切换标签页 Ctrl+gp / n 上一个/下一个标签页
关闭面板 Ctrl+gx 关闭当前面板
退出 Zellij Ctrl+gq 退出当前会话

提示:按 Ctrl+g? 可以随时查看完整的快捷键列表。

浮动面板

浮动面板是 Zellij 的特色功能之一。它允许一个面板「悬浮」在其他面板之上,不会占用固定的网格空间。

启用浮动面板:

# 快捷键:Alt + f

或者通过命令模式:

Ctrl+g  :  toggle_floating_panes

典型使用场景:

# 在一个浮动面板中运行 htop 监控系统资源
htop

# 在另一个浮动面板中运行日志跟踪
tail -f /var/log/syslog

# 主面板继续编写代码或执行其他命令

浮动面板可以拖动、调整大小,甚至可以「钉住」(pin)使其始终在最上层。

堆叠面板

堆叠面板允许你将多个面板垂直堆叠在一起,节省水平空间。

创建堆叠面板:

# 先创建两个普通面板,然后:
Ctrl+g  :  toggle_stack

在堆叠面板间切换:

# 使用方向键上下切换

堆叠面板特别适合以下场景: - 保持多个编辑器缓冲区可访问 - 监控多个命令输出而不占用过多屏幕空间 - 按任务或上下文组织工作区


会话管理:保存与恢复工作状态

会话管理器

Zellij 内置了强大的会话管理功能,让你轻松在多个工作环境之间切换。

打开会话管理器:

Ctrl+g  w

这会显示一个可视化的会话选择界面,你可以: - 查看所有正在运行的会话 - 创建新会话(带自定义名称) - 切换到后台会话 - 恢复之前退出的会话

欢迎屏幕

首次启动 Zellij 时,可以使用欢迎屏幕快速开始:

zellij -l welcome

欢迎屏幕提供了一个类似「开始菜单」的界面,可以: - 可视化选择会话 - 创建新会话 - 恢复之前退出的会话

会话复活(Session Resurrection)

这是 Zellij 最独特的功能之一:即使你关闭了 Zellij 或重启了电脑,下次打开时仍然可以恢复之前的完整工作状态,包括:

  • 所有面板的布局和大小
  • 每个面板中运行的命令
  • 滚动历史
  • 环境变量和工作目录

如何恢复:

# 正常启动 Zellij,然后通过会话管理器选择要恢复的会话
zellij
Ctrl+g  w  选择之前退出的会话

或者直接在启动时指定:

zellij attach <session-name>

这对于长时间运行的任务(如编译、测试、数据处理)非常有用——即使意外断开连接或重启,也能无缝继续工作。


布局自动化:定义你的开发环境

Zellij 的布局系统允许你用 KDL(一种人类可读的配置格式)声明式地定义整个开发环境。

什么是布局?

布局是一个 .kdl 文件,描述了: - 有多少个标签页 - 每个标签页中有哪些面板 - 每个面板运行什么命令 - 面板的大小和位置 - 是否使用浮动或堆叠

简单布局示例

创建一个名为 my-project.kdl 的文件:

layout {
    tab name="Backend" {
        pane split_direction="Vertical" {
            pane command="cargo" args=["run"]
            pane command="npm" args=["run", "dev"]
        }
    }
    tab name="Database" {
        pane command="psql" args=["-U", "postgres", "-d", "mydb"]
    }
}

使用布局:

zellij --layout my-project.kdl

这会自动: 1. 创建两个标签页:"Backend" 和 "Database" 2. 在 "Backend" 标签页中,垂直分割为两个面板,分别运行 cargo runnpm run dev 3. 在 "Database" 标签页中,运行 PostgreSQL 客户端

命令面板(Command Panes)

命令面板是 Zellij 的独特功能,它将命令视为「一等公民」,而不是简单的终端输出。

特点: - 可以看到命令的退出码 - 按 Enter 即可重新运行命令 - 可以设置为「挂起」状态,按需手动触发 - 非常适合构建命令、运行测试、启动开发服务器

在布局中使用命令面板:

layout {
    tab name="Dev" {
        pane command="cargo" args=["test"] start_suspended=true
        pane command="cargo" args=["build"] start_suspended=true
    }
}

start_suspended=true 表示命令不会自动运行,需要你手动按 Enter 触发。这对于资源密集型操作(如完整编译)非常有用,避免每次启动布局时都自动执行。

编辑面板

Zellij 允许你将任何面板的滚动缓冲区直接在你的 $EDITOR 中打开:

# 在当前面板中按:
Ctrl+s  e

这会用你配置的编辑器(vim、neovim、emacs 等)打开当前面板的全部输出,你可以: - 搜索、复制、整理终端输出 - 将输出保存为文件 - 分享给团队成员


Web 客户端:在浏览器中访问终端

Zellij 内置了 Web 服务器,允许你通过浏览器直接访问终端会话。这意味着: - 无需安装终端:在任何有浏览器的设备上访问你的 Zellij 会话 - 远程协作:与团队成员共享会话进行结对编程或调试 - 无缝切换:在终端和浏览器之间自由切换,会话状态保持一致

启用 Web 客户端

启动 Zellij 时启用 Web 服务器:

zellij --server /tmp/zellij-server.sock

或者在配置文件中启用:

// ~/.config/zellij/config.kdl
plugins {
    path "/usr/lib/zellij/plugins"
}

keybinds {
    shared {
        bind "Alt w" { SwitchToMode "WebClient"; }
    }
}

访问会话

在浏览器中打开:

http://localhost:8082

你可以: - 查看所有正在运行的会话 - 通过 URL 直接访问特定会话:http://localhost:8082/my-session - 创建只读令牌,让他人查看但不能操作你的会话

远程访问

Zellij 支持通过 HTTPS 远程访问会话:

# 从另一台机器附加到远程会话
zellij attach https://my-server:8082/my-session

这不需要 SSH 隧道或第三方工具,非常适合: - 远程调试 - 结对编程 - 技术支持


插件系统:用 WebAssembly 扩展功能

Zellij 的界面本身就是由插件构成的,包括: - 标签栏(Tab Bar) - 状态栏(Status Bar) - 会话管理器(Session Manager) - 欢迎屏幕(Welcome Screen) - 文件选择器(Strider)

开发自己的插件

Zellij 插件基于 WebAssembly(WASM),可以用任何能编译为 WASM 的语言编写(Rust、Go、C 等)。Rust 有一流的支持和专用 SDK。

创建一个简单的 Rust 插件:

# 安装 Zellij 插件脚手架工具
cargo install zellij-plugin-template

# 创建新项目
zellij-plugin-template my-plugin

cd my-plugin

生成的项目结构:

my-plugin/
├── Cargo.toml
├── src/
│   └── main.rs
└── plugin.yaml

示例插件代码(src/main.rs):

use zellij_sdk::{prelude::*, Command};

#[command(name = "my-plugin")]
fn main() {
    // 订阅 Zellij 事件
    subscribe(&[EventType::KeyPress(Key::Char('x'))]);

    loop {
        match std::io::stdin().read_line() {
            Ok(line) => {
                if line.contains("KeyPress") {
                    // 处理按键事件
                    println!("Received key press!");
                }
            }
            Err(_) => break,
        }
    }
}

编译并安装:

# 编译为 WASM
cargo build --target wasm32-wasip1 --release

# 复制到 Zellij 插件目录
cp target/wasm32-wasip1/release/my_plugin.wasm ~/.local/share/zellij/plugins/

在配置中加载插件:

// ~/.config/zellij/config.kdl
plugins {
    path "~/.local/share/zellij/plugins"
}

pane_templates {
    template name="my-plugin-pane" {
        plugin location="file:~/.local/share/zellij/plugins/my_plugin.wasm"
    }
}

热门社区插件

  • Strider:动态文件系统导航,支持模糊搜索
  • Configuration Screen:交互式配置管理
  • Multiple Pane Select:批量操作多个面板

你可以在 Zellij 插件仓库 中找到更多社区插件。


高级脚本化:CLI 控制

Zellij 暴露了完整的控制接口通过 CLI 命令,让你可以从 shell 脚本或外部工具构建复杂的终端工作流。

条件阻塞面板

# 阻塞直到命令成功退出
zellij action new-pane --command "cargo test" --block-until-exit-success

# 阻塞直到命令失败退出
zellij action new-pane --command "npm run build" --block-until-exit-failure

# 阻塞直到命令退出(无论成功或失败)
zellij action new-pane --command "make" --block-until-exit

失败的命令可以交互式重试,而不会让脚本失去位置。

实时面板输出流

# 将任意面板的输出实时流式传输到 stdout
zellij subscribe pane-id-123

# 使用 JSON 格式便于结构化处理
zellij subscribe pane-id-123 --json

这对于监控远程服务器的日志或构建自动化管道非常有用。

结构化状态查询

# 列出所有面板(JSON 格式)
zellij list-panes --json

# 列出所有标签页
zellij list-tabs --json

# 获取当前会话信息
zellij session-info

这些命令可以集成到你的 CI/CD 管道、监控脚本或自定义仪表板中。


实战案例:构建开发者工作流

案例一:全栈开发环境

创建一个布局文件 fullstack-dev.kdl

layout {
    tab name="Frontend" {
        pane split_direction="Vertical" {
            pane command="npm" args=["run", "dev"]
            pane command="npm" args=["run", "storybook"]
        }
    }
    tab name="Backend" {
        pane split_direction="Horizontal" {
            pane command="cargo" args=["run"]
            pane command="cargo" args=["watch", "-x", "test"] start_suspended=true
        }
    }
    tab name="Database" {
        pane command="docker" args=["compose", "up"]
        pane command="psql" args=["-U", "postgres", "-d", "myapp"]
    }
    tab name="Monitoring" {
        pane floating=true command="htop"
        pane floating=true command="tail" args=["-f", "/var/log/app.log"]
    }
}

启动:

zellij --layout fullstack-dev.kdl

这个布局会自动: 1. 创建 4 个标签页,分别用于前端、后端、数据库和监控 2. 在前端标签页中,垂直分割运行开发服务器和 Storybook 3. 在后端标签页中,水平分割运行应用和测试监视器 4. 在数据库标签页中,启动 Docker Compose 和 PostgreSQL 客户端 5. 在监控标签页中,浮动显示 htop 和日志跟踪

案例二:远程服务器调试

假设你需要在远程服务器上调试一个问题:

# SSH 到远程服务器
ssh user@remote-server

# 启动 Zellij 会话
zellij -s debugging-session

# 在第一个面板中查看日志
tail -f /var/log/app/error.log

# 新建面板,运行诊断命令
Ctrl+g  n
dmesg | tail -20

# 新建浮动面板,监控系统资源
Ctrl+g  Alt+f
htop

# 启用 Web 客户端,让同事可以远程查看
# (需要预先配置 Web 服务器)

然后告诉同事访问 https://remote-server:8082/debugging-session,他们可以实时看到你的终端会话,甚至协助操作(如果授予写权限)。

案例三:数据科学工作流

创建一个数据科学项目的布局 data-science.kdl

layout {
    tab name="Notebook" {
        pane command="jupyter" args=["lab", "--no-browser"]
    }
    tab name="Data Processing" {
        pane split_direction="Vertical" {
            pane command="python" args=["process_data.py"]
            pane command="watch" args=["-n", "5", "ls", "-lh", "output/"]
        }
    }
    tab name="Visualization" {
        pane command="python" args=["visualize.py"]
        pane floating=true command="eog" args=["output/chart.png"]
    }
}

常见问题与故障排查

Q1: Zellij 和 tmux 可以同时使用吗?

A: 可以,但不建议嵌套使用。你可以在 tmux 中运行 Zellij,或者在 Zellij 中运行 tmux,但这会导致快捷键冲突和性能问题。建议选择一个作为主要的终端复用器。

Q2: 如何迁移 tmux 配置到 Zellij?

A: Zellij 没有直接的 tmux 配置转换器,但你可以: 1. 参考 Zellij 的 默认配置文件 2. 将 tmux 的常用功能映射到 Zellij 的等效功能 3. 使用 Zellij 的布局系统替代 tmux 的脚本

Q3: Zellij 的性能如何?

A: Zellij 用 Rust 编写,性能优秀。在大多数场景下,它的内存占用和 CPU 使用率与 tmux 相当,甚至在某些基准测试中表现更好。对于大型会话(数十个面板),Zellij 的响应速度仍然流畅。

Q4: 如何在 Zellij 中使用鼠标?

A: Zellij 默认支持鼠标操作: - 点击面板切换焦点 - 拖动面板边界调整大小 - 滚动鼠标滚轮浏览历史 - 点击标签页切换

如果鼠标不工作,检查终端模拟器是否启用了鼠标支持,或在 Zellij 配置中确认:

// ~/.config/zellij/config.kdl
mouse_mode true

Q5: Zellij 支持 Windows 吗?

A: Zellij 原生支持 Windows(通过 WSL2 或 PowerShell)。你可以使用官方一键安装脚本在 Windows 上安装:

irm https://zellij.dev/launch.ps1 | iex

总结

Zellij 是一个现代化的终端工作区,它继承了 tmux 的强大功能,同时提供了更友好的用户体验和创新的特性:

核心优势: - ✅ 开箱即用:无需复杂配置,默认提供直观的 UI - ✅ 浮动/堆叠面板:灵活的面板管理,适合多任务工作 - ✅ 会话复活:即使重启也能恢复完整工作状态 - ✅ Web 客户端:通过浏览器访问终端,支持远程协作 - ✅ 插件系统:基于 WebAssembly,安全且可扩展 - ✅ 布局自动化:用 KDL 声明式定义开发环境 - ✅ CLI 脚本化:完整的控制接口,适合自动化工作流

适合人群: - 开发者:需要同时运行多个服务、测试和监控工具 - 运维工程师:需要管理远程服务器和长时间运行的任务 - 数据科学家:需要组织 Jupyter Notebook、数据处理和可视化工作流 - 团队协作:需要共享终端会话进行结对编程或调试

下一步: - 阅读 Zellij 官方文档 - 探索 社区插件 - 加入 DiscordMatrix 社区

如果你正在寻找 tmux 的现代替代品,Zellij 绝对值得一试。它的学习曲线平缓,功能强大,能够显著提升你的终端工作效率。