tmuxの設定の書き方!構文からトラブルシューティングまで
tmuxはデフォルト設定でも便利ですが、カスタマイズするともっと便利になります。今回はtmux初心者向けに「tmuxの設定ファイルの書き方」を解説します。
tmux自体の基本的な説明・使い方は別の記事にて解説しています。
「コピーモード」「ステータスバー」「プラグイン」の設定はそれぞれ別の記事で解説予定です。
設定ファイルの場所
tmuxの設定ファイルは次のいずれかに書きます。
~/.tmux.conf
~/.config/tmux/tmux.conf
設定ファイルの優先順位
tmuxは次の順序で設定ファイルを探して、存在すればその設定を追加で読み込んでいきます。つまり、同じオプション・キーバインドを設定したら後から読み込まれるものが優先されます。
/etc/tmux.conf
(環境によって違うため後述。システム全体の設定)~/.tmux.conf
$XDG_CONFIG_HOME/tmux/tmux.conf
~/.config/tmux/tmux.conf
基本は~/.tmux.conf
か~/.config/tmux/tmux.conf
のどちらかだけで問題ありません。
設定ファイルの構文(基本)
※まずは書き方だけで、実際のコマンドの意味などは後で解説します。
tmuxの設定ファイルの構文は結構単純です。tmux foo bar
といったコマンドからtmux
を取り除いたものをつらつらと書いていくだけです。
たとえば、ステータスバーの色を設定するコマンドは コマンドラインからだと 次のように実行できます。
tmux set-option -g status-style bg=cyan
これを 設定ファイルに書くと こうなります。
set-option -g status-style bg=cyan
コメントアウト
設定ファイルでは#
を使ってコメントも書けます。
# いぇーい。見てるぅ〜?コメントだよ!set-option -g status-style bg=cyan
長い行を複数行に分けて書く
長めの設定は1行だと見づらいです。そんなときは\
を活用しましょう。行末に\
があると、その行と次の行は結合されてから処理されます。
# lazygitをポップアップで開くキーバインドを prefix + g に設定bind-key g display-popup -w 95% -h 90% -E \ -d '#{pane_current_path}' \ 'lazygit --use-config-dir=$HOME/.config/lazygit'
設定の反映方法
一番先に知っておいてほしいのが設定の反映方法です。
次のコマンドで反映できます。
# 設定ファイルの場所は各自に合わせて書き換えtmux source-file ~/.tmux.conf
でも毎回これを入力するのは面倒ですよね。次の設定が便利です。
# 設定ファイルの場所は各自に合わせて書き換えbind-key r source-file ~/.tmux.conf \; display-message "Reload Config!!"
prefix+rを入力すると、設定ファイルが読み込まれて反映できます。
ファイル読み込みだけだと 本当に読み込まれたかが分かりづらい ため、display-message
でメッセージを表示しています。
※途中の\;
はbind-key
のセクションで解説します。
set-option オプションの設定
オプションの設定はset-option
(略:set
)を使います。
# どちらも同じset-option -g status-style bg=cyanset -g status-style bg=cyan
細かいオプションの種類
先ほどから出てくる-g
が気になりますよね。set-option
では、どの単位でそのオプションを適用するかを決められます。
-s
: サーバー(ソケット)単位- 99%の人は使いません
tmux -L
オプションで別のソケットを用意する時
-g
:全セッション単位- 基本これ
- 指定なしの場合:特定のセッション単位
wg
:全ウィンドウ単位- ウィンドウに関わるやつは基本これ
w
:特定のウィンドウ単位p
:特定のペイン単位
具体的な例を見ていきましょう。
prefixの変更
デフォルトのprefixキーはCtrl+bですが、これを変更できます。筆者は押しやすいCtrl+sにしています。
set-option -g prefix C-s
Ctrl+◯をC-◯
のように書きます。Altキー(Metaキー)の場合はM-◯
のように書きます。
MacでoptionキーをAltキー(Metaキー)として扱いたい場合、ターミナル側で別途設定が必要です(Weztermの例は後半で説明)。
history-limitの上限緩和
tmuxでさかのぼれる行数はhistory-limit
で決まっており、デフォルト値は2000
です。
ログだともう少し多いほうがうれしいため、筆者は5000
に設定しています。
set-option -g history-limit 5000
その他オプション
すべてのオプションはman 1 tmux
のOPTIONS
に書いてあります。
bind-key キーバインドの設定
キーバインドはbind-key
(略:bind
)で設定します。
# どちらも同じbind-key C set-option -g status-style bg=cyanbind C set-option -g status-style bg=cyan
bind-key キー 実行コマンド
という形式です。実行コマンドはtmux foo bar
のtmux
を抜いた部分です。
上記の例ではprefix+shift+cに割り当てています。
bind-keyのキーの書き方
a-zA-Z
など ほとんどのキーはそのまま 書きます。その他の特殊なキーはこんな感じ。
Up, Down, Left, RightF1 to F12, Home, IC (Insert)NPage/PageDown/PgDn, PPage/PageUp/PgUpSpace, Tab, BSpace, BTab, DC (Delete), EndEnter, Escape
クオートは別のクオートで囲みます。
bind-key '"' split-windowbind-key "'" new-window
修飾キーはこんな風に書きます。
設定したいキー | tmux.conf |
---|---|
Ctrl | C-◯ か^◯ |
Shift+◯ | S-◯ 。S-Up など。アルファベットはS- は使わずZ のように大文字 |
Alt+◯ | M-◯ |
prefixなしで割り当てる
prefixなしでキーを設定したい場合、次のように-n
または-T root
と書きます。
bind-key -n M-o display-message "Foo!"bind-key -T root M-o display-message "Foo!"
複数のコマンドを割り当てるには?
複数のコマンドを連続して実行するには\;
で区切ります。
bind-key r source-file ~/.tmux.conf \; display-message "Reload Config!!"
;
だけや他の書き方もありますが、推奨されているのは\;
のようです。
実践的なカスタマイズ例
座学のような構文説明はここまでです。ここからは実際の筆者のカスタマイズを交えた解説をします。
ウィンドウ分割
まずはウィンドウ分割(split-window)です。紛らわしいですが増えるのはペインです。
# ¥(\) | でペインを縦に分割するbind-key \\ split-window -h -c '#{pane_current_path}'bind-key | split-window -h -c '#{pane_current_path}'
# - でペインを横に分割するbind-key - split-window -v -c '#{pane_current_path}'
-c
でディレクトリを指定してペインを開きます。
#{pane_current_path}
というのはtmuxの変数です。「現在のペインのカレントディレクトリ」を表します。man 1 tmux
のFORMATS
に詳しく載っています(変数は200以上あってめっちゃ多いです)。
ペイン間移動
ペイン間の移動はVimライクにしています。
# Vimのキーバインドでペインを移動するbind-key h select-pane -Lbind-key j select-pane -Dbind-key k select-pane -Ubind-key l select-pane -R
この設定ではselect-pane
で方向を指定しています。
ウィンドウ間移動
ウィンドウ間の移動は次のようにprefixなしで設定しています。
bind-key -n M-p previous-windowbind-key -n M-n next-window
ウィンドウの並び変更
ウィンドウの並び順を変更する設定もしてます。
bind-key -n M-h swap-window -t -1 \; previous-windowbind-key -n M-l swap-window -t +1 \; next-window
M-h
で「今のウィンドウを前に並び替え」、M-l
は後ろに並び替えです。
ペインのリサイズ
ペインのリサイズもVimライクにしています。
# Vimのキーバインドでペインをリサイズする# -r 少しの間prefixなしで連続入力できるbind-key -r H resize-pane -Lbind-key -r J resize-pane -Dbind-key -r K resize-pane -Ubind-key -r L resize-pane -R
-r
オプションを使うと、少しの間はprefixなしで連続入力できます。
-r
なし:prefix+H、prefix+H、prefix+H-r
あり:prefix+H、H、H
連続入力ができる時間はrepeat-time
というオプションで変更できます。デフォルトは500
ミリ秒です。
# 連続入力できる時間(ミリ秒)set-option -g repeat-time 1000
条件分岐をする
if-shell
(略:if
)を使うと、条件分岐が書けます。
if-shell "判定コマンド" "成功時のコマンド" "失敗時のコマンド"
"判定コマンド"
は/bin/sh
で実行されます。これが成功すれば"成功時のコマンド"
、失敗なら"失敗時のコマンド"
が実行されます。
一番単純な例を見てみましょう。
# 失敗時は省けるif-shell "true" "bind-key q display-message 'Ninja!'"
※true
は常に成功するのでキーバンドは設定されます。
which コマンド名
など、コマンドの有無とかで使えそうです。
ペイン間移動(折り返し無し)
もっと便利なif-shell
を見てみましょう。
bind-key h if-shell -F '#{pane_at_left}' '' 'select-pane -L'bind-key j if-shell -F '#{pane_at_bottom}' '' 'select-pane -D'bind-key k if-shell -F '#{pane_at_top}' '' 'select-pane -U'bind-key l if-shell -F '#{pane_at_right}' '' 'select-pane -R'
さて。ここまでの復習のような設定です。bind-key
はすでに説明しました。ではキーバインド入力時に実行されるコマンドの部分を見てみましょう。
select-paneの仕様
select-pane
はそのままだと折り返しになります。たとえばselect-pane -L
だと「左のペインに移動」となりますが、一番左のペインで実行すると一番右のペインへ移るのです。
if-shellのFオプション
if-shell
で-F
を使うと、判定部分はコマンドの実行ではなく変数展開となります。
if-shell -F '#{pane_at_left}' '' 'select-pane -L'
#{pane_at_left}
は「ペインがウィンドウの左側なら1を返す」tmuxの変数です(詳細:man 1 tmux
のFORMATS
)。
つまり上記のif-shell
は、「左にペインが無いなら何もしない。あれば左のペインに移動」という条件分岐です。
マウス操作
マウスによるスクロールやクリックを使うにはmouse
オプションをon
にします。
set-option -g mouse on
tmuxのペインのスクロールよりも、VimやlazygitといったTUI内のスクロールが優先されます。ドラッグの範囲選択も同様です。
過去のtmuxではスクロール優先やコピーモードとの兼ね合いがあって、WheelUpPane
やWheelDownPane
に自作の複雑なキーバインドを割り当てる方も多かったです。現在はオプションの設定だけで問題ありません。
FAQとトラブルシューティング
随時追記します。
設定が反映されない
原因がいくつかあるので順に試してください。
読み込むファイルがあっているか
「設定の反映方法」で書きましたが、読み込むファイルを確認しましょう。
tmux source-file <ここ合ってる?>
上書き形式ってことに注意
たとえば「bind-key
で設定したのを削除したけど反映されない」というケースがあります。これはsource-file
が単にファイルを読み込むだけだからです。同じオプション・キーバインドなら上書きされますが、削除しただけの設定はまだ残っています。
キーバインドの解除にはunbind-key
を実行します。
tmux unbind-key o
set-option
の場合はデフォルト値で上書きします。「デフォルト値なんて知らん!」という場合、tmuxのDeepWikiやご愛用のAIに聞けば一発です。
構文ミスかも
構文などがあっているか確認しましょう。設定ファイルだけじゃなくてtmux 〇〇
のような「シェルでの実行」や、prefix+:による「tmuxのコマンドラインでの実行」だと確認しやすいです。
筆者がよくやるミスはクオートの書き忘れです。
バージョンは最新?
tmux -V
でtmuxのバージョンが最新であるか確認してください。
ちなみに「どのバージョンから使えるんだ?」と更新履歴を確認したくなったらCHANGESを見たりtmuxのDeepWikiで聞くのがいいでしょう。
プラグインとの競合
tmuxでプラグインを使っている場合、プラグインマネージャーの初期化処理が最後になっているか確認しましょう。
# ...run '~/.tmux/plugins/tpm/tpm'
最後以外に書いてしまうと、一部の設定が反映されません。
一時的に違う設定ファイルを読み込みたい
tmuxに関わるスクリプトの動作確認や録画CLIのvhsを使う場合、一時的に別の設定ファイルを使いたくなるでしょう。その場合は起動時のオプション-f
で指定します。
tmux -L default kill-servertmux -f ~/foo/bar.conf
前のサーバーが残ったままだと設定も残ったままになるため、kill-server
してから起動しましょう。
optionキーは使えないの?
WindowsキーボードだとAltキー(Metaキー)をM-◯
として設定できます。MacでoptionでもM-◯
を設定したい場合、ターミナル側の設定が必要です。
たとえばWeztermの場合、次のように書きます。
local wezterm = require("wezterm")local config = {}local target = wezterm.target_triplelocal key_table = {}
local function append_array(array, other) for _, value in ipairs(other) do table.insert(array, value) endend
if target:find("darwin") then local mac_key_table = { { key = "h", mods = "OPT", action = { SendKey = { key = "h", mods = "ALT" } } }, { key = "l", mods = "OPT", action = { SendKey = { key = "l", mods = "ALT" } } }, { key = "n", mods = "OPT", action = { SendKey = { key = "n", mods = "ALT" } } }, { key = "o", mods = "OPT", action = { SendKey = { key = "o", mods = "ALT" } } }, { key = "p", mods = "OPT", action = { SendKey = { key = "p", mods = "ALT" } } }, { key = "q", mods = "OPT", action = { SendKey = { key = "q", mods = "ALT" } } }, { key = "s", mods = "OPT", action = { SendKey = { key = "s", mods = "ALT" } } }, { key = "¥", action = wezterm.action.SendKey({ key = "\\" }) }, } append_array(key_table, mac_key_table)end
config.keys = key_tablereturn config
escape-timeって変えた方がいいの?
古い記事を見ると次のような記述を見ることがあるかもしれません。
set-option -s escape-time 50
escape-time
はキーがEscであると判定するための時間の設定値です。以前はこの値が500
であったため、VimやNeovimで多用するEscキーが「なんだか遅い」というときにこの値を小さくしていました。
しかしtmuxのバージョンが3.5以上であれば escape-time
の変更は不要 です。デフォルト値が10
に変わっています。
システム全体で設定したい
ssh先にtmuxをインストールして使うような複数人で運用する環境もあるでしょう。そんなときはユーザー単位ではなく「システム全体」で共通分だけ設定したいかもしれません。
システム全体として設定したい場合は/etc/tmux.conf
などに書きます。この場所は端末によって違うため、manコマンドのFILES
セクションで確認してください。
man 1 tmux
たとえば筆者はMacのHomebrewでインストールしたため、/opt/homebrew/etc/tmux.conf
がシステム全体設定の場所でした。ただ、筆者にはシステム全体の設定は必要ないのでファイルは作っていません。
少々長くなりましたが、tmuxの設定ファイルの書き方を解説しました。tmuxはドキュメントを漁るたびに新発見があります。