ターミナルワークスペース「Zellij 0.42.0」で進化したマルチプレクシング

## はじめに

ターミナル環境で作業する開発者にとって、複数のウィンドウやペインを効率的に管理することは生産性向上の鍵となります。ターミナルマルチプレクサーとしては、Screen や Tmux が広く知られていますが、今回は Rust で開発された新しいのターミナルワークスペースツール「Zellij」を紹介します。

Zellijは最新バージョン 0.42.0 がリリースされました。本記事では、Zellijの基本的な使い方から、新しく追加された新機能「Stacked Resize（積み重ねリサイズ）」と「Pinned Floating Panes（固定フローティングペイン）」を解説します。

## 環境

- Zellij 0.42.0
- 各種 Unix 系 OS（Linux, macOS など）

## Zellijとは

Zellijは、Rust言語で開発されたオープンソースのターミナルマルチプレクサです。複数のペイン（ウィンドウ）を管理し、キーボードショートカットで操作できるという点では従来のツールと似ていますが、以下のような特徴があります：

- Rust言語で開発されたオープンソースプロジェクト
- プラグインシステムによる拡張性（WebAssembly対応）
- フローティングペインのネイティブサポート
- マウス操作のサポート
- 視覚的なフィードバックと直感的なUI

## Zellijのインストール方法

### バージョンの選択について

Zellijの最新バージョン（0.42.0）をCargoでインストールする場合、Rust 1.84以上が必要です。
```bash
# Rust 1.84以上が必要
cargo install --locked zellij
```

#### Rustのバージョンを更新する

rustupを使っている場合は、以下のコマンドでRustを最新バージョンに更新できます：
```bash
rustup update stable
```

これにより最新の安定版Rustがインストールされ、Zellij 0.42.0をインストールできるようになります。

お使いのRustバージョンを確認するには:
```bash
rustc --version
```

[公式ドキュメント](https://zellij.dev/documentation/installation)でお使いの環境に合ったインストール方法を確認してください。

## 基本的な使い方

### 起動方法

Zellijを起動するには、ターミナルで以下のコマンドを実行します：

```bash
zellij
```

![Screenshot 2025-03-18 at 14.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/9258cae3-c06e-43bc-9436-56570e88065e.png)


### macOSでの注意点

macOSでは、Altキー（Optionキー）を使ったショートカットが機能しない場合があります。これは、macOSのターミナルエミュレータがデフォルトでOptionキーを特殊文字入力に割り当てているためです。以下の設定を行うことで解決できます：

* **macOS標準ターミナル**:
  * ターミナル > 環境設定 > プロファイル > キーボード
  * 「メタキーとしてoptionキーを使用」にチェックを入れる

* **iTerm2**:
  * iTerm2 > 設定 > プロファイル > キー
  * 「Left Option Key」（左Optionキー）の設定を「Esc+」に変更
  * 同様に「Right Option Key」も必要に応じて設定

この設定により、Zellijのすべてのショートカットが正常に機能するようになります。

### ペインの操作

Zellijでは、複数のペインを作成して異なるコマンドやプログラムを実行できます。

- 新しいペインを作成するには、`Ctrl+p` でコマンドモードに入り、方向キーで分割方向を選びます
  - 右に分割: `Ctrl+p` → `r`
  - 下に分割: `Ctrl+p` → `d`
- ペイン間を移動するには、`Alt`キーと方向キー（または `h`/`j`/`k`/`l`）を使います
- ペインを閉じるには、`Ctrl+p` → `x`

![Screenshot 2025-03-18 at 14.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/2a69e110-8c9e-452a-8df9-70dce535e212.png)

### フローティングペイン

Zellijの特徴的な機能として、フローティングペインがあります。これは他のペインの上に重ねて表示できるウィンドウです。

![Screenshot 2025-03-18 at 14.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/9e5ba139-cdfb-4ec7-a3bf-07567a7e8e84.png)


- 現在のペインをフローティングペインにするには、`Ctrl+p` → `e`
- フローティングペインの表示/非表示を切り替えるには、`Alt+f`

### 主要なショートカット

チュートリアルと公式ドキュメントから確認できる主要なショートカット：

- `Ctrl+p`: コマンドモードに入る
- `Ctrl+p` → `r`: 現在のペインを右に分割する
- `Ctrl+p` → `d`: 現在のペインを下に分割する
- `Ctrl+p` → `e`: フローティングペインを作成（現在のペインをイジェクト）
- `Alt` + 方向キー: ペイン間を移動
- `Alt+f`: フローティングペインの表示/非表示を切り替え

詳細なキーバインドについては、[公式ドキュメント](https://zellij.dev/documentation/)を参照してください。

## 新機能の紹介

Zellij 0.42.0で追加された主な新機能を紹介します。

### Stacked Resize（積み重ねリサイズ）

#### 概要

Stacked Resizeは、ペインをリサイズする際に画面スペースを最適化する機能です。

![積み重ねリサイズのデモ](https://zellij.dev/img/stacked-resize-demo.gif)

従来のターミナルマルチプレクサでは、ペインのサイズを変更すると隣接するすべてのペインが均等に調整されていました。しかし、Stacked Resizeでは、リサイズ時にペインが「積み重なる」ように振る舞い、タイトルバーだけを表示することで画面スペースを有効活用します。

#### 使い方

Stacked Resizeを使用するには：

1. ペインを選択します（`Alt` + 方向キーでペイン間を移動できます）
2. `Alt+`キーを押してペインを拡大します
   - ペインが「積み重なり」、隣接するペインのタイトルバーのみが表示されるようになります
3. 積み重なったペインを表示するには、タイトルバーをクリックするか、`Alt` + 方向キーでナビゲートします
4. `Alt-`キーを押すと、ペインを縮小し、積み重なったペインを元に戻せます

#### 設定

この機能はデフォルトで有効になっていますが、設定ファイルで無効にすることも可能です：

```yaml
# ~/.config/zellij/config.yaml
stacked_resize: false
```

### Pinned Floating Panes（固定フローティングペイン）

#### 概要

Zellij 0.42.0では、フローティングペインを「固定（ピン留め）」する機能が追加されました。

![固定フローティングペインのデモ](https://zellij.dev/img/pinned-floating-panes-demo.gif)

固定されたペインは、フォーカスがない状態でも常に最前面に表示されます。これは、ログの監視やドキュメントの参照など、常に目に入れておきたい情報がある場合に非常に便利です。

#### 使い方

フローティングペインを固定するには：

1. フローティングペインを作成します（`Ctrl+p` → `e`）
2. ペインを固定するには、マウスでピンアイコンをクリックするか、キーボードショートカット `Ctrl+p` → `i` を押します

固定を解除するには、同じ操作を繰り返します。

### 新しいテーマ定義仕様

Zellij 0.42.0では、UI外観をカスタマイズするための新しいテーマ定義仕様が導入されました。

![テーマ定義仕様のダイアグラム](https://zellij.dev/img/theme-spec.png)

この新仕様で、ZellijのUI全体（プラグインを含む）の外観をより柔軟にカスタマイズできるようになりました。詳細は[公式ドキュメント](https://zellij.dev/documentation/themes)を参照してください。

### その他の改善点

#### ダブル/トリプルクリックでのテキスト選択

![クリック境界マーキング動作のデモ](https://zellij.dev/img/click-boundaries-demo.gif)

Zellijは独自のマウス選択とコピー機能を実装していますが、これまではダブル/トリプルクリックでの単語境界または行の選択ができませんでした。この機能がターミナルペイン向けに実装されました。

#### スタートアップ時のリリースノートとヒント

![起動時のZellijヒントのデモ](https://zellij.dev/img/zellij-tip-demo.png)

Zellij 0.42.0から、初回起動時に現在のバージョンのリリースノートが表示されるようになりました。その後の起動では、ランダムな使用方法のヒントが表示されます。これらの動作は設定で無効にすることも可能です。

## プラグイン開発者向け新APIs

Zellij 0.42.0では、プラグイン開発者向けに多くの新しいAPIが追加されました。これにより、より高度なターミナルアプリケーションの開発が可能になります。主な新APIは以下の通りです：

### ホストフォルダの変更

```rust
let new_host_folder = PathBuf::from("/different/path/on/machine");
change_host_folder(new_host_folder);
```

プラグインが実行時に `/host` フォルダを変更できるようになりました。これにより、ユーザーのマシン上の異なる部分にアクセスできます。この機能は新しい `FullHdAccess` プラグイン権限によって制御されます。

### フローティングペインの座標変更

```rust
let coordinates = vec![
    (PaneId::Terminal(1), FloatingPaneCoordinates {
        x: Some(10),
        y: Some(10),
        width: Some(20),
        height: Some(20),
        pinned: Some(true),
    })
];
change_floating_panes_coordinates(coordinates);
```

プラグインが自身や他のペインのフローティング座標を変更できるようになりました。座標には、x/y位置、幅/高さ、固定状態が含まれます。これにより、ダッシュボードやコントロールフロー体験の作成が可能になります。

### 任意のペインのスタック

```rust
stack_panes(vec![PaneId::Terminal(1), PaneId::Plugin(1), PaneId::Terminal(2)]);
```

プラグインが既存のペインをスタックに結合できるようになりました。Stacked Resize機能と組み合わせることで、複数選択やグループ化の体験を作成できます。

### マウスモーションの読み取り

```rust
fn update(event: Event) -> bool {
    match event {
        Event::Mouse(Mouse::Hover(x, y)) => {
            eprintln!("hovering over coordinates: {:?}, {:?}", x, y);
        },
        // ...
    }
    // ...
}
```

プラグインがユーザーがホバーしたときのマウスモーションを読み取れるようになりました。これにより、ターミナル内でより様々なユーザー体験を作成できます。

## まとめ

Zellijはかなり意欲的な機能が取り入れられたツールですね。「Stacked Resize」と「Pinned Floating Panes」は、限られた画面スペースを最大限に活用するための効果的です。

ターミナル作業が多い方は、Zellijを試してみてください。

## 参考リンク

- [Zellij公式サイト](https://zellij.dev/)
- [Zellij GitHub](https://github.com/zellij-org/zellij)
- [Zellij 0.42.0リリースノート](https://github.com/zellij-org/zellij/releases/tag/v0.42.0)
- [Stacked ResizeとPinned Floating Panesのチュートリアル](https://zellij.dev/tutorials/stacked-resize)