初心者にこそ使ってほしいRust製Terminal MultiplexerであるところのZellij
これはZellij (ゼリージュ:初見で読める人はいるのだろうか) を広く知っていただきたいという気持ちを全世界に発信する回です。おまえもZellij使いにならないか。
初心者にこそ使ってほしいというスタンスで紹介をしていきますが、
全人類使え使ってもいいんですよ...?
なお、この記事は慶應理工 Advent Calendar 2022の18日目の記事となる予定です。
間に合ってくれ...(2022/12/17 17:08)
Terminal Multiplexer
Terminal Multiplexerは、いつも皆さんが利用しているterminalを複数のsession、window、paneといった単位に分割して利用することを可能にしてくれます。
ここでsession、window、paneは以下のようなものです。
- session : Terminal Multiplexerが管理し、それぞれがterminalのグループのように振る舞う。それぞれのsessionの状態は個別に保存され、好きなタイミングで入ったり(attach)、出たり(detach)できる。
- window : sessionが内部に複数のwindowを持つ。windowはそれぞれ個別のterminalのようにふるまう。
- pane : windowを分割した領域。windowを複数のpaneに分割すると、それぞれのpaneが個別のterminalのようにふるまう。
また、個人的にはここがTerminal Multiplexerの最大の利点だと認識しているのですが、
sshでログインしたremote server等において、terminalを終了してもsessionが維持されます。
つまり何らかのコマンドを実行して放置した後に結果を確認しようとしたらログアウトしてしまって実行が中断されたという悲劇を避けることができます。
tmuxといふもの。
tmuxは TerminalMultiplexerの略です。そのままtmux
というコマンドでTerminal Multiplexerの機能を利用できます。
前章で紹介したように複数のsessionとその内部のwindow、そしてpane分割の機能をサポートし、terminalの終了に関係なくそれぞれのsessionがtmuxによって維持されます。
非常に便利で筆者もよく利用していたtmuxなのですが、ただ、私個人はこのtmuxに対してあまり「初心者に優しくない」 という印象を持っています。
ということで唐突ですが次章でtmuxにまつわる筆者の醜態を晒していこうと思います。
(同時にtmux
についても少し説明します。)
Let's Go! tmux (見よ!我が醜態)
筆者が一番最初にtmuxの存在を知ったのはいつだったかわかりません。(は?)
が、とりあえず当時の状況(なんなら今もなるんですが)を再現していこうと思います。
これを見ることによって筆者が抱いている tmuxへのイメージ「初心者に優しくない」 を共有していただけるのでは、と思っています。
筆者のterminalに慣れていただくお時間
これから筆者のterminal上で実演を行っていくのでまずは目を慣らしていただきます。
見た目はこれです。
なおzshに併せてStarshipを使わせていただいております。特段カスタマイズはしていないはずです。
たぶん。
では本編です。
tmux --help
→ スンッ...
はじめを一歩を踏み出すためにtmux --help
します。
えい。
ん?
ない...
じゃあman tmux
します。
せい。
マニュアルは用意されているようです。
しかし、黎明期を生きた先人や最初から強かったやべぇ人々にはわからない感覚だとは思いますが、初心者というものはでっかいマニュアルを渡されると消し飛んでしまうほどに儚い存在です。(でかい本を鈍器と例えますよね。デカヌチャンです。)
なんならマニュアルからどうやって脱出するかもわからないかもしれません。(quitのq
ですよ。)
当時の私はこのマニュアルに消し飛ばされて先人が残したブログ記事を漁りました。
以下に最低限tmuxを動かすために必要なコマンドを置いておきます。私はこれしか知りません。(は?)
# session_nameという名前のsessionを作成し、そのsessionに入る (new)
$ tmux new -t session_name
# 作成されたsessionを一覧表示 (ls)
$ tmux ls
# session_nameという名前のsessionに入る (attach)
$ tmux attach -t session_name
# session_nameという名前のsessionを消す (kill-session)
$ tmux kill-session -t session_name
# 全てのsessionを消す (kill-server)
$ tmux kill-server
というわけで幼い当時の私はtmux new -t tutorial
というコマンドを入力して生まれて初めてsessionに入ったのです。
(次章へ...)
(うわぁぁぁぁぁぁぁ!キーバインドがわからねぇぇぇ!!!)
情けないぜ助けてくれででーん。
これがtmuxのsessionの中です。
コマンドを入力して実行してみます。
よし、問題なく実行できる!
あれ、そういえば...
どどどどうやってsessionから抜ければいいんだ!?
...さて!!!
初心者の皆さまにクイズです!どうやってsessionから抜ければいいでしょうか!
幼い私を助けてくれ!!!
10
9
8
7
6
5
4
3
2
1
0
ハイ残念quitのqでctrl+q
、ではありませんでした!!!
正解はctrl+b
の後にd
です。
prefix keyとしてctrl+b
が用意されていて、これを入力するとコマンドを受け付ける状態に移行するんですね。その上でdetachのd
を入力してsessionを抜けるというわけです。
幼い頃の私はsessionからどうやって出るのか調べて右往左往していました。
そしてここに初心者に優しくないポイントがあるんですが、 ctrl+b
を押しても一切表示が変化しないんですよね。 不安になったりしませんか?Vimだったら左下に-- INSERT --
のようにモードの変化を示してくれたり入力中のコマンドを出してくれたりするんですが。そういうのが欲しいです。
当時はこんな調子だったのでsession内部でのキーバインドを記憶するのを諦めてここまでで提示した機能しか使ってきませんでした。そう、労力を払いたくなくてpane、windowによるterminal分割機能は一切使わない選択をしたわけです。それでもssh先でバックグラウンド実行などを明示的に行わずに実行中のterminalを維持できるtmuxの機能は非常に便利で、それだけを目的に最低限の利用を繰り返してきました。
そんな筆者が3, 4ヵ月前?に見つけたのがZellijです。
今ではZellijでpane分割などを積極的に利用して作業をしています。
(そして必要がなくなったtmuxのキーバインド把握は一切行わず今に至る。)
Zellij
どーん。
Zellij is a workspace aimed at developers, ops-oriented people and anyone who loves the terminal. At its core, it is a terminal multiplexer (similar to tmux and GNU Screen), but this is merely its infrastructure layer.
ここで手のひらをくるくるするんですが、「中核はterminal multiplexerですがZellijは単にterminal multiplexerの基盤となる層である」と言っているので厳密にはTerminal Multiplexerであると呼ぶべきではないのかもしれません?
とりあえずterminalを愛する全ての人に送る作業環境であることは間違いなさそうですね。
出来ることはtmuxに近いので浅く使う上ではTerminal Multiplexerでいいはずです。
これ↑を見るとその自由度が伺えますね。
この記事では初心者に優しい部分を強調して伝えたいのでデフォルトの状態での振る舞いを紹介していくのですが、
Zellijはレイアウトシステムとプラグインシステムを持っていて、WebAssemblyにコンパイルできるような任意の言語でプラグインが書けたりもします。
Install
https://github.com/zellij-org/zellij#how-do-i-install-it
ここに書いてあるんですが、Rustに触れたことがあってcargo
が動くよ、という方は
cargo install --locked zellij
でOKです。
あるいは他のツールを入れる時もよくやるようにGitHubのReleaseのページから最新のbinaryをダウンロードしてきてインストールすることも可能です。
(なお筆者は試していないですが、公式の記述を見る限りインストールせずに試すこともできるらしい??ですね)
Let's Go! Zellij (ハッピーで埋め尽くします)
上述のcargo install --locked zellij
でインストールを行い、早速使っていきます。
zellij --help
の存在
さぁtmuxには無かった--help
はあるんでしょうか...?
ありました!
なおman
ではマニュアルは出てこないですが、公式のZellij User Guideがあるのでまぁいいかなという感じです。
一応tmuxの章で述べた最低限tmuxを動かすために必要なコマンドと対応させて、以下にZellijのコマンドを置いておきます。
(軽く確認するレベルならzellij --help
があるので不要ですが...)
# session_nameという名前のsessionを作成し、そのsessionに入る
$ zellij -s session_name
# 作成されたsessionを一覧表示 (ls)
$ zellij ls
# session_nameという名前のsessionに入る (attach)
$ zellij attach session_name
# session_nameという名前のsessionを消す (kill-session)
$ zellij kill-session session_name
# 全てのsessionを消す (kill-all-session)
$ zellij kill-all-sessions
なんなら今何してるのかが可視化される
(うわぁぁぁぁぁぁぁ!キーバインドがわかりすぎるぅぅぅ!!!)
キーバインドがその場で確認できてしまうしここが筆者が考えるzellijの初心者に優しいポイントです。
まずはzellij -s tutorial
でtutorialという名前のsessionを作成しましょう。
これがzellijのsessionの中です。
tmuxに比べて明らかに表示がリッチになっていますね。その中でも私が一番強調したいのが画面下部に存在するこのゾーンです。
わかるでしょうか、session内でできる操作と対応するコマンドがそのまま記載してあるんです。
優しすぎるぅ。
しかも操作中は今どんな操作をしているのかが可視化されます。
ほい!
今はctrl+p
でpaneの操作をするモードに入っています。対応する<p> PANE
の箇所がアクティブになっているのでわかりやすいですね。
そのままの流れでpane操作を実演しましょう!
pane操作
上述の通りctrl+p
でpaneの操作をするモードに入ります。
あとはもう画面下部に書いてある通りに操作できます。まずは<d> Down
と書いてある通りにd
を押してみましょう。
以下のようになるはずです。
簡単だぁ...
続いて<r> Right
と書いてあるようにr
で分割を進めます。
(恐らく一度pane操作モードから抜けているので、もう一度ctrl+p
でpane操作モードに移行した上で操作しましょう)
なるほど、アクティブなpaneが緑色で表示されてそれに対して分割が行われるようですね。
ではpane操作の最後に<w> Floating
と書いてあるようにw
を試してみましょう。
これまでのpaneの上に浮いた状態のpaneが出現しました!
そういえばさっき画面下部に<p> PANE
のほかに<h> MOVE
ってあったな、これはもしかしてもしかするのか...?
でん
うわぁぁぁぁぁぁぁ!!!
動いたぁぁぁ!!!!!
(動かすときは矢印キーで出来るんですが、Vimのようにh, j, k, l
でも移動できます。)
そういえばさっき画面下部に<h> MOVE
のほかに<n> RESIZE
ってあったな、これはもしかしてもしかするのか...?
でん
ひょぇぇぇぇぇぇぇ!!!
巨大化したぁぁぁ!!!!!
でん
ぬわぁぁぁぁぁぁぁ!!!
ちいさくなったぁぁぁ!!!!!
あぁ、立ち位置としては単なる便利ツールであるはずなのに楽しすぎる...!
tab操作
既にお気付きの方もいらっしゃるでしょう、画面上部をご覧いただきたい。Tab #1
という表示があります。
結論から言うとこれはtmuxのwindowに相当するものです。(と捉えています。)
ではこれまで通り画面下部を見ましょう。<t> TAB
とありますね。ctrl+t
でtab操作モードに入れそうです。
入れました!<n> New
とありますのでn
を入力してみます。
画面上部を見てください。Tab #1
の隣にTab #2
が追加され、Tab #2
がアクティブになっています。新しいtabであるTab #2
ができてそちらに移ったという状況です。もう一度ctrl+t
でtab操作モードに入れば、Tabキーによってtab選択を行えます。(これも表示されている通りの操作ですね)
戻ってきました!
どどどどうやってsessionから抜ければいいんだ!?
Zellijに甘やかされた我々にとってはもう怖くはありません!
画面下部を見ましょう!<o> SESSION
とありますね、session関連の操作はここからできそうです。
例によってctrl+o
します。
答えはもう書いてありますね、<d> Detach
と書いてあるのでしっかりとd
を押下して脱出をキメましょう。
おつかれさまでした!
ZellijがどれだけユーザーフレンドリーなUIを持っているかは理解していただけたかと思います。
そう、全ての答えが提示されている状態で作業を行えるのです。
もう初心者に優しいとかの次元じゃない。初心者を甘やかすツール。
なんならたったいま記事を書いている中で見つけた機能もあったくらいで、調べずとも使い方を探索しながら使えるツールと言っても良さそうです。
結び
おまえもZellij使いにならないか。
Discussion
とてもわかりやすい記事でした。
今日からZellij使いになります!
ありがとうございました!