tmuxとtmuxinatorで快適なターミナル環境を構築する

tmuxとtmuxinatorで快適なターミナル環境を構築する

Intro

tmux, tmuxinatorを使う、よい!よい!効率上がる!快適!快適!

キーバインドや表示の調整および、画面の分割をあらかじめ設定しておける。毎回手動でやる、悪い!

TL; DR

  • tmuxinatorを使い、tmux起動時の分割レイアウトを設定しておく(起動: tmuxinator start <名前>
  • tmuxでキーボード操作でpane、windowの移動およびスクロールができるようにする
  • アクティブなpaneを赤い枠で強調する

この記事で設定するキーバインド:

キー動作
Shift + 矢印ペイン移動(上下左右)
Alt + 左右ウィンドウ移動(前後)
Alt + 上下半ページスクロール

tmuxとtmuxinatorの紹介

まずtmux, tmuxinatorについて簡単に説明しておく。

tmuxとは

tmux-is

tmuxはターミナルマルチプレクサと呼ばれるツールで、1つのターミナルセッション内で複数のウィンドウやペインを管理できる。
画面を分割して複数のシェルを同時に表示したり、ウィンドウを切り替えたりすることができる。
さらに内部でキーバインドや見た目のカスタマイズも可能で、長年愛されているだけがある。

私の場合は主に以下の用途で使ってきた。

  • 画面分割や複数画面のshellを同時に開いておいて、キーボード操作で気軽に切り替える
  • minecraft serverをdetachして起動したままにしておき、かつ後から気軽にattachできるようにする
  • (最近はやっていないが)セッション同士のテキストのやり取りをできるようにして、複数のcoding agentを連携する

実際画面の分割だけならwindows terminalでもできるが、shellより外側で処理することになるので、少し管理が面倒になる。

tmuxinatorとは

tmuxinator-is

tmuxは上記の通り非常に便利だが、単に開いただけだと画面は分割されていない。
毎回手動で分割するのは面倒なので、その初期分割プロファイルを複数登録しておき、自在に呼び出せるようにするのが、tmuxinatorだ。

tmuxinatorのインストールとレイアウト設定

インストール手順

tmuxinatorはRubyのgemで提供されている。まずgemを用意し、その後tmuxinatorをインストールする。

1
2
sudo apt install ruby
gem install tmuxinator

インストール後は ~/.config/tmuxinator/ 以下にYAMLファイルを置くことでレイアウトを定義できる。起動は tmuxinator start <名前> あるいは省略して tmuxinator <名前> でもよい。

rootで指定したディレクトリに移動されるので、デフォルトで起点としたいフォルダがあればそれを指定する。
また、各paneごとに初期実行コマンドを指定できるので、cdやinitなど必要なコマンドを書くのもよい。
(初期化のタイミング次第で失敗するのでそのあたりの調整は必要)

ペインとウィンドウについて

設定の説明に入る前に用語を整理しておく。

  • ペイン(pane): 1つのウィンドウ内の分割された領域。それぞれが独立したシェルを持つ
  • ウィンドウ(window): ブラウザのタブに相当するもの。tmuxセッション内に複数持てる

レイアウトの設計思想

普段の作業環境はモニターの使い方によって3パターンある。

  • FHD全画面: 4ペインを縦2×横2で等分割(3ウィンドウ)
  • 4K左右半分: 6ペインを縦3×横2で等分割(3ウィンドウ)
  • 4K全画面: 12ペイン分割、横3列で左右は3分割・中央は6分割(2ウィンドウ)

FHD全画面用: 4ペイン等分割(43.yml)

tmuxinator-43

~/.config/tmuxinator/43.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
name: 43
root: ~/work/app
windows:
- main:
panes:
-
-
-
-
- sub1:
panes:
-
-
-
-
- sub2:
panes:
-
-
-
-

tmuxinator start 43 で起動する。縦2×横2の4分割を3ウィンドウ分持つ構成だ。

4K左右半分用: 6ペイン等分割(63.yml)

tmuxinator-63

~/.config/tmuxinator/63.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
name: 63
root: ~/work/app
windows:
- main:
panes:
-
-
-
-
-
-
- sub1:
panes:
-
-
-
-
-
-
- sub2:
panes:
-
-
-
-
-
-

tmuxinator start 63 で起動する。縦3×横2の6分割だ。4Kモニターの半分を使うと情報密度がちょうどよくなる。
最近はもっぱらこれ。

4K全画面用: 12ペイン複雑分割(122.yml)

tmuxinator-122

12ペイン分割は少々複雑なレイアウトになる。横3列で左右の列は3ペイン、中央の列は6ペインという非対称な構成だ。
左右の列で主な作業を行い、中央の一列で簡単な操作を行う。

このレイアウトはtmuxinatorの標準的なペイン定義だけでは再現しにくい。そこで layout キーにtmux独自のレイアウト文字列を直接指定する。レイアウト文字列は実際にtmuxでペインを作ってから以下のコマンドで取得できる。

1
tmux display-message -p '#{window_layout}'

取得した文字列をYAMLの layout フィールドに貼り付ければよい。起動は tmuxinator start 122 で行う。

ヒント

レイアウト文字列は画面サイズに依存するため、解像度が変わると再取得が必要になる場合がある

~/.config/tmuxinator/122.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
name: 122
root: ~/work/app

windows:
- main:
layout: 3f6c,237x66,0,0[237x21,0,0{79x21,0,0,1,78x21,80,0[78x10,80,0,2,78x10,80,11,10],78x21,159,0,3},237x21,0,22{79x21,0,22,4,78x21,80,22[78x10,80,22,5,78x10,80,33,11],78x21,159,22,6},237x22,0,44{79x22,0,44,7,78x22,80,44[78x11,80,44,8,78x10,80,56,12],78x22,159,44,9}]
panes:
-
-
-
-
-
-
-
-
-
-
-
-

- sub:
layout: 3f6c,237x66,0,0[237x21,0,0{79x21,0,0,1,78x21,80,0[78x10,80,0,2,78x10,80,11,10],78x21,159,0,3},237x21,0,22{79x21,0,22,4,78x21,80,22[78x10,80,22,5,78x10,80,33,11],78x21,159,22,6},237x22,0,44{79x22,0,44,7,78x22,80,44[78x11,80,44,8,78x10,80,56,12],78x22,159,44,9}]
panes:
-
-
-
-
-
-
-
-
-
-
-
-

tmuxの設定ファイル

tmux自体の動作もカスタマイズしておく。設定は ~/.tmux.conf に書く。

マウス操作の有効化

mouse,active-pane

~/.tmux.conf
1
2
3
set -g mouse on
bind-key -T edit-mode-vi WheelUpPane send-keys -X scroll-up
bind-key -T edit-mode-vi WheelDownPane send-keys -X scroll-down

mouse on だけでスクロールやペインのクリック選択が使えるようになる。viモードでもマウスホイールが効くように追加で設定している。

アクティブペインの強調

複数ペインを並べると、どこにカーソルがあるか分からなくなることがある。アクティブなペインを赤い枠線で強調するようにした。

~/.tmux.conf
1
2
3
4
set -g display-panes-time 2000
set -g pane-active-border-style fg=red,bg=default,bold
set -g pane-border-style fg=colour236,bg=default
set-option -g pane-border-format '#[align=right]#[fg=cyan]#{pane_current_path} #[default]'

pane-border-format でペイン枠にカレントディレクトリのパスを表示している。どのペインでどのプロジェクトを作業しているかが一目で分かるので重宝する。

移動ショートカット

tmux-arrow

マウスも使えるようになったが、キーボードだけで素早くペインやウィンドウを移動できると快適度がさらに上がる。

  • Shift + 矢印: ペイン移動(上下左右)
  • Alt + 左右: ウィンドウ移動(前後)
  • Alt + 上下: 半ページスクロール(copy-modeに入る)
~/.tmux.conf
1
2
3
4
5
6
7
8
9
10
11
set -g display-panes-time 2000
set -g display-panes-active-colour red
set -g display-panes-colour blue
bind-key -n S-Left select-pane -L
bind-key -n S-Right select-pane -R
bind-key -n S-Up select-pane -U
bind-key -n S-Down select-pane -D
bind-key -n M-Left previous-window
bind-key -n M-Right next-window
bind-key -n M-Up copy-mode \; send-keys -X halfpage-up
bind-key -n M-Down copy-mode \; send-keys -X halfpage-down

-n フラグはプレフィックスキー(後述)なしで直接バインドすることを意味する。Shiftやaltの組み合わせなら他のキーバインドと衝突しにくいので、プレフィックスなしにしても問題が出にくい。

修飾キーはお好みで

Shift,Altにしたのは他のキーバインドとの兼ね合い(Windows Terminal)およびカスタムキーボードの配列の関係なので、そこは自由に変えてほしい。

その他の基本設定

~/.tmux.conf
1
2
3
set -g prefix C-j
unbind C-b
setw -g mode-keys vi

tmuxのプレフィックスキーはデフォルトで Ctrl-b だが、押しにくいので Ctrl-j に変更している。

viキーバインドモードにすることでコピーモード中の移動をhjklで行えるようになる。
(結局これはあまり使っていない。カスタムキーボードということもあり、矢印で移動しているからだ)

全設定をまとめると以下になる。

~/.tmux.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# プレフィックスキーを C-j に変更
set -g prefix C-j
unbind C-b
setw -g mode-keys vi

# マウス操作を有効化
set -g mouse on
bind-key -T edit-mode-vi WheelUpPane send-keys -X scroll-up
bind-key -T edit-mode-vi WheelDownPane send-keys -X scroll-down

# アクティブペインを赤い枠で強調 / 枠線にパスを表示
set -g pane-active-border-style fg=red,bg=default,bold
set -g pane-border-style fg=colour236,bg=default
set-option -g pane-border-format '#[align=right]#[fg=cyan]#{pane_current_path} #[default]'

# ペイン番号の表示設定
set -g display-panes-time 2000
set -g display-panes-active-colour red
set -g display-panes-colour blue

# Shift + 矢印でペイン移動
bind-key -n S-Left select-pane -L
bind-key -n S-Right select-pane -R
bind-key -n S-Up select-pane -U
bind-key -n S-Down select-pane -D

# Alt + 左右でウィンドウ移動 / Alt + 上下で半ページスクロール
bind-key -n M-Left previous-window
bind-key -n M-Right next-window
bind-key -n M-Up copy-mode \; send-keys -X halfpage-up
bind-key -n M-Down copy-mode \; send-keys -X halfpage-down

設定を反映するには tmux source ~/.tmux.conf を実行するか、tmuxを再起動する。

tmuxが起動中の場合は以下のコマンドで設定をリロードできる。

1
tmux source ~/.tmux.conf

プレフィックス + :source-file ~/.tmux.conf でも同様だ。

まとめ

tmuxとtmuxinatorを組み合わせることで、希望の画面構成を一発で再現できるようになった。特にtmuxinatorのYAML定義は一度作ってしまえば使い回しが効くので、環境が変わっても即座に立ち上げられるのが便利だ。

tmux自体のキーバインドも自分の使いやすい形にカスタマイズしておくと、ターミナル操作の体験がかなり変わる。マウス有効化とShift,Alt+矢印のペイン,ウィンドウ移動,スクロールだけでも、作業効率は体感で上がるだろう。
複数プロジェクトを並行して進める場面が多い人はぜひ試してみてほしい。

コメント