🛠️

初心者にこそ使ってほしいRust製Terminal MultiplexerであるところのZellij

2022/12/18に公開1

demo @official repository

これはZellij (ゼリージュ:初見で読める人はいるのだろうか) を広く知っていただきたいという気持ちを全世界に発信する回です。おまえもZellij使いにならないか。

初心者にこそ使ってほしいというスタンスで紹介をしていきますが、
全人類使え使ってもいいんですよ...?

なお、この記事は慶應理工 Advent Calendar 2022の18日目の記事となる予定です。
間に合ってくれ...(2022/12/17 17:08)
https://adventar.org/calendars/7773

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上で実演を行っていくのでまずは目を慣らしていただきます。
見た目はこれです。
terminal appearance
なおzshに併せてStarshipを使わせていただいております。特段カスタマイズはしていないはずです。
たぶん。
https://starship.rs/



では本編です。

tmux --help → スンッ...

はじめを一歩を踏み出すためにtmux --helpします。
えい。
tmux --help
ん?



ない...

じゃあman tmuxします。
せい。
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
これがtmuxのsessionの中です。
コマンドを入力して実行してみます。
cmd in tmux
よし、問題なく実行できる!


あれ、そういえば...






どどどどうやって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

https://github.com/zellij-org/zellij#what-is-this
まずは公式の説明をご紹介します。
どーん。

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でいいはずです。

demo @official repository
これ↑を見るとその自由度が伺えますね。

この記事では初心者に優しい部分を強調して伝えたいのでデフォルトの状態での振る舞いを紹介していくのですが、
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はあるんでしょうか...?
zellij --help
ありました!

なおmanではマニュアルは出てこないですが、公式のZellij User Guideがあるのでまぁいいかなという感じです。
https://zellij.dev/documentation/

一応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 appearance
これがzellijのsessionの中です。
tmuxに比べて明らかに表示がリッチになっていますね。その中でも私が一番強調したいのが画面下部に存在するこのゾーンです。
zellij command list
わかるでしょうか、session内でできる操作と対応するコマンドがそのまま記載してあるんです。
優しすぎるぅ。
しかも操作中は今どんな操作をしているのかが可視化されます。
ほい!
zellij command list2
今はctrl+pでpaneの操作をするモードに入っています。対応する<p> PANEの箇所がアクティブになっているのでわかりやすいですね。
そのままの流れでpane操作を実演しましょう!

pane操作

上述の通りctrl+pでpaneの操作をするモードに入ります。
あとはもう画面下部に書いてある通りに操作できます。まずは<d> Downと書いてある通りにdを押してみましょう。
以下のようになるはずです。
zellij pane d
簡単だぁ...
続いて<r> Rightと書いてあるようにrで分割を進めます。
(恐らく一度pane操作モードから抜けているので、もう一度ctrl+pでpane操作モードに移行した上で操作しましょう)
zellij pane dr
なるほど、アクティブなpaneが緑色で表示されてそれに対して分割が行われるようですね。

ではpane操作の最後に<w> Floatingと書いてあるようにwを試してみましょう。
zellij pane w
これまでのpaneの上に浮いた状態のpaneが出現しました!
そういえばさっき画面下部に<p> PANEのほかに<h> MOVEってあったな、これはもしかしてもしかするのか...?

でん
zellij pane w move
うわぁぁぁぁぁぁぁ!!!
動いたぁぁぁ!!!!!

(動かすときは矢印キーで出来るんですが、Vimのようにh, j, k, lでも移動できます。)

そういえばさっき画面下部に<h> MOVEのほかに<n> RESIZEってあったな、これはもしかしてもしかするのか...?

でん
zellij pane w resize
ひょぇぇぇぇぇぇぇ!!!
巨大化したぁぁぁ!!!!!

でん
zellij pane w resize2
ぬわぁぁぁぁぁぁぁ!!!
ちいさくなったぁぁぁ!!!!!

あぁ、立ち位置としては単なる便利ツールであるはずなのに楽しすぎる...!

tab操作

既にお気付きの方もいらっしゃるでしょう、画面上部をご覧いただきたい。Tab #1という表示があります。
結論から言うとこれはtmuxのwindowに相当するものです。(と捉えています。)
ではこれまで通り画面下部を見ましょう。<t> TABとありますね。ctrl+tでtab操作モードに入れそうです。
zellij tab
入れました!<n> Newとありますのでnを入力してみます。
zellij tab new
画面上部を見てください。Tab #1の隣にTab #2が追加され、Tab #2がアクティブになっています。新しいtabであるTab #2ができてそちらに移ったという状況です。もう一度ctrl+tでtab操作モードに入れば、Tabキーによってtab選択を行えます。(これも表示されている通りの操作ですね)
zellij tab
戻ってきました!

どどどどうやってsessionから抜ければいいんだ!?

Zellijに甘やかされた我々にとってはもう怖くはありません!
画面下部を見ましょう!<o> SESSIONとありますね、session関連の操作はここからできそうです。
例によってctrl+oします。
zellij session
答えはもう書いてありますね、<d> Detachと書いてあるのでしっかりとdを押下して脱出をキメましょう。
おつかれさまでした!

ZellijがどれだけユーザーフレンドリーなUIを持っているかは理解していただけたかと思います。

そう、全ての答えが提示されている状態で作業を行えるのです。
もう初心者に優しいとかの次元じゃない。初心者を甘やかすツール。
なんならたったいま記事を書いている中で見つけた機能もあったくらいで、調べずとも使い方を探索しながら使えるツールと言っても良さそうです。


結び

おまえもZellij使いにならないか。

GitHubで編集を提案

Discussion

pantherheadpantherhead

とてもわかりやすい記事でした。
今日からZellij使いになります!
ありがとうございました!