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 絕對值得一試。它的學習曲線平緩,功能強大,能夠顯著提升你的終端工作效率。