はじめに
tmux から zellij に移行して困ることの一つが send-keys の不在だ。tmux では tmux send-keys -t 0 "echo hello" Enter のように、外部から特定のペインにコマンドを送信できる。自動化やスクリプトを書くときに便利な機能だが、zellij には同等の機能がなかった。
ないなら作ればいい。ということで作った。
作ったもの
zellij のプラグインとして動作し、指定したペインにテキストを送信できる。Enter キーの送信もサポートしている。
機能
- send_keys: 指定したペイン ID にテキストを送信
- list_panes: 全ペインの ID 一覧を表示
使い方
インストール
Releases から .wasm ファイルをダウンロードして配置する。
mkdir -p ~/.config/zellij/plugins
cp zellij-send-keys.wasm ~/.config/zellij/plugins/
初回セットアップ
プラグインに権限を付与する必要がある。zellij セッション内で以下を実行。
zellij plugin -- file:$HOME/.config/zellij/plugins/zellij-send-keys.wasm
ダイアログが出るので Grant をクリック。
基本的な使い方
# ペイン 0 に "echo hello" を送信して Enter
ZELLIJ_SESSION_NAME=my-session zellij action pipe
--plugin file:$HOME/.config/zellij/plugins/zellij-send-keys.wasm
--name send_keys
-- '{"pane_id": 0, "text": "echo hello", "send_enter": true}'
長いので、ヘルパースクリプトを用意した。
source scripts/setup-env.sh
send-to-pane 0 "echo hello"
tmux との対応はこうなる。
| tmux | zellij-send-keys |
|---|---|
tmux send-keys -t 0 "echo hello" Enter |
send-to-pane 0 "echo hello" |
技術的なポイント
Enter キー送信の罠
開発中にハマったのが Enter キーの送信だ。最初は write_chars_to_pane_id で n や r を含む文字列を送信していたが、改行文字として解釈されるだけで Enter キー押下として認識されなかった。
解決策は write_to_pane_id でバイトとして CR (0x0D) を送信すること。
// テキストを送信
write_chars_to_pane_id(&msg.text, pane_id);
// Enter をバイトとして送信
if msg.send_enter {
write_to_pane_id(vec![0x0D], pane_id);
}
詳しくは別記事に書いた。
→ zellij プラグインから Claude Code に Enter キーを送信できない問題を解決した
ユースケース
このプラグインの主なユースケースは自動化だ。
- CI/CD スクリプトからペインにコマンドを送信
- 複数ペインへの一括コマンド実行
- マルチエージェント AI システムの構築
特に最後のユースケースが自分の動機だった。複数の Claude Code を異なるペインで起動し、プラグイン経由でタスクを振り分ける構成を作りたかった。その応用例は別リポジトリで公開している。
おわりに
awesome-zellij にも PR を出した。マージされれば公式のプラグインリストに載る。
→ https://github.com/zellij-org/awesome-zellij/pull/35
tmux から zellij に移行したけど send-keys がなくて困っている人の役に立てば幸い。
リンク
- GitHub: https://github.com/atani/zellij-send-keys
- Releases: https://github.com/atani/zellij-send-keys/releases
