tmuxのステータスライン設定方法!〜カスタマイズしやすいテンプレ付き〜

tmuxで「ステータスライン」をカスタマイズすると、便利&見た目がオシャレになってテンションがアガります

というわけでステータスラインの設定方法を解説します。

この記事で学べること

長いのでどういう記事かざっと書いておきます。

  • ステータスラインとは
  • ステータスラインの設定の書き方(構文)
  • すぐに設定できるテンプレ(実例)
  • トラブルシューティング

※tmux関係の記事は他にも書いています。「まだ知らないぞ」ってことがあれば一緒にご覧ください。

※この記事はバージョン3.5aのtmuxに基づいて書いています。

ステータスラインとは何か

ステータスラインはtmuxの画面下部に表示できるエリアです。

デフォルト設定でのtmuxの起動画面

「tmuxのウィンドウ一覧」「日時」といった情報がデフォルト表示です。カスタマイズすれば「ブランチ名」「今日の天気」といった自由な情報を表示できます。

この記事で最終的に設定できるステータスラインの見た目

この記事では、次の画像のようなステータスラインを設定できるようにするのが目標です。

実際のステータスラインの例

画像の例ではベルマークが付いていますね。ベルが鳴ったらtmuxのステータスラインでも確認できるように設定しています。
このおかげでClaude Codeのタスク完了がどのウィンドウなのか一目で分かります

※Nerd FontsとしてHackGen Console NF白源)を使っています。

3つの領域

ステータスラインには3つの領域があります。デフォルト表示だと次のような構成。

ステータスラインの説明
名前位置デフォルトの表示
status-left左側セッション名
window-status-*中央ウィンドウ一覧
status-right右側時刻など

中央だけwindow-status-*なのは少し特殊だからです。詳しくはあとで説明します。

ステータスラインの書き方

書き方を学んでからじゃないと黒魔術に見えてまうので、ちょっと座学っぽい話になりますがこの段階で習得しておきましょう。

基本的な構文

構文そのものは単純で、tmux コマンド名 オプションを書いていくだけです。詳しくは別の記事に書いています。

フォーマット部分の書き方

次のように書くと、単に文字列が渡されるだけです。

set-option -g status-left "foo"
set-option -g status-right "buz"

ここでstatus-leftのデフォルト値を見てみましょう。

Terminal window
set-option -g status-left "[#S] "

[]は文字列そのままです。#Sは「現在のセッション名」を表す変数です。tmuxでは#〇〇のように書くことで変数を扱えます

変数の書き方

通常は#{変数名}のように書き、よく使われるものには#Sのような短縮形が用意されています。

よく使いそうな変数まとめ

よく使いそうなやつをまとめておきます。詳しくはman 1 tmuxFORMATSセクションに全部書いてあります。

変数名短縮形内容
#{session_name}#Sセッション名default0
#{host}#Hホスト名eetannMacBook-Pro.local
#{active_window_index}アクティブなウィンドウのインデックス
#{window_name}#Wウィンドウ名プロジェクトA
#{window_bell_flag}ベルが鳴ったら1を返す10

値の確認はstatuls-leftの設定やdisplay-messageの実行が便利です。

Terminal window
tmux set-option -g status-left "#{host}"
tmux display-message "#{host}"

外部コマンドの実行

外部コマンドの実行結果を入れたいなら#(コマンド)と書きます。

set-option -g status-left '#(echo $EDITOR)'

ちなみに表示されるコマンド結果は最後の1行のみです。次の例だとbarだけが表示されます。

set-option -g status-left '#(echo "foo\nbar")'

条件式

#{?変数名,真の場合,偽の場合}のように書くと、分岐できます。

set-option -g status-left "#{?pane_in_mode,yes,no}"

変数が存在して0以外の値なら「真」、それ以外は「偽」です。

#{pane_in_mode}は現在のペインが何らかのモード(コピーモードとか)に入ったときに1を返す変数です。

(マニア向け)モードって?

マニア向けなのでここは読み飛ばしOKです。

前述の#{pane_in_mode}でモードの話が出てきました。モードといえばコピーモードですが、tmuxではコピーモード以外のモードもあるようです。

  • コピーモード
  • ビューモード(list-keysの実行など)
  • 選択モード(choose-〇〇の実行など)

モードは#{pane_mode}で確認できます。

set-option -g status-left "#{pane_mode}"

色とスタイルの設定

tmuxのステータスラインは単に文字列を表示できるだけじゃなく、色や太文字といった装飾もできます。

スタイルの書き方

オプション指定するだけならfg=redのようにスタイルを直接書きます。

set-option -g pane-border-style fg=red

status-leftのようなフォーマット指定なら#[]形式で文字列として書きます。

set-option -g status-left "#[fg=red]foo"

上記の場合、赤でfooという文字が表示されます。

複数指定するなら,で区切ります。

set-option -g pane-border-style fg=red,bg=white
set-option -g status-left "#[fg=red,bg=white]foo"

色の指定

ここまでの例で察しているかもしれませんが、文字色はfg(foreground=前景)、背景色はbg(background)に書きます。指定できる値は次のとおりです。

名前で指定

よく使われる色は名前で指定できます。blackredgreenyellowbluemagentacyanwhiteが名前指定できます。

colourXで指定

colour0colour255のような指定ができます。対応が分かりづらいので筆者は使っていません。

set-option -g pane-border-style fg=colour1

colourです。colorではありません。

16進数のカラーコードで指定

馴染みのある色指定はやはり16進数のRGBでしょうか。

set-option -g pane-border-style fg=#FF0000

16進数指定(True Color)の対応環境の確認・設定方法は後で解説します。

属性(装飾)の指定

太文字なども指定できます。

set-option -g status-left "#[fg=red,bold]foo"

使えるのはこんな感じ。

名前内容
bold,bright太文字
dim薄く表示
reverse文字色・背景色を入れ替え
hidden非表示
italics斜体
strikethrough取り消し線
overline上線
underscore下線
double-underscore二重下線
curly-underscore波線下線
dotted-underscore点線下線
dashed-underscore破線下線
blink点滅(これだけ謎にアニメーション)

スタイルを切り替える

スタイルは文字列の途中で切り替えできます。単にもう一度#[]を使うだけです。

set-option -g status-left "#[fg=red,bold]foo#[fg=white,underscore]bar"

途中でデフォルトのスタイルに切り替えたくなったら#[default]と書きます。

特定の属性だけオフにしたくなったら#[nobold]のように#[no〇〇]と書きます。

set-option -g status-left "#[fg=red,bold]foo#[nobold,underscore]bar"

ユーザーオプションを使って色に名前をつけておく

「ユーザーオプション」として定義しておくと 頻繁に使う色を使いませます

ユーザーオプションは変数のようなものでset-option @名前 値と定義します。

set-option -g @mycolor "#00BBBB"
set-option -g status-left "#[fg=#{@mycolor}]foo"

オプションを参照するときは#{@名前}のように書きます。

オプションと実例

文法説明はここまでです。ここからはカスタマイズしやすい形のテンプレを紹介します。見た目はこんな感じ。

実際のステータスラインの例

まずは色の定義

最初に色を定義します。

set-option -g @c-base-100 "#001C23"
set-option -g @c-base-content "#FFD6A7"
set-option -g @c-primary "#BEFF00"
set-option -g @c-primary-content "#507000"
set-option -g @c-neutral "#003741"
set-option -g @c-neutral-content "#FFD6A7"
set-option -g @c-info "#00BAFE"
set-option -g @c-info-content "#042E49"

デフォルトスタイルの設定

status-styleでデフォルトのスタイルを設定します。

set-option -g status-style "bg=#{@c-base-100}"

今回は設定しませんが、領域ごとにもデフォルトスタイルを指定できます。

  • status-left-style
  • window-status-style
  • status-right-style

status-rightを設定する

まずは簡単なstatus-rightを見てみましょう。画像右下の「日時」の部分です。

実際のステータスラインの例

これは次のように定義します。

set-option -g status-right '#( \
label="%m/%d(%a) %H:%M"; \
bg="#{@c-base-100}"; \
color="#{@c-info}"; \
text_fg="#{@c-info-content}"; \
echo " #[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color]"; \
)'

シンタックスハイライトで分かりやすくするために#()の中身だけ書いておきます。

#()の中身
label="%m/%d(%a) %H:%M";
bg="#{@c-base-100}";
color="#{@c-info}";
text_fg="#{@c-info-content}";
echo " #[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color]";

少し長いですがやっていることは単純で「変数を定義してechoで出力」です。

どうしても見にくいという場合は#()の中身をシェルクスクリプトに書き出してそれを読み込むのもありです。

status-leftの実例

実は筆者はstatus-leftを空にしてたので、今回の記事を書くにあたって仕事時間の表示してみました。

画像左下のCHILLの部分です。

実際のステータスラインの例
# 月〜金の10:00〜19:00まではWORK、それ以外はCHILL
set-option -g status-left '#( \
hour=$(date +%H); \
dow=$(date +%u); \
bg="#{@c-base-100}"; \
color="#{@c-info}"; \
text_fg="#{@c-info-content}"; \
if [ $dow -ge 1 ] && [ $dow -le 5 ] && [ $hour -ge 10 ] && [ $hour -lt 19 ]; then \
label="WORK"; \
else \
label="CHILL"; \
fi; \
echo "#[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color] "; \
)'

「長っ!」って思うかもしれませんがやっていることは単純です。

#()の中身を見てみましょう。単に時間帯で文字をWORKCHILLに分岐しているだけです。

#()の中身
hour=$(date +%H);
dow=$(date +%u);
bg="#{@c-base-100}";
color="#{@c-info}";
text_fg="#{@c-info-content}";
if [ $dow -ge 1 ] && [ $dow -le 5 ] && [ $hour -ge 10 ] && [ $hour -lt 19 ]; then
label="WORK";
else
label="CHILL";
fi;
echo "#[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color] ";

ウィンドウ一覧の部分

window-status-*(ウィンドウ一覧)はちょっと特殊です。まずは画像をご覧ください。
window-status-formatで一つひとつのウィンドウに対してフォーマットを指定します。

tmuxのwindow-status-xxxを解説

「現在のウィンドウ」はwindow-status-current-format、「区切り文字」はwindow-status-separatorに書きます。

ウィンドウ一覧関係のオプションでよく使いそうなのが次のやつ。

オプション内容
window-status-separator区切りの指定
window-status-style一つひとつのウィンドウのスタイル
window-status-format一つひとつのウィンドウのフォーマット
window-status-current-style現在のウィンドウのスタイル
window-status-current-format現在のウィンドウのフォーマット
window-status-bell-styleベルが鳴ったときのウィンドウのスタイル

〇〇-style〇〇-formatのような同じ名前から始まるオプションは、〇〇-style〇〇-formatの順に読み込まれます。つまり、両方に同じ属性を書いたら 〇〇-formatの方が優先 されます。

window-status-separatorの設定

ここでもう一度、今回設定するステータスラインを見てみましょう。

実際のステータスラインの例

ウィンドウ一つひとつをタブとして表現し、区切りは無しです。デフォルトだと空白であるため、変更します。

set-option -gw window-status-separator ""

window-status-formatの設定

続いて、ウィンドウ一つひとつのフォーマットを指定します。

set-option -gw window-status-format '#( \
label=" #W "; \
bg="#{@c-base-100}"; \
color="#{@c-neutral}"; \
text_fg="#{@c-neutral-content}"; \
if [ "#{window_bell_flag}" = "1" ]; then \
label=" 󱅫 #W "; \
color="#{@c-info}"; \
text_fg="#{@c-info-content}"; \
fi; \
echo "#[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color]"; \
)'

↓見やすくスクリプトの部分だけ抜き出したバージョン。

#()の中身
label=" #W ";
bg="#{@c-base-100}";
color="#{@c-neutral}";
text_fg="#{@c-neutral-content}";
if [ "#{window_bell_flag}" = "1" ]; then
label=" 󱅫 #W ";
color="#{@c-info}";
text_fg="#{@c-info-content}";
fi;
echo "#[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg]$label#[bg=$bg,fg=$color]";

まず#Wは最初の方で説明したとおり「ウィンドウ名」です。

#{window_bell_flag}は「ベルが鳴ったら1を返す変数」です。window-status-bell-styleだとフォーマットを指定ができないため、ここで分岐を入れて定義しています。

記事冒頭に書いたように、Claude Codeのタスク完了に鳴ったベルをステータスラインでも確認できるので便利です。

ベルってどうやって確認する?

次のようにprintf "\a"でベルが鳴ります。

Terminal window
sleep 2; printf "\a"

実行してすぐに別のウィンドウに移動し、ウィンドウが変化するか確認しましょう。

window-status-bell-style

実はデフォルトだとベルが鳴ったウィンドウはスタイルがreverse(反転)してしまいます。これは望ましくないため、boldを指定しました。noneでもよいです。

set-option -gw window-status-bell-style "bold"

window-status-current-format

続いて、現在のウィンドウのフォーマット指定です。
window-status-formatからベルの分岐を無くし、色を変えただけです。

set-option -gw window-status-current-format '#( \
label=" #W "; \
bg="#{@c-base-100}"; \
color="#{@c-primary}"; \
text_fg="#{@c-primary-content}"; \
echo "#[bg=$bg,fg=$color]#[bg=$color,fg=$text_fg,bold]$label#[bg=$bg,fg=$color,nobold]"; \
)'

ついでにボーダーも設定

どうせならボーダーの色も合わせたいですよね。

set-option -g pane-border-style "fg=#{@c-base-content}"
set-option -g pane-active-border-style "fg=#{@c-primary}"

トラブルシューティング

overline(上線)が表示されない

まずはターミナルがSGRに対応しているか調べましょう。

SGRとは

SGR(Select Graphic Rendition)とは、文字色や装飾を制御するためのしくみです。renditionは「表現」「演出」などの意味です。

SGRに対応しているか?

たとえばWeztermだと対応しています。

手っ取り早く確認するなら、まずはtmuxを実行していない状態で次のコマンドを実行します。

tmuxの外で実行
# prefix + d などでデタッチしてから実行!
printf "\n \x1b[53moverline\x1b[0m \n"

次のように上線が表示されれれば対応しています。

overlineの表示例

tmux側でoverlineの設定を追加

まずtmuxの外で次のコマンドを実行します。

tmuxは使わないで確認
# prefix + d などでデタッチしてから実行!
echo $TERM

この値をメモして、tmuxに次の設定をします。

set-option -gu terminal-features
set-option -as terminal-features ',YOUR-TERM-NAME:overline'

YOUR-TERM-NAMEの部分はさっき実行した「echo $TERMの値」を書きます。

-aは追記オプションです。これだけだと設定再読み込みのたびに追記されてしまうため、直前に-guでデフォルト値に戻しています。

複数の環境で使っている場合はその環境の分だけ書きます。

set-option -gu terminal-features
set-option -as terminal-features ',TERM-FOO:overline'
set-option -as terminal-features ',TERM-BAR:overline'

面倒な人は',*:overline'でもOKです(未対応の環境で困るかも?)。

重要!再起動!

最後にtmuxを再起動します。

tmuxの外で実行
# prefix + d などでデタッチしてから実行!
tmux kill-server
tmux new-session -s default # セッションの作成方法はお好きに

最後まで表示されない

ウィンドウ幅は十分なのにステータスラインが途中で途切れてしまうなら、長さ設定を変えましょう。

set-option status-left-length 50 # デフォルトが10
set-option status-right-length 80 # デフォルトが40

逆にステータスラインを非表示にしたい

ターミナル録画CLIのvhsを使っているときは、逆にステータスラインを非表示にしたいかもしれません。そういうときはoffにします。

Terminal window
set-option status "off"

※デフォルトの値はonです。

16進数の対応環境の確認・設定方法

使っているターミナルが16進数の色指定(True Color)に対応しているかはtermstandard/colorsの対応表で確認します。

次のコマンドでも確認できます。

Terminal window
printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"

オレンジで表示されれば対応しています。たとえば2025年8月23日現在のMacのTerminal.appでは非対応のため、実行すると白色でした。

非対応の環境ならターミナルを乗り換えましょう。

16進数指定を使えるようにするには

対応環境の場合、まずは次のようにterminal-featuresRGBを追記します。

set-option -gu terminal-features
set-option -sa terminal-features ",*:RGB"

昔からtmuxを使っている人はterminal-overrides*:Tcなどを書いていたかもしれませんが、tmux3.2以降は上記のようにterminal-featuresに書きます。

最後にtmuxを再起動します

tmuxの外で実行
# prefix + d などでデタッチしてから実行!
tmux kill-server
tmux new-session -s default # セッションの作成方法はお好きに

これで16進数の色指定が効きます。

色どうやって決めたらいいの?

筆者はdaisyUIのテーマabyssを参考にしました。daisyuiのテーマはOklch色空間で書かれているため、oklch.comでRGBに変換して使いました。

文字化けがある・ズレる

記事前半でさらっと書きましたが、この記事のテンプレではNerd Fontsを使っています。具体的にはHackGen Console NF白源)です。

ターミナルで正しく設定できているか確認してください。

また、フォントによってはタブ表現などがズレることがあります。その際は別のフォント・文字を使いましょう。

他におすすめの文字はある?

今回は左右がカプセルっぽい見た目、ウィンドウ一覧がタブ表現でした。Nerd Fontsではチートシートe0と検索するとPowerline系でよく使われるやつがヒットするので見てみてください。


長くなりましたが、これでtmuxのステータスラインを自在にカスタマイズできるはずです。

ちなみにステータスラインは最大5行まで表示できるらしいです(やっている人見たことない)。