Alacritty + Zellij と WezTerm を同時に試す
はじめに
秋ですし(?)、久しぶりにターミナル環境について考えています。公私ともに手元の Mac では常時ターミナルが立ち上がっているのですが、ここ数年は iTerm 2[1] を使っております。特に不満があるという事もないのですが、最近 Rust で遊んでいることもあり、Rust 製のターミナルエミュレーターに興味があります。今回は、Alacritty[2] と WezTerm[3] を同時に試してみたいと思います。
ターミナルエミュレーターに何を求めるか?
ターミナル上でどんな作業をするかは人それぞれなので、ターミナルに求める機能も人それぞれかと思います。私の場合は、仕事でコード書いたりコンテナ広げたりインフラ叩いたりという暮らしではなくて、ノート書いたりコード読んだりスクリプト動かしたりというのがほとんどです。
あらためてターミナルエミュレーターに求める要素を考えてみると、こんな感じでしょうか。
- 日本語を滑らかに扱えること
- 日本語や記号類の表示が綺麗なこと
- インライン入力がスムーズなこと
- 見た目が好みなこと
- タイトルバーを消せること
- 背景を半透過にできること
- タブやペインの表現が程良いこと
- 手に馴染むこと
- ホットキーで立ち上がること
- タブやペインを操作し易いこと
- Neovim のキーバインドと干渉しないこと
なんか・・・手帳みたいですね。結局、メモを書いたり考えをまとめる際にもターミナル上(の Neovim)で過ごす事が多いので、システム手帳のバインダー部分の様な位置付けなのかもしれないです。ここには敢えて書いていませんが、速いこと(というか、遅くないこと)は絶対条件ですね。
Alacritty
Rust 製のターミナルエミュレーターといえば、まず Alacritty が挙がると思います。レンタリングに OpenGL を使うため描画が速い、って皆んなが言ってるアイツです。実は、今の環境(iTerm 2)に切り替える際に Alacritty も試しており、確かにとても速くて気持ちよかったので有力候補ではあったのですが、当時は日本語の扱いがあまり上手ではなくて断念した記憶があります。
今回あらためて Issue や PR を眺めてみたところ、日本語まわりも多数の取り組みがなされており、期待が出来そうです。取り組んでくださった方々に感謝です。
Zellij
Alacritty には、タブやペインを切る機能は含まれていないため、多くの方は tmux[4] と組み合わせて利用していると思います。私のターミナルの使い方ではそこまでの機能は必要ないので、iTerm 2 のタブ機能と Neovim のウィンドウ分割機能で十分だったのですが、Alacritty を使う場合は何らかマルチプレクサが必要そうです。
天邪鬼なので、いまさら tmux 使うのもなぁ・・・と思っていたら、Zellij[5] という Rust 製のヤツを見つけました。今回は、これを組み合わせて使ってみようと思います。
llij
のところの手馴染みが気持ち良いですね。
WezTerm
元々は Alacritty + Zellij を試してみるだけのハズだったのですが、調べていたら WezTerm というのも勢いがありそうです。個人の名前が付いちゃっているところになかなか男気を感じますが、PR も活発に動いている様で気になります。せっかくなので、並べて試してみることにします。
インストール
Rust 製なので cargo install
っていうパターンもありそうなのですが、.app
のファイルも欲しかったりするので Homebrew で入れてしまいます。
$ brew install --cask alacritty wezterm
$ brew install zellij
Launchpad にアイコンが入り、どちらも起動できることを確認します。アイコンは WezTerm の方が好みかな。
開発元が・・・と言われた場合
Alacritty の方は、開発元の署名が付いていないようでそのままでは起動出来ませんでした。起動出来なかった場合は、[システム環境設定] - [セキュリティとプライバシー] - [一般] から [このまま開く] をクリックして起動してください。
設定変更の仕方
インストールと起動は出来たので、それぞれの設定変更の仕方を確認していきます。
Alacritty
Alacritty は、以下のパスから設定ファイルを読み込むようです。いわゆる XDG ディレクトリ[6] ですね。内容は YAML[7] で記述する様です。
$XDG_CONFIG_HOME/alacritty/alacritty.yml
$XDG_CONFIG_HOME/alacritty.yml
$HOME/.config/alacritty/alacritty.yml
$HOME/.alacritty.yml
雛形になる alacritty.yml
ファイルが、リリース資材と一緒に配布されているので、これをベースに必要な設定を入れていくことになります。Version 0.11.0 に添付の雛形で 895 行ありました。ワクワクしますね。
Zellij
Zellij の設定ファイルも YAML ファイルです。Alacritty 同様 ~/.config
配下に置けば良さそうです。
$ZELLIJ_CONFIG_DIR/config.yml
$HOME/.config/zellij/config.yml
雛形は zellij setup
コマンドで生成可能な様なので、こんな感じで生成しておきます。こちらも 639 行あります。良いですね。
$ mkdir -p ~/.config/zellij
$ zellij setup --dump-config > ~/.config/zellij/config.yaml
WezTerm
WezTerm の設定ファイルは、なんと Lua で書く様です。Neovim 使いとしては放って置けません。こちらも ~/.config
配下で良さそうです。
$XDG_CONFIG_HOME/wezterm/wezterm.lua
$HOME/.config/wezterm/wezterm.lua
$HOME/.wezterm.lua
Lua は、設定ファイルというよりはスクリプトなので、雛形は特に無さそうでした。いったん空の設定を返すスクリプトを置いておきます。
return {}
日本語を滑らかに扱う
設定を変更していく準備が出来たので、私の要件を反映していきましょう。どこかで見た様なサンプルテキストを用意して設定を見ていきます。
Alacritty
フォント関連の設定は、font:
配下にまとまっています。
Alacritty 設定前
font:
normal:
family: PlemolJP Console NF
size: 15.0
offset:
x: 1
y: 1
正直拍子抜けでしたが、フォントフェイスとサイズの設定をするだけで、問題なく日本語表示出来ていそうです。文字と文字の間隔が少し詰まり過ぎている様に感じたので、offset:
で設定をしています。綺麗です。インライン入力も問題なさそうです。
Alacritty フォント設定後
ちなみにフォントですが、IBM Plex をベースにした PlemolJP というフォントを使わせていただいています。
WezTerm
WezTerm の方にも、同様の設定をしていきましょう。
WezTerm 設定前
local wezterm = require 'wezterm'
return {
font = wezterm.font 'PlemolJP Console NF',
font_size = 15.0,
}
文字の間隔も設定できそうなのですが、WezTerm の方はデフォルトのままでも詰まった印象はなかったので、そのままにしています。インライン入力も大丈夫そうです。カーソルの色とか全体の黒い額縁とかが気になりますので、引き続き設定をしていきましょう。
WezTerm フォント設定後
ちなみに、Alacritty も WezTerm もなのですが、設定の変更が(一部を除いて)ライブで反映される様です。設定ファイルを書き換えたら一度ターミナルを再起動して・・・なんて過去の話なんですね。めちゃくちゃ便利ですね。
見た目を好みにする
見た目も変えていきましょう。
普段カラースキームは Gruvbox Dark というものを気に入って使っています。WezTerm にはデフォルトで 735 種類ものカラースキームが入っており、その中に Gruvbox Dark もありました。
あとは、タイトルバーを消したり、半透過にしたり。設定できる幅は、大きくは変わらないかな。
Alacritty
window:
dimensions:
columns: 180
lines: 50
decorations: none
opacity: 0.75
draw_bold_text_with_bright_colors: true
# Colors (Gruvbox Dark)
colors:
primary:
background: '#1e1e1e'
foreground: '#e6d4a3'
cursor:
cursor: '#e6d4a3'
text: '#1e1e1e'
selection:
background: '#e6d4a3'
text: '#534a42'
normal:
black: '#1e1e1e'
blue: '#377375'
cyan: '#578e57'
green: '#868715'
magenta: '#a04b73'
red: '#be0f17'
white: '#978771'
yellow: '#cc881a'
bright:
black: '#7f7061'
blue: '#719586'
cyan: '#7db669'
green: '#aab01e'
magenta: '#c77089'
red: '#f73028'
white: '#e6d4a3'
yellow: '#f7b125'
zellij
theme: gruvbox-dark
themes:
gruvbox-dark:
fg: [213,196,161]
bg: [40,40,40]
black: [60,56,54]
red: [204,36,29]
green: [152,151,26]
yellow: [215,153,33]
blue: [69,133,136]
magenta: [177,98,134]
cyan: [104,157,106]
white: [251,241,199]
orange: [214,93,14]
Alacritty + Zellij 見た目の設定後
WezTerm
local wezterm = require 'wezterm'
return {
initial_cols = 180,
initial_rows = 50,
color_scheme = 'Gruvbox Dark',
window_background_opacity = 0.75,
window_decorations = 'RESIZE',
window_padding = { left = 0, right = 0, top = 0, bottom = 0 },
use_fancy_tab_bar = false,
tab_and_split_indices_are_zero_based = true,
}
WezTerm 見た目の設定後
手に馴染ませる
実は何より重要なのが、「ホットキーで立ち上がること」です。手元の iTerm 2 の設定では、Alt キーを 2 回押すことで iTerm 2 が手前に来る様になっています。どこに居ても直ちにターミナルに入れるので大変便利なのですが、Alacritty にも WezTerm にもこの機能は無い様です。困った。
2 〜 3 分は途方に暮れていたのですが、Google に確認したところ Hammerspoon という macOS 用のツールが助けてくれそうなので、やってみます。
$ brew install --cask hammerspoon
インストールできたら、いちどアイコンから起動して、アクセシビリティの権限を付けておきます。メニューバーの常駐させます。
なんと設定は Lua で書きます。良いですね。残念ながら XDG では無い様で、~/.hammerspoon/init.lua
にファイルを配置します。
Alt の 2 回押しを指定するのは少しややこしそうだったのですが、Ctrl の 2 回押しを実現するありがたいコードがありましたので、fork して Alt 版にさせていただきました。
コイツを設定ファイルのディレクトリ ~/.hammerspoon/
に置いた上で、init.lua
から呼び出します。
local double_press = require("altDoublePress")
local open_alacritty = function()
local appName = "Alacritty"
local app = hs.application.get(appName)
if app == nil or app:isHidden() or not(app:isFrontmost()) then
hs.application.launchOrFocus(appName)
else
app:hide()
end
end
double_press.timeFrame = 0.5
double_press.action = open_alacritty
設定を書いたら、メニューバーのアイコンから [Reload Config] すれば反映されます。これで、どこに居ても Alt 連打でターミナルに入力可能な状態になりそうです。しかも、iTerm 2 標準の機能と違って起動していない状態からでも可能です。良いかも。
おわりに
今日はここまで。とりあえず、日本語入力はなんとかなりそうなのと、ホットキー問題も解決できました。マルチプレクサ周りの設定は、設定内容が決まれば簡単なので、Neovim のキーバインドとも相談しながらゆっくり追い込んでいこうと思います。
やはり Alacritty は体感で分かる程に速いので、しばらく使ってみようと思います。ただ、正直 Zellij より tmux の方が目に見えて速そうなので、結局 Alacritty + tmux という構成に落ち着きそう・・・ね。
2022-10-28 追記)落ち着きました。
-
iTerm 2 is a terminal emulator for macOS that does amazing things. ↩︎
-
WezTerm is a GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust ↩︎
-
tmux is a terminal multiplexer. It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal. ↩︎
-
YAML Ain't Markup Language - YAML is a human-friendly data serialization language for all programming languages. ↩︎
Discussion