結局 Alacritty + tmux にした話
はじめに
前回、Alacritty[1] と Zellij[2] と WezTerm[3] を試してみて分かったのは、
- やっぱり Alacritty は速い(体感で分かる程に断然速い)
- 月日は経って Alacritty は日本語をほぼ不都合なく扱えるようになっている
- Hammerspoon を使えば Alacritty もホットキー起動(Alt 連打)が出来る on macOS
- そして tmux も Alacritty と組みわせるのに足る程に速い
ということで、今秋のターミナル考は 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"
プレフィックスキーの変更
デフォルトのプレフィックスキーは 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
から呼び出します。tmux
と git
と bash
にパスが通っている必要がある様です。 後述の様に 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'
[6]
tmux-plugins/tmux-sensible万人に受け入れられる基本設定だそうです。ESC キー謎のディレイ(Vim ユーザーには地獄)がなくなったり、prefix + R
で tmux.conf
を再読み込みしてくれたりします。
[7]
tmux-plugins/tmux-pain-controlペイン周りの操作を一通り設定してくれます。
-
prefix + hjkl
での移動 -
prefix + HJKL
でのサイズ変更 -
prefix + |-
でのペイン分割
など、極めて直感的にペイン操作が可能です。
[8]
arcticicestudio/nord-tmuxiTerm 2 時代は Gruvbox Dark というカラースキームを使っていたのですが、せっかくなので心機一転 Nord[9] を使ってみようと思います。ちょっと薄いですが、オシャレで良いと思います。
これを入れると、ステータスバーが矢羽っぽいデザインになります。Neovim のステータスバーは四角い lightline.vim[10] なので、見分けも付いて良い感じです。
[11]
tmux-plugins/tmux-prefix-highlightprefix
が押された状態をステータスバーに表示してくれます。手が狂った時に頼りになりそうです。また、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 から構築し直すのも面倒(というか沼)なので、スクリプトでこちょこちょ書き換えてやることにしましょう。
run ~/.config/tmux/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
セッションが無い場合は、新たに作成します。
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
セッションの新規作成時には、以下の様な設定を読み込んでいます。初期状態で、適当にペインを切ってサイズを揃えています。なんとなく普段からこのくらいは使うので、しばらくこれで使ってみます。
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 良すぎました。
-
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. ↩︎
-
Tmux sensible - A set of tmux options that should be acceptable to everyone. ↩︎
-
Tmux Pain Control - Tmux plugin for controlling panes. Adds standard pane navigation bindings. ↩︎
-
Nord tmux - An arctic, north-bluish clean and elegant tmux theme. ↩︎
-
lightline.vim - A light and configurable statusline/tabline plugin for Vim ↩︎
-
Tmux prefix highlight - Plugin that highlights when you press tmux prefix key. ↩︎
Discussion