😎

結局 Alacritty + tmux にした話

2022/10/28に公開

はじめに

前回、Alacritty[1] と Zellij[2] と WezTerm[3] を試してみて分かったのは、

  • やっぱり Alacritty は速い(体感で分かる程に断然速い)
  • 月日は経って Alacritty は日本語をほぼ不都合なく扱えるようになっている
  • Hammerspoon を使えば Alacritty もホットキー起動(Alt 連打)が出来る on macOS
  • そして tmux も Alacritty と組みわせるのに足る程に速い

https://zenn.dev/a24k/articles/20221024-alacritty-zellij-wezterm

ということで、今秋のターミナル考は Alacritty + tmux が結論となりました。ざっと使えるように tmux の設定もしてみましたので、今回はそのメモです。

$ alacritty -V
alacritty 0.11.0 (8dbaa0b)
$ tmux -V
tmux 3.3a

tmux の基本的な設定

ちょっと前まで、tmux の設定ファイルは ~/.tmux.conf に配置するしかなかったようなのですが、バージョン 3.1 〜 3.2 あたりで対応が進んでおり、今は ~/.config/tmux/tmux.conf で読み込むようになっている様です。これは好印象です。さっそく基本的な設定を見ていきます。

TrueColor 対応

これは、イマドキのターミナルック(?)に必要不可欠ですね。macOS だと、この設定が良さそうでした。

set -g default-terminal "screen-256color"
set -ag terminal-overrides ",alacritty:RGB"

https://gist.github.com/bbqtd/a4ac060d6f6b9ea6fe3aabe735aa9d95

プレフィックスキーの変更

デフォルトのプレフィックスキーは C-b なのですが、macOS の場合 emacs キーバインドでプロンプト上を歩くこともあり、そのまま使うのはきつそうでした。左手で押しやすくて全然使わないキー・・・う〜ん・・・C-s ですね。これは Windows でしか押したことが無いです。これにします。

unbind C-b
set -g prefix C-s

マウスを有効に

これは、ほとんど使わないのですが、ホイールでスクロール出来るとちょっと良いので、有効にしておきます。

set -g mouse on

Copy モード時の操作を vi キーバインドに

Neovim のターミナルモードと同じ様な感じで、ヒストリ上を vi キーで駆け回れるようになります。これは便利だわ。

setw -g mode-keys vi

デタッチしやすく

exit ではなく detach で閉じることで、再度同じセッションに戻ってくることが出来ます。デフォルトで、prefix + d に当たっているのですが、高速でタイプしやすいように prefix + C-d にも当てておきます。これで Ctrl を押したままで C-s + C-d でデタッチ可能になります。ほぼワンタップでミスなく行けると思います。

bind C-d detach-client

離れたペインにジャンプする

隣り合ったペインについては、後述のプラグインで hjkl による移動が出来る様になるのですが、少し離れたペインへの移動や分割が多い場合などは、 display-panes を使うのが便利です。実行すると、各ペインに対応する数字がオーバーレイ表示されるので、その数字を押せばそのペインに飛べる様になります。

bind C-g display-panes
bind g display-panes
set -g display-panes-time 4000

全ペインに同じ内容を入力する

複数のサーバーに並行で入って作業をする場合なんかに便利そう(私の場合は clear する時くらいしか多分使わない)な機能です。C-s + y で Sync なので、とても満足しています。

bind y setw synchronize-panes

tpm - Tmux Plugin Manager

個々に設定するのも疲れてきたので、みんなが使う様な設定は先人達の知恵を拝借しましょう。tmux 用のプラグインマネージャ[4] がある様なので導入してみます。

tpm のインストール

せっかく設定ファイルも ~/.config/tmux/ になったので、プラグインのインストール先は ~/.local/share/tmux/plugins/ にしてみます。

$ git clone https://github.com/tmux-plugins/tpm ~/.local/share/tmux/plugins/tpm

こんな感じで tpm 本体を clone しておいて、tmux.conf から呼び出します。tmuxgitbash にパスが通っている必要がある様です。 後述の様に Alacritty から直接起動する場合など、.zshrc の設定に頼れないケースがあったので、必要な PATH を通しておきます。 必要な環境設定は、.zshenv に記述しておきましょう[5](2022-10-29 修正) あと、勝手な場所にプラグインを置くことにしたので、TMUX_PLUGIN_MANAGER_PATH でお伝えします。

TMUX_PLUGIN_MANAGER_PATH="~/.local/share/tmux/plugins"
set -g @plugin 'tmux-plugins/tpm'
run "${TMUX_PLUGIN_MANAGER_PATH}/tpm/tpm"

プラグインのインストール

こんな感じで tmux.conf に記載しておいて、prefix + I で tpm が起動してインストールをしてくれます。

set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-pain-control'
set -g @plugin 'arcticicestudio/nord-tmux'

set -g @prefix_highlight_show_copy_mode 'on'
set -g @prefix_highlight_show_sync_mode 'on'
set -g @plugin 'tmux-plugins/tmux-prefix-highlight'

tmux-plugins/tmux-sensible[6]

万人に受け入れられる基本設定だそうです。ESC キー謎のディレイ(Vim ユーザーには地獄)がなくなったり、prefix + Rtmux.conf を再読み込みしてくれたりします。

tmux-plugins/tmux-pain-control[7]

ペイン周りの操作を一通り設定してくれます。

  • prefix + hjkl での移動
  • prefix + HJKL でのサイズ変更
  • prefix + |- でのペイン分割

など、極めて直感的にペイン操作が可能です。

arcticicestudio/nord-tmux[8]

iTerm 2 時代は Gruvbox Dark というカラースキームを使っていたのですが、せっかくなので心機一転 Nord[9] を使ってみようと思います。ちょっと薄いですが、オシャレで良いと思います。

これを入れると、ステータスバーが矢羽っぽいデザインになります。Neovim のステータスバーは四角い lightline.vim[10] なので、見分けも付いて良い感じです。

tmux-plugins/tmux-prefix-highlight[11]

prefix が押された状態をステータスバーに表示してくれます。手が狂った時に頼りになりそうです。また、Copy モードや Sync モード時も表示をしてくれます。

ステータスバーの微調整

さて Nord のプラグインがステータスバーも良い感じにしてくれたのですが、気に入らない点が 3 つあります。

  • ホスト名表示の色を変えたい
  • ホスト名のドメイン部分が .local とかなので要らない
  • 時計は要らない(macOS の場合、時計は右上に居るので不要です)

ここまでの設定で、ステータスバー(の右側)は以下の様な設定となっている様です。

$ tmux show-options -gv status-right
#{?client_prefix,#[fg=black]#[bg=brightcyan]#[fg=brightcyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=brightcyan]#[fg=black]^S,#{?pane_in_mode,#[default]#[fg=brightcyan]#[bg=black]#[bold]#[fg=brightcyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=brightcyan]#[fg=black]Copy,#{?synchronize-panes,#[default]#[fg=default]#[bg=yellow]#[fg=brightcyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=brightcyan]#[fg=black]Sync,#[default]#[fg=default]#[bg=default]}}}#[default]#[fg=brightblack,bg=black,nobold,noitalics,nounderscore]#[fg=white,bg=brightblack] %Y-%m-%d #[fg=white,bg=brightblack,nobold,noitalics,nounderscore]#[fg=white,bg=brightblack] %H:%M #[fg=cyan,bg=brightblack,nobold,noitalics,nounderscore]#[fg=black,bg=cyan,bold] #H 

・・・長いですね。これを 1 から構築し直すのも面倒(というか沼)なので、スクリプトでこちょこちょ書き換えてやることにしましょう。

tmux.conf
run ~/.config/tmux/status.sh
status.sh
#!/bin/bash
set -e
status_right=`tmux show-options -gv status-right | sed \
    -e 's/brightcyan/cyan/g' \                          # prefix-hightlight の色変更
    -e 's/#\[fg=brightblack,bg=black.* %H:%M //g' \     # 時計を除去
    -e 's/fg=cyan,bg=brightblack/fg=blue,bg=black/g' \  # ホスト名の色変更(矢羽)
    -e 's/fg=black,bg=cyan/fg=black,bg=blue/g' \        # ホスト名の色変更(本体)
    -e 's/ #H / #h /g' \                                # ホスト名からドメイン部分を除く
    `
tmux set-option -g status-right "$status_right"

こんな感じですかね。ひとまず使い物になりそうです。

$ tmux show-options -gv status-right
#{?client_prefix,#[fg=black]#[bg=cyan]#[fg=cyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=cyan]#[fg=black]^S,#{?pane_in_mode,#[default]#[fg=cyan]#[bg=black]#[bold]#[fg=cyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=cyan]#[fg=black]Copy,#{?synchronize-panes,#[default]#[fg=default]#[bg=yellow]#[fg=cyan]#[bg=black]#[nobold]#[noitalics]#[nounderscore]#[bg=cyan]#[fg=black]Sync,#[default]#[fg=default]#[bg=default]}}}#[default]#[fg=blue,bg=black,nobold,noitalics,nounderscore]#[fg=black,bg=blue,bold] #h

Alacritty 起動時に tmux を起動する

tmux の設定は概ね良さそうですので、Alacritty 起動時に自動的に tmux が立ち上がる様にします。正確には、tmux の default というセッションにアタッチする様にします。default セッションが無い場合は、新たに作成します。

alacritty.yml (2022-10-29 修正)
shell:
  program: /bin/zsh
  args:
   - -l
   - -c
   - 'tmux a -t default || tmux new -s default\; source ~/.config/tmux/default.session.conf'

これで、C-s + C-d で Alacritty ごと終了し、Alt + Alt でまた同じ状態に戻ってくる様になります。これは iTerm 2 の時にはなかった新感覚です。

セッションの初期設定

default セッションの新規作成時には、以下の様な設定を読み込んでいます。初期状態で、適当にペインを切ってサイズを揃えています。なんとなく普段からこのくらいは使うので、しばらくこれで使ってみます。

default.session.conf
split-pane -h
split-pane -v
split-pane -v

select-pane -t 0
setw main-pane-width 140
select-layout main-vertical

ポップアップで一時作業を効率的に

tmux バージョン 3.2 から、ポップアップという機能が追加されています。現在開いているセッションとは別に、オーバーレイ(ポップアップ?)で新たなターミナルを立ち上げられる機能の様です。こうやって記事を書きながら途中で git 触りたい時など、便利そうな気がします。

bind Space popup -xC -yC -w70% -h70% -E 'tmux a -t popup || tmux new -s popup'

いったんこんな感じの設定にしてみました。prefix + Space で立ち上がります。ポップアップ用に popup というセッションを立ち上げる様になっています。作業が途中なら C-s + C-d で抜ければ popup セッションを活かしておけますし、一時作業が終わったら C-d で抜ければ次は新しいセッションになります。

ポップアップで tig を立ち上げる (2022-10-29 追記)

Neovim で作業中にポップアップで tig を立ち上げられたら良いなと思い設定してみました。

bind t popup -xC -yC -w70% -h70% -d '#{pane_current_path}' -E 'tig'
bind T clock-mode

こんな感じで prefix + t を押すと、カレントディレクトで tig が立ち上がります。かなり良いです。clock-mode はあまり使わないと思うのですが、いちおう prefix + T に逃がしておきました。

おわりに

スクショも貼らずに書き殴ってしまいましたが、この記事を書く間も特に大きな不都合はなかったので、しばらくこの環境で暮らしていけそうです。tmux の自由度はかなり高そうなので、これからも微調整は続くと思われます。長いものに巻かれた感はありますが、Alacritty + tmux 良すぎました。

脚注
  1. Alacritty - A cross-platform, OpenGL terminal emulator. ↩︎

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

  3. WezTerm ↩︎

  4. tpm - Tmux Plugin Manager ↩︎

  5. zsh Files - Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, commands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc. Finally, if the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read. ↩︎

  6. Tmux sensible - A set of tmux options that should be acceptable to everyone. ↩︎

  7. Tmux Pain Control - Tmux plugin for controlling panes. Adds standard pane navigation bindings. ↩︎

  8. Nord tmux - An arctic, north-bluish clean and elegant tmux theme. ↩︎

  9. Nord - An arctic, north-bluish color palette. ↩︎

  10. lightline.vim - A light and configurable statusline/tabline plugin for Vim ↩︎

  11. Tmux prefix highlight - Plugin that highlights when you press tmux prefix key. ↩︎

Discussion