💻

Alacritty + Zellij と WezTerm を同時に試す

2022/10/25に公開

はじめに

秋ですし(?)、久しぶりにターミナル環境について考えています。公私ともに手元の Mac では常時ターミナルが立ち上がっているのですが、ここ数年は iTerm 2[1] を使っております。特に不満があるという事もないのですが、最近 Rust で遊んでいることもあり、Rust 製のターミナルエミュレーターに興味があります。今回は、Alacritty[2] と WezTerm[3] を同時に試してみたいと思います。

ターミナルエミュレーターに何を求めるか?

ターミナル上でどんな作業をするかは人それぞれなので、ターミナルに求める機能も人それぞれかと思います。私の場合は、仕事でコード書いたりコンテナ広げたりインフラ叩いたりという暮らしではなくて、ノート書いたりコード読んだりスクリプト動かしたりというのがほとんどです。

あらためてターミナルエミュレーターに求める要素を考えてみると、こんな感じでしょうか。

  • 日本語を滑らかに扱えること
    • 日本語や記号類の表示が綺麗なこと
    • インライン入力がスムーズなこと
  • 見た目が好みなこと
    • タイトルバーを消せること
    • 背景を半透過にできること
    • タブやペインの表現が程良いこと
  • 手に馴染むこと
    • ホットキーで立ち上がること
    • タブやペインを操作し易いこと
    • Neovim のキーバインドと干渉しないこと

なんか・・・手帳みたいですね。結局、メモを書いたり考えをまとめる際にもターミナル上(の Neovim)で過ごす事が多いので、システム手帳のバインダー部分の様な位置付けなのかもしれないです。ここには敢えて書いていませんが、速いこと(というか、遅くないこと)は絶対条件ですね。

Alacritty

Rust 製のターミナルエミュレーターといえば、まず Alacritty が挙がると思います。レンタリングに OpenGL を使うため描画が速い、って皆んなが言ってるアイツです。実は、今の環境(iTerm 2)に切り替える際に Alacritty も試しており、確かにとても速くて気持ちよかったので有力候補ではあったのですが、当時は日本語の扱いがあまり上手ではなくて断念した記憶があります。

https://alacritty.org/

今回あらためて Issue や PR を眺めてみたところ、日本語まわりも多数の取り組みがなされており、期待が出来そうです。取り組んでくださった方々に感謝です。

Zellij

Alacritty には、タブやペインを切る機能は含まれていないため、多くの方は tmux[4] と組み合わせて利用していると思います。私のターミナルの使い方ではそこまでの機能は必要ないので、iTerm 2 のタブ機能と Neovim のウィンドウ分割機能で十分だったのですが、Alacritty を使う場合は何らかマルチプレクサが必要そうです。

天邪鬼なので、いまさら tmux 使うのもなぁ・・・と思っていたら、Zellij[5] という Rust 製のヤツを見つけました。今回は、これを組み合わせて使ってみようと思います。

https://zellij.dev/

llij のところの手馴染みが気持ち良いですね。

WezTerm

元々は Alacritty + Zellij を試してみるだけのハズだったのですが、調べていたら WezTerm というのも勢いがありそうです。個人の名前が付いちゃっているところになかなか男気を感じますが、PR も活発に動いている様で気になります。せっかくなので、並べて試してみることにします。

https://wezfurlong.org/wezterm/

インストール

Rust 製なので cargo install っていうパターンもありそうなのですが、.app のファイルも欲しかったりするので Homebrew で入れてしまいます。

インストール
$ brew install --cask alacritty wezterm
$ brew install zellij

Launchpad にアイコンが入り、どちらも起動できることを確認します。アイコンは WezTerm の方が好みかな。

開発元が・・・と言われた場合

Alacritty の方は、開発元の署名が付いていないようでそのままでは起動出来ませんでした。起動出来なかった場合は、[システム環境設定] - [セキュリティとプライバシー] - [一般] から [このまま開く] をクリックして起動してください。
screen0001

設定変更の仕方

インストールと起動は出来たので、それぞれの設定変更の仕方を確認していきます。

Alacritty

Alacritty は、以下のパスから設定ファイルを読み込むようです。いわゆる XDG ディレクトリ[6] ですね。内容は YAML[7] で記述する様です。

alacritty.yml の配置先
$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 行ありました。ワクワクしますね。

https://github.com/alacritty/alacritty/releases

Zellij

Zellij の設定ファイルも YAML ファイルです。Alacritty 同様 ~/.config 配下に置けば良さそうです。

config.yml の配置先
$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 配下で良さそうです。

wezterm.lua の配置先
$XDG_CONFIG_HOME/wezterm/wezterm.lua
$HOME/.config/wezterm/wezterm.lua
$HOME/.wezterm.lua

Lua は、設定ファイルというよりはスクリプトなので、雛形は特に無さそうでした。いったん空の設定を返すスクリプトを置いておきます。

空の設定ファイル
return {}

日本語を滑らかに扱う

設定を変更していく準備が出来たので、私の要件を反映していきましょう。どこかで見た様なサンプルテキストを用意して設定を見ていきます。

Alacritty

フォント関連の設定は、font: 配下にまとまっています。

screen0002
Alacritty 設定前

alacritty.yml
font:
  normal:
    family: PlemolJP Console NF
  size: 15.0
  offset:
    x: 1
    y: 1

正直拍子抜けでしたが、フォントフェイスとサイズの設定をするだけで、問題なく日本語表示出来ていそうです。文字と文字の間隔が少し詰まり過ぎている様に感じたので、offset: で設定をしています。綺麗です。インライン入力も問題なさそうです。

screen0004
Alacritty フォント設定後

ちなみにフォントですが、IBM Plex をベースにした PlemolJP というフォントを使わせていただいています。

https://github.com/yuru7/PlemolJP

WezTerm

WezTerm の方にも、同様の設定をしていきましょう。

screen0003
WezTerm 設定前

wezterm.lua
local wezterm = require 'wezterm'

return {
    font = wezterm.font 'PlemolJP Console NF',
    font_size = 15.0,
}

文字の間隔も設定できそうなのですが、WezTerm の方はデフォルトのままでも詰まった印象はなかったので、そのままにしています。インライン入力も大丈夫そうです。カーソルの色とか全体の黒い額縁とかが気になりますので、引き続き設定をしていきましょう。

screen0005
WezTerm フォント設定後

ちなみに、Alacritty も WezTerm もなのですが、設定の変更が(一部を除いて)ライブで反映される様です。設定ファイルを書き換えたら一度ターミナルを再起動して・・・なんて過去の話なんですね。めちゃくちゃ便利ですね。

見た目を好みにする

見た目も変えていきましょう。

普段カラースキームは Gruvbox Dark というものを気に入って使っています。WezTerm にはデフォルトで 735 種類ものカラースキームが入っており、その中に Gruvbox Dark もありました。

あとは、タイトルバーを消したり、半透過にしたり。設定できる幅は、大きくは変わらないかな。

Alacritty

alacritty.yml
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

config.yaml
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]

screen0006
Alacritty + Zellij 見た目の設定後

WezTerm

wezterm.lua
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,
}

screen0007
WezTerm 見た目の設定後

手に馴染ませる

実は何より重要なのが、「ホットキーで立ち上がること」です。手元の iTerm 2 の設定では、Alt キーを 2 回押すことで iTerm 2 が手前に来る様になっています。どこに居ても直ちにターミナルに入れるので大変便利なのですが、Alacritty にも WezTerm にもこの機能は無い様です。困った。

2 〜 3 分は途方に暮れていたのですが、Google に確認したところ Hammerspoon という macOS 用のツールが助けてくれそうなので、やってみます。

https://www.hammerspoon.org/

インストール
$ brew install --cask hammerspoon

インストールできたら、いちどアイコンから起動して、アクセシビリティの権限を付けておきます。メニューバーの常駐させます。

screen0008

なんと設定は Lua で書きます。良いですね。残念ながら XDG では無い様で、~/.hammerspoon/init.lua にファイルを配置します。

Alt の 2 回押しを指定するのは少しややこしそうだったのですが、Ctrl の 2 回押しを実現するありがたいコードがありましたので、fork して Alt 版にさせていただきました。

https://gist.github.com/a24k/091bcd2c8f09bb7f41ceeaf926e23574

コイツを設定ファイルのディレクトリ ~/.hammerspoon/ に置いた上で、init.lua から呼び出します。

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 追記)落ち着きました。

https://zenn.dev/a24k/articles/20221027-alacritty-tmux

脚注
  1. iTerm 2 is a terminal emulator for macOS that does amazing things. ↩︎

  2. Alacritty - A cross-platform, OpenGL terminal emulator. ↩︎

  3. WezTerm is a GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust ↩︎

  4. 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. ↩︎

  5. Zellij - A terminal workspace with batteries included. ↩︎

  6. XDG Base Directory Specification ↩︎

  7. YAML Ain't Markup Language - YAML is a human-friendly data serialization language for all programming languages. ↩︎

Discussion