Zellij 是什么?
Zellij 是一个用 Rust 编写的现代终端工作区(terminal workspace),定位为 tmux 和 GNU Screen 的下一代替代品。它的核心理念是「自带电池」(batteries included)——开箱即用,无需复杂配置即可获得强大的终端多路复用能力。
为什么需要 Zellij?
如果你经常使用终端进行开发、运维或系统管理,以下场景你一定不陌生:
- 同时运行多个服务(前端、后端、数据库),需要在不同窗口间切换
- SSH 连接到远程服务器后,断开连接导致所有进程中断
- 想要保存某个复杂的工作状态,下次直接恢复
- 团队协作时需要共享终端会话进行调试或代码审查
传统的解决方案是 tmux 或 GNU Screen,但它们的学习曲线陡峭,默认配置简陋,很多高级功能需要手动编写配置文件才能实现。
Zellij 的目标就是解决这些痛点:
| 特性 | tmux | Zellij |
|---|---|---|
| 学习曲线 | 陡峭,需记忆大量快捷键 | 平缓,内置帮助和默认布局 |
| 浮动面板 | ❌ 不支持 | ✅ 原生支持 |
| 堆叠面板 | ❌ 不支持 | ✅ 原生支持 |
| Web 客户端 | ❌ 需第三方工具 | ✅ 内置 |
| 会话恢复 | ⚠️ 需插件(tmux-resurrect) | ✅ 原生支持 |
| 插件系统 | Shell 脚本 | WebAssembly(Rust/任何语言) |
| 布局自动化 | 需编写 shell 脚本 | KDL 声明式配置 |
| 编程语言 | C | Rust |
Zellij vs tmux:核心差异
- 用户友好性:Zellij 默认提供直观的 UI(状态栏、标签栏),而 tmux 需要手动配置才能看到类似效果。
- 浮动面板:Zellij 允许面板「浮动」在其他面板之上,适合监控命令(如
top、htop)的同时进行其他工作。 - Web 客户端:Zellij 内置 Web 服务器,可以通过浏览器访问终端会话,无需额外工具。
- 会话复活:关闭 Zellij 后重新打开,可以恢复之前的所有面板、命令和历史记录,甚至跨重启也有效。
- 插件生态: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+g → n |
水平分割当前面板 |
| 新建垂直面板 | Ctrl+g → h |
垂直分割当前面板 |
| 切换面板 | Ctrl+g → 方向键 |
在面板间移动焦点 |
| 调整面板大小 | Ctrl+g → r → 方向键 |
进入 resize 模式 |
| 新建标签页 | Ctrl+g → t |
创建新标签页 |
| 切换标签页 | Ctrl+g → p / n |
上一个/下一个标签页 |
| 关闭面板 | Ctrl+g → x |
关闭当前面板 |
| 退出 Zellij | Ctrl+g → q |
退出当前会话 |
提示:按
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 run 和 npm 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 官方文档 - 探索 社区插件 - 加入 Discord 或 Matrix 社区
如果你正在寻找 tmux 的现代替代品,Zellij 绝对值得一试。它的学习曲线平缓,功能强大,能够显著提升你的终端工作效率。