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