zellij-send-keys: tmux の send-keys を zellij で実現するプラグインを作った

ツール

はじめに

tmux から zellij に移行して困ることの一つが send-keys の不在だ。tmux では tmux send-keys -t 0 "echo hello" Enter のように、外部から特定のペインにコマンドを送信できる。自動化やスクリプトを書くときに便利な機能だが、zellij には同等の機能がなかった。

ないなら作ればいい。ということで作った。

作ったもの

zellij-send-keys

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_idnr を含む文字列を送信していたが、改行文字として解釈されるだけで 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 を異なるペインで起動し、プラグイン経由でタスクを振り分ける構成を作りたかった。その応用例は別リポジトリで公開している。

zellij-coaching-staff

おわりに

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
タイトルとURLをコピーしました