
tmux入門 - セッション・ウィンドウ・ペインの基本とtmux.confの設定
当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。
tmuxは、1つのターミナルの中で複数の端末を動かし、切り離したり、あとからつなぎ直したりできるツールです。SSHで長い処理を走らせている途中で接続が切れても処理は止まらず、つなぎ直せば同じ画面の続きから作業できます。
便利なことは知っていても、「コピペした設定で何となく使っている」「スクロールの仕方が分からない」という人は多いと思います。この記事では、tmuxの仕組みから基本操作、スクロールとコピー、tmux.confの設定、自動化、つまずきやすいエラーの対処までを順に整理します。
NOTE
仕様は2026年11月10日に、tmux 3.6aのmanページ、tmux公式Wiki、CHANGESで確認しました。コマンドの実行結果は、macOSのHomebrew版tmux 3.6aで、普段の環境と干渉しない専用ソケットを使って確かめたものです。既定値はバージョンで変わることがあり、3.8との違いはその都度書きます。
tmuxとは何か、何が嬉しいのか
tmuxは「ターミナルマルチプレクサ」と呼ばれるソフトウェアです。manページには、複数の端末を1つの画面から作成、操作でき、画面から切り離してバックグラウンドで動かし続け、あとで接続し直せると書かれています。
実際の利点は次のようなものです。
| 嬉しいこと | 具体例 |
|---|---|
| 接続が切れても処理が続く | SSH先で実行したビルドやマイグレーションが、回線断やPCのスリープで止まらない |
| 1つの画面を分割できる | エディタ、開発サーバー、テストの出力を並べて見られる |
| 作業環境に戻れる | 帰宅後に別のPCからSSHして、同じウィンドウ構成の続きから作業できる |
| コマンドで操作できる | 画面構成を作るスクリプトを書いて、開発環境を一発で起動できる |
| 複数の作業を並列に見張れる | コーディングエージェントをペインごとに動かして、進み具合を並べて確認できる |
最後の使い方については、Claude Codeに別のtmuxペインを覗かせる小ネタや、エージェントの監視に特化したターミナルを紹介したcmux入門でも触れています。
サーバーとクライアントの構造
tmuxの動きを理解するうえで一番大事なのは、画面を表示しているプロセスと、シェルを動かしているプロセスが別だという点です。manページには、すべてのセッションは1つのサーバーが管理し、画面はクライアントが表示していて、サーバーと各クライアントは/tmpにあるソケットで通信すると書かれています。
ターミナルアプリ
└ tmuxクライアント ──(UNIXドメインソケット)── tmuxサーバー
├ シェル(ペイン1)
├ シェル(ペイン2)
└ npm run dev(ペイン3)tmuxコマンドを実行すると、サーバーがまだ無ければ起動し、クライアントがそのサーバーへ接続します。各ペインの疑似端末を持っているのはサーバーのほうです。
このことは実機で確かめられます。デタッチした状態のセッションでコマンドを動かし、親プロセスを調べました。
tmux -L blogtest -f /dev/null new-session -d -s proc 'sleep 300'
tmux -L blogtest display-message -p -t proc '#{pid}'
tmux -L blogtest display-message -p -t proc '#{pane_pid}'
ps -o pid=,ppid=,comm= -p <上のpane_pid>server pid=29867 ppid=1
29882 29867 sleepサーバーの親プロセスはPID 1で、どの端末にもぶら下がっていません。そしてsleepの親はサーバーです。
普通にSSHでコマンドを動かしている場合、接続が切れると端末がハングアップし、その端末につながったプロセスはSIGHUPを受け取って終了するのが普通です(シグナルの仕組みはUNIXシグナルとプロセスのライフサイクルを参照してください)。tmuxの中で動かしたプロセスの端末はサーバーが持っている疑似端末なので、クライアントがいなくなっても端末は閉じません。これが、デタッチしても処理が続く理由です。
ソケットは、環境変数TMUX_TMPDIR(未設定なら/tmp)の下のtmux-UIDというディレクトリに作られ、既定の名前はdefaultです。-Lで名前を変えると、別のサーバーを独立して動かせます。
/private/tmp/tmux-501/blogtestインストールとバージョンの確認
brew install tmuxsudo apt update
sudo apt install tmuxtmux -V2026年11月10日時点の最新の安定版は、GitHub Releasesによると2026年9月9日に公開された3.8で、Homebrewのformulaの安定版も3.8でした(brew info tmuxで確認)。aptで入るバージョンはディストリビューションごとに違うので、tmux -Vで確かめてください。その他の環境は公式のInstallingにまとまっています。
注意: tmux -Vが表示するのはコマンド自身のバージョンです。tmuxをアップグレードしても、動いているサーバーは古いままです。サーバーのバージョンはtmux display-message -p '#{version}'で確認できます。
セッション・ウィンドウ・ペインの3階層
tmuxの画面は3つの階層でできています。
tmuxサーバー
└ セッション work(作業のまとまり)
├ ウィンドウ 0: editor(タブのようなもの)
│ ├ ペイン 0(分割された端末)
│ └ ペイン 1
└ ウィンドウ 1: server
└ ペイン 0| 階層 | 例えるなら | 役割 |
|---|---|---|
| セッション | プロジェクトごとの机 | ウィンドウのまとまり。デタッチとアタッチの単位 |
| ウィンドウ | ブラウザのタブ | 画面全体を占める。1つのセッションに複数持てる |
| ペイン | タブの中の分割領域 | 1つの疑似端末。シェルなどが動く実体 |
実際に3階層を作って一覧を見ると、次のようになります。
tmux new-session -d -s demo -x 120 -y 30 -n editor
tmux split-window -h -t demo:editor
tmux split-window -v -t demo:editor.1
tmux new-window -d -t demo -n server
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command} #{pane_width}x#{pane_height}'demo:0.0 zsh 60x30
demo:0.1 zsh 59x15
demo:0.2 zsh 59x14
demo:1.0 zsh 120x30demo:0.1は「セッションdemoのウィンドウ0のペイン1」を表します。このセッション名、ウィンドウ、ペインの指定は、後で出てくる-tオプションでそのまま使います。
まず覚える操作: 起動、デタッチ、再接続
tmux # 新しいセッションを作って接続する
tmux new -s work # 名前を付けて作成する
tmux new -A -s work # workがあれば接続し、無ければ作成する
tmux ls # セッションの一覧
tmux attach # 最後のセッションに接続する
tmux attach -t work # workに接続する
tmux kill-session -t work # workを終了する
tmux kill-server # サーバーごと全部終了する名前を付けておくと、あとで迷いません。同じ名前のセッションを作ろうとすると、duplicate session: demoのようなエラーになります。
セッションから離れるには、Ctrl-bを押してからdを押します。シェルやプログラムはそのまま動き続けます。
いちばん多い使い方は次の流れです。
tmux new -A -s work
# ...作業する...
# Ctrl-b → d でデタッチする
# 回線が切れた場合も、もう一度つなぎ直すだけ
tmux new -A -s work注意: kill-serverは、そのサーバーのセッションをすべて終わらせます。実行中のプログラムも終了するので、使う場面に気を付けてください。
プレフィックスキー
tmuxの操作は、最初にプレフィックスキーを押してから、次のキーを押す2段階で行います。既定のプレフィックスはCtrl-bです。manページなどではC-bと書かれます。
押し方は「Ctrlを押しながらbを押し、指を離してから次のキーを押す」です。同時押しではありません。
キー(Ctrl-bのあと) | 動作 |
|---|---|
? | キー割り当ての一覧を表示する |
/ | 押したキーの割り当てを調べる |
: | tmuxのコマンドを入力する |
d | デタッチする |
s | セッションを選ぶ |
$ | セッションの名前を変える |
Ctrl-b | Ctrl-bそのものをプログラムへ送る |
Ctrl-bの後ろに続く:は、コマンドモードです。:resize-pane -L 10のように、この記事で出てくるコマンドは、ここからも実行できます。
ウィンドウの操作
tmux list-keysの結果とmanページから、よく使う既定のキーをまとめました。
キー(Ctrl-bのあと) | 動作 | 実体のコマンド |
|---|---|---|
c | 新しいウィンドウを作る | new-window |
n | 次のウィンドウへ | next-window |
p | 前のウィンドウへ | previous-window |
0〜9 | 番号でウィンドウへ移動する | select-window |
l | 直前のウィンドウへ戻る | last-window |
w | ウィンドウを一覧から選ぶ | choose-tree -Zw |
, | ウィンドウの名前を変える | rename-window |
& | ウィンドウを閉じる(確認あり) | kill-window |
ペインの分割と移動
キー(Ctrl-bのあと) | 動作 | 実体のコマンド |
|---|---|---|
" | 上下に分割する | split-window |
% | 左右に分割する | split-window -h |
| 矢印キー | その方向のペインへ移動する | select-pane |
o | 次のペインへ移動する | select-pane -t :.+ |
; | 直前のペインへ戻る | last-pane |
q | ペイン番号を表示する(番号を押すと移動) | display-panes |
z | ペインのズームを切り替える | resize-pane -Z |
! | ペインを新しいウィンドウに切り出す | break-pane |
x | ペインを閉じる(確認あり) | kill-pane |
Space | レイアウトを順に切り替える | next-layout |
{ / } | ペインの位置を入れ替える | swap-pane |
"と%はどちらがどちらか、とても間違えやすいキーです。tmux list-keys -Nでは"の説明が「Split window vertically」となっていて、これは画面を上下に分けるという意味です。覚えにくいので、後で紹介する設定で|と-に割り当て直す人が多いです。
ペインのサイズを変える
キー(Ctrl-bのあと) | 動作 |
|---|---|
Ctrl+矢印キー | その方向へ1セルずつ変える |
Alt+矢印キー | その方向へ5セルずつ変える |
矢印でのペイン移動とサイズ変更のキーは、-r(リピート)付きで割り当てられています。repeat-time(既定は500ミリ秒)の間は、Ctrl-bを押し直さずに続けて操作できます。
キーが使いにくいときは、コマンドで指定できます。
tmux resize-pane -t demo:editor.0 -x 40 # 幅を40列にする
tmux resize-pane -L 10 # 左へ10列広げるズーム
Ctrl-bのあとにzを押すと、今のペインをウィンドウ全体に広げます。もう一度押すと元の分割に戻ります。ログを一時的に大きく見たいときに便利です。
スクロールできないときはコピーモード
tmuxを使い始めて最初につまずくのが、「ターミナルをスクロールしても過去の出力が見えない」という問題です。
原因は、tmuxが画面全体を自分で描き直していて、各ペインの履歴はtmuxの中に持っているからです。公式FAQには、ターミナル側のスクロールバックの内容をtmuxは保証しないと書かれています。過去の出力を見るには、tmuxのコピーモードに入ります。
| やりたいこと | キー |
|---|---|
| コピーモードに入る | Ctrl-bのあと[ |
| コピーモードに入って1ページ戻る | Ctrl-bのあとPageUp |
| コピーモードを抜ける | q |
コピーモードの中のキーは、mode-keysの設定で変わります。既定はemacsですが、manページによると環境変数VISUAL(無ければEDITOR)にviという文字列が含まれているとviのキーになります。実機でも、EDITOR=nvimでサーバーを起動するとmode-keysがviになり、EDITOR=nanoではemacsになりました。「人によってキーが違う」という現象の原因はたいていこれです。
| 操作 | emacsモード | viモード |
|---|---|---|
| 選択の開始 | Ctrl-Space | Space |
| コピーして抜ける | Alt-w | Enter |
| 選択の解除 | Ctrl-g | Escape |
| 上方向に検索 | Ctrl-r | ? |
| 下方向に検索 | Ctrl-s | / |
| 次の検索結果 | n(逆向きはN) | n(逆向きはN) |
| 履歴の先頭へ / 末尾へ | Alt-< / Alt-> | g / G |
| 1ページ上 / 下 | Alt-v / Ctrl-v(PageUp / PageDownも可) | Ctrl-b / Ctrl-f |
| 行全体の選択 | 既定のキーなし | V |
| 矩形選択の切り替え | R | v または Ctrl-v |
| 抜ける | q または Escape | q |
コピーした内容はtmuxのペーストバッファに入ります。Ctrl-bのあと]で貼り付けられ、=で過去のバッファから選べます。
注意: viモードの既定では、vは選択の開始ではなく矩形選択の切り替えです。Vimの感覚に合わせるには、後の設定例のようにvを割り当て直します。
mouse onにすると何が変わるか
set -g mouse onを設定すると、マウスの操作をtmuxが受け取るようになります。list-keysで見た既定の動作は次のとおりです。
| 操作 | 動作 |
|---|---|
| ペインをクリック | そのペインを選択する |
| ステータスラインのウィンドウ名をクリック | そのウィンドウへ移動する |
| ペインの境界線をドラッグ | ペインのサイズを変える |
| ホイールを上へ | コピーモードに入ってスクロールする |
| ペインの中をドラッグ | 選択してコピーする |
ホイールの動作は、実行中のプログラムによって変わります。
WheelUpPane if-shell -F "#{||:#{alternate_on},#{pane_in_mode},#{mouse_any_flag}}" { send-keys -M } { copy-mode -e }Vimやlessのように代替画面を使っているプログラムや、マウスを要求しているプログラムにはイベントを渡し、そうでなければコピーモードに入ります。-eが付いているので、一番下までスクロールすると自動でコピーモードを抜けます。
WARNING
mouseの既定値は、tmux 3.8からオンに変わりました(CHANGES、3.8についてのissue)。手元の3.6aでは既定はオフです。バージョンアップ後に「マウスで文字が選択できなくなった」と感じたら、この変更が原因かもしれません。元に戻すにはset -g mouse offを設定します。
mouseがオンのときにターミナル本来の選択を使いたいときは、修飾キーを押しながら操作します。公式FAQでは、LinuxのターミナルではShift、iTerm2ではOptionと案内されています。
なお、3.6からはpane-scrollbarsオプションで、ペインごとにスクロールバーを表示できるようになりました。
クリップボードとの連携
tmuxのペーストバッファは、OSのクリップボードとは別のものです。OSのクリップボードへ送る方法は2つあります。
OSC 52(SSH越しでも使える)
OSC 52は、ターミナルにクリップボードの設定を頼むエスケープシーケンスです。公式WikiのClipboardによると、X11転送を設定しなくてもSSH越しに使えるのが利点で、動かすには次の3つの条件が必要です。
set-clipboardがonまたはexternalになっている- 外側のターミナルの
TERMのterminfoにMsがある(xterm*には既定で追加される) - ターミナル自身でOSC 52が有効になっている
set-clipboardの値の意味は次のとおりです。3.6aの既定値はexternalでした。
| 値 | 動作 |
|---|---|
on | tmuxがクリップボードを設定し、tmux内のプログラムからの設定も受け付ける |
external | tmuxがクリップボードを設定する。tmux内のプログラムからのバッファ作成は無視する |
off | どちらも行わない |
注意: Wikiは、onにするとtmux内のどのプログラムでもクリップボードを書き換えられるので、信頼できないコマンドを動かすときは注意するよう書いています。特に理由がなければ、既定のexternalのままで十分です。
ターミナル側の対応にはばらつきがあります。iTerm2は環境設定で有効にする必要があり、VTE系(GNOME Terminalなど)は非対応だとWikiに書かれています。Msがあるかどうかは次のコマンドで確認できます。
tmux info | grep Ms193: Ms: (string) \033]52;%p1%s;%p2%s\a外部コマンド(macOSならpbcopy)
ローカルのmacOSでは、pbcopyにパイプする方法が確実です。tmux 3.2以降はcopy-commandオプションで指定できます。
set -s copy-command 'pbcopy'copy-commandは、copy-pipe系のコマンドが引数なしで実行されたときの渡し先です。Enter(viモード)やAlt-w(emacsモード)、マウスのドラッグの既定の割り当ては引数なしのcopy-pipe-and-cancelなので、これだけで動きます。実機でも、copy-commandにcatを指定してコピーモードで1行選択し、copy-pipe-and-cancelを実行すると、選択した行がファイルに書き出されました。
一方でcopy-selection-and-cancelはペーストバッファへのコピーだけで、copy-commandには渡らないので、自分でキーを割り当てるときはcopy-pipe-and-cancelを使います。
Linuxではxselやxclipを同じように指定します。これらはXサーバーに接続するので、基本的にローカルでのみ使えます。またpbcopyもSSH先ではローカルのクリップボードに届かないので、SSH先ではOSC 52を使います。
補足: Wikiは、copy-pipeとset-clipboardが競合する場合はset-clipboard offにするよう案内しています。
tmux.confの設定
どのファイルが読まれるか
manページには、システムの設定ファイルのあとに~/.tmux.confまたは$XDG_CONFIG_HOME/tmux/tmux.confを読むと書かれていて、FILESの節には~/.config/tmux/tmux.confも載っています。
では、複数あるとどうなるのかを、Homebrew版3.6aで試しました。バイナリに埋め込まれている検索パスは次のとおりです(システムの設定ファイルの場所はビルドによって違います)。
/opt/homebrew/etc/tmux.conf:~/.tmux.conf:$XDG_CONFIG_HOME/tmux/tmux.conf:~/.config/tmux/tmux.conf3つのファイルすべてに違う値を書いて起動すると、すべてのファイルが読み込まれ、この順に後のファイルの設定で上書きされました。
@from_dot=yes # ~/.tmux.conf も読まれた
@from_xdg=yes # $XDG_CONFIG_HOME/tmux/tmux.conf も読まれた
@from_cfg=yes # ~/.config/tmux/tmux.conf も読まれた
@who=dotconfig # 同じ設定は ~/.config/tmux/tmux.conf が最後に勝つ「どちらか一方だけが読まれる」わけではないので、設定ファイルは1か所にまとめておくのが安全です。
また、manページによると、設定ファイルを読むのはサーバーの起動時の1回だけです。編集しただけでは反映されません。
設定例
最初に手を入れることの多い項目をまとめました。自分に必要なものだけ取り入れてください。全体をtmux 3.6aで読み込み、エラーが出ないことを確認しています。
# プレフィックスを Ctrl-a に変える
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# マウスを使う(3.8以降は既定でオン)
set -g mouse on
# ウィンドウとペインの番号を1から始める
set -g base-index 1
setw -g pane-base-index 1
# ウィンドウを閉じたら番号を詰める
set -g renumber-windows on
# スクロールバックを増やす(既定は2000行)
set -g history-limit 50000
# Escの待ち時間(ミリ秒)
set -s escape-time 10
# コピーモードをviキーにする
setw -g mode-keys vi
# フォーカスの変化をNeovimなどのプログラムへ渡す
set -g focus-events on
# True Color
set -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
# 分割キーを | と - にして、今のディレクトリを引き継ぐ
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
# hjklでサイズを変える
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Vimに近いコピー操作
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel
# macOSのクリップボードへ送る
set -s copy-command 'pbcopy'
# prefix + r で再読み込み
bind r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
# ステータスライン
set -g status-position bottom
set -g status-interval 5
set -g status-style "bg=colour236,fg=colour252"
set -g status-left "[#S] "
set -g status-left-length 20
set -g status-right "%Y-%m-%d %H:%M"
setw -g window-status-current-style "bold,fg=colour81"各設定の意味
| 設定 | 意味 | 3.6aの既定値 |
|---|---|---|
prefix | プレフィックスキー | C-b |
mouse | マウス操作の有効化(3.8で既定がオンに変更) | off |
base-index | ウィンドウ番号の開始値 | 0 |
pane-base-index | ペイン番号の開始値 | 0 |
renumber-windows | ウィンドウを閉じたときに番号を詰める | off |
history-limit | ペインごとの履歴の行数 | 2000 |
escape-time | Escに続く入力を待つ時間(ミリ秒) | 10 |
mode-keys | コピーモードのキー(viまたはemacs) | emacs |
focus-events | フォーカスの変化をプログラムへ渡す | off |
default-terminal | ペインの中のTERMの値 | tmux-256color(ビルドによる) |
set-clipboard | クリップボード連携の動作 | external |
status-interval | ステータスラインの更新間隔(秒) | 15 |
個別に補足します。
bind C-a send-prefix: プレフィックスを2回押すと、Ctrl-aそのものをシェルへ送れるようにします。Ctrl-aはシェルで行頭へ移動するキーとしても使うので、この行が必要です。base-index 1: キーボードの並びで、左端の1から使いたい場合に設定します。0は右端にあって遠いからです。history-limit: 3.6aのmanページでは、設定変更は新しいウィンドウにだけ効くとされています。3.7からは既存のペインにも適用されるようになりました(CHANGES)。-cと#{pane_current_path}:split-windowは-cを付けないと、セッションを作成したときのディレクトリで開きます。付けると今のペインのディレクトリを引き継ぎます。実機では次の差になりました。
# -c "#{pane_current_path}" を付けた場合
1 /private/tmp
# -c を付けない場合(セッションを作ったディレクトリのまま)
1 (セッションを作ったときのディレクトリ)再読み込み
設定を編集したら、動いているサーバーに読み込ませます。
tmux source-file ~/.tmux.conf上の例のキー割り当てがあれば、プレフィックスのあとにrで実行できます。Ctrl-bのあと:を押してsource-file ~/.tmux.confと入力しても構いません。
書いた内容の文法だけを確かめたいときは、-nを付けます。manページには、ファイルを解析するがコマンドは実行しないと書かれています。
tmux source-file -n ~/.tmux.conf注意: source-fileは書かれたコマンドを実行するだけです。設定ファイルから行を消しても、すでに反映された値は元に戻りません。戻したいときはset -uで設定を解除するか、サーバーを再起動します。
コマンドで自動化する
tmuxの操作はすべてコマンドとして実行でき、スクリプトから呼べます。
開発環境を起動するスクリプト
new-session -dでセッションをバックグラウンドで作り、ウィンドウやペインを組み立ててから接続します。
#!/usr/bin/env bash
set -euo pipefail
SESSION="myapp"
PROJECT_DIR="$HOME/work/sample-app"
attach() {
if [ -n "${TMUX:-}" ]; then
tmux switch-client -t "=$SESSION"
else
tmux attach -t "=$SESSION"
fi
}
if tmux has-session -t "=$SESSION" 2>/dev/null; then
attach
exit 0
fi
tmux new-session -d -s "$SESSION" -n editor -c "$PROJECT_DIR"
tmux send-keys -t "=$SESSION:editor" 'nvim .' Enter
tmux new-window -d -t "=$SESSION" -n dev -c "$PROJECT_DIR"
tmux send-keys -t "=$SESSION:dev" 'npm run dev' Enter
TEST_PANE=$(tmux split-window -v -P -F '#{pane_id}' -t "=$SESSION:dev" -c "$PROJECT_DIR")
tmux send-keys -t "$TEST_PANE" 'npm test -- --watch' Enter
tmux select-window -t "=$SESSION:editor"
attachポイントは次のとおりです。
=を付けると、セッション名を完全一致で探します。付けないと前方一致でも見つかるので、myがmyappに当たることがあります。- ウィンドウは番号ではなく名前(
editorやdev)で指定しています。base-indexの設定に左右されません。 split-window -P -F '#{pane_id}'で新しいペインのIDを受け取り、それをsend-keysの宛先にしています。ペイン番号はpane-base-indexで変わりますが、IDなら確実です。- 既にtmuxの中で実行したときは、
attachではなくswitch-clientを使います。tmuxの中でattachすると、後述のネストのエラーになるからです。
実行結果は次のとおりです(nvimやnpmをechoに差し替え、最後の接続を除いて確認しました)。2回目の実行では、作り直さずに既存のセッションへ分岐しました。
0 editor 1
1 dev 2send-keysは、指定したペインへキー入力を送ります。Enterのように特別なキーは名前で指定し、文字列はそのまま入力されます。
capture-paneでペインの中身を取り出す
ペインに表示されている文字を、コマンドで取得できます。
tmux capture-pane -p -t myapp:dev.0 # 見えている範囲を標準出力へ
tmux capture-pane -p -S -3 -t myapp:dev.0 # 3行前の履歴から
tmux capture-pane -p -S - -t myapp:dev.0 # 履歴の先頭から全部
tmux capture-pane -p -J -S - -t myapp:dev.0 # 折り返された行を1行につなげる| オプション | 意味 |
|---|---|
-p | バッファではなく標準出力に出す |
-t | 対象のペイン |
-S / -E | 開始行と終了行。0が見えている先頭の行で、負の数は履歴。-S -は履歴の先頭 |
-J | 折り返された行をつなげる(末尾の空白も保持) |
-e | 色などのエスケープシーケンスも含める |
たとえばseq 1 100を実行したペインでcapture-pane -p -S -を実行すると、1から100までの全行を取得できました。
AIのコーディングエージェントにほかのペインの様子を見せるときにも、この仕組みが使えます。具体例はClaude Codeに別のtmuxペインを覗かせる小ネタを参照してください。
ほかにも、次のような確認にlist-panesとdisplay-messageのフォーマットが使えます。
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}'
tmux display-message -p '#{socket_path}'SSH先での使い方
tmuxが一番役に立つのはSSH先です。接続先のサーバーでtmuxを起動すれば、手元のPCとの接続が切れても処理が続きます。SSHの仕組みはSSHの仕組みで解説しています。
ssh example-server
tmux new -A -s work1行で済ませたいときは、-tで端末の割り当てを強制します。
ssh -t example-server tmux new -A -s work-tを付けないと、tmuxが端末を開けずopen terminal failed: not a terminalになります。
接続が切れたら、もう一度SSHして同じコマンドを実行します。manページにあるとおり、セッションはSSHのタイムアウトのような不意の切断でも残り続けます。
tmuxの中でtmuxを動かす(ネスト)
tmuxの中でさらにtmuxを実行すると、次のエラーが出ます。
sessions should be nested with care, unset $TMUX to forcetmuxの中のペインでは、環境変数TMUXが設定されています。メッセージのとおりTMUXを消せば強制できますが、別のセッションへ移りたいだけなら、ネストする必要はありません。
tmux new-session -d -s other
tmux switch-client -t otherCtrl-bのあとsで、一覧から選ぶこともできます。
手元のtmuxの中からSSHして、接続先でもtmuxを使うという形のネストはよくあります。この場合、キーは外側のtmuxが先に受け取ります。内側のtmuxを操作するにはCtrl-bを2回押します(1回目は外側が受け取って、send-prefixで内側へCtrl-bを送ります)。手元と接続先でプレフィックスを変えておくと、混乱が減ります。
再起動するとセッションは消える
tmuxのセッションはサーバープロセスのメモリの中にあるので、OSの再起動やサーバーの終了で消えます。すべてのセッションが閉じたときもサーバーは終了します(exit-emptyの既定の動作)。
保存と復元を行うのが、次のプラグインです。どれもリポジトリは公開が続いていて、アーカイブされていません(GitHub APIで2026年11月10日に確認)。最終更新は、TPMが2026年5月、resurrectとcontinuumは2024年8月でした。
| プラグイン | 役割 |
|---|---|
| TPM | tmuxのプラグインマネージャー。要件はtmux 1.9以上、git、bash |
| tmux-resurrect | セッション、ウィンドウ、ペインの構成と作業ディレクトリ、一部のプログラムを保存と復元する |
| tmux-continuum | tmux-resurrectの保存を15分ごとに自動で行う。起動時の自動復元もできる |
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpmset -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
# 起動時に自動で復元する場合
set -g @continuum-restore 'on'
# この行は必ずファイルの一番下に置く
run '~/.tmux/plugins/tpm/tpm'設定を読み込んだら、プレフィックスのあとにI(大文字)でプラグインをインストールします。Uで更新です。
tmux-resurrectの操作は、プレフィックスのあとのCtrl-sで保存、Ctrl-rで復元です。
注意: 復元されるプログラムは、既定ではvi、vim、nvim、emacs、man、less、more、tail、top、htopなどの限られたものだけです。開発サーバーのようなプログラムは自動では再開されないので、前述の起動スクリプトと使い分けるのが現実的です。
Neovimと組み合わせるときの注意
Neovimの:checkhealthには、tmuxの設定を調べる項目があります。Neovim 0.11.6で、何も設定していないtmux 3.6aのペインから確認した結果が次の部分です。
tmux
- OK escape-time: 10
- WARNING `focus-events` is not enabled. |'autoread'| may not work.
- ADVICE:
- (tmux 1.9+ only) Set `focus-events` in ~/.tmux.conf:
set-option -g focus-events on
- $TERM: tmux-256colorNeovimのソースでは、次のことを確かめています。
| 確認する項目 | 指摘の内容 |
|---|---|
escape-time | 300ミリ秒を超えているとエラー。set-option -sg escape-time 10を提案 |
focus-events | onでないと警告。autoreadが動かない可能性がある |
default-terminalと$TERM | 不一致だと色がおかしくなる可能性を指摘する |
$TERM | screen-256color、tmux-256color、tmux-directのどれかであることを確認する |
| True Color | tmux show-messages -Tにsetrgbbとsetrgbfがあるか調べ、無ければ設定を提案する |
対応する設定は次のとおりです(xterm-256colorの部分は、tmuxの外でecho $TERMした値にします)。
set -s escape-time 10
set -g focus-events on
set -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"- Esc: NeovimのFAQは、
escape-timeを低い値(10〜20ミリ秒)にするよう案内しています。 focus-events: manページによると、変更後はクライアントのデタッチと再アタッチが必要です。- True Color:
terminal-featuresはtmux 3.2以降の書き方です。それより古いtmuxではterminal-overridesにTcを指定します。
True Colorが効いているかは、tmuxの中で次のコマンドを実行して確かめられます。
tmux display-message -p '#{client_termfeatures}'
tmux show-messages -T | grep -E 'setrgb|RGB'256,bpaste,ccolour,clipboard,hyperlinks,cstyle,focus,mouse,overline,RGB,strikethrough,title,usstyle
209: setrgbb: (string) \033[48;2;%p1%d;%p2%d;%p3%dm
210: setrgbf: (string) \033[38;2;%p1%d;%p2%d;%p3%dmsetrgbbとsetrgbfがあれば、RGBの色を出せます。tmuxがターミナルから機能を検出できる場合は、terminal-featuresを書かなくてもRGBが有効になることがあります(今回の実機確認がそのケースでした)。
トラブルシューティング
色がおかしい
次の順に確認します。
- tmuxの中で
echo $TERMを実行して、tmux-256colorやscreen-256colorになっているか確認する。manページはdefault-terminalにscreen、tmuxまたはその派生を指定するよう求めています。 - tmuxの外で
echo $TERMを実行し、その値でterminal-featuresにRGBを追加する。 - 設定を変えたあと、サーバーを再起動する(
tmux kill-server)。公式WikiのClipboardのページも、terminal-featuresなどを変更したあとはtmux kill-serverで完全に再起動するよう案内しています。
公式FAQによると、screen系のTERMでは斜体が無効になるので、斜体を使いたいときはtmux系を使います。
Escの反応が遅い
escape-timeが長いと、Vimなどでインサートモードを抜けるときに待たされます。tmuxはEscに続けて別の文字が届くかどうかを待って、単独のEscキーなのか、Escで始まる特殊キーなのかを判断しているからです。
set -s escape-time 10を設定します。公式FAQでは、端末と同じマシンや速いネットワークなら0でも問題なく、遅いネットワークでは大きめの値が適していると説明されています。
sessions should be nested with care
tmuxの中でtmuxを起動しようとしたときのメッセージです。上の「ネスト」の節のとおり、別のセッションへ移りたいだけならswitch-clientかCtrl-bのあとsを使います。別のサーバーを起動したい理由があるときは、env -u TMUX tmux -L otherのようにソケットを分けます。
no server running on ...
tmux lsなどで、次のように表示される場合です。
no server running on /private/tmp/tmux-501/blogtestこのソケットのサーバーが動いていないという意味です。次の可能性があります。
- すべてのセッションが終わってサーバーも終了した(
exit-empty) - OSを再起動した
-Lや-S、TMUX_TMPDIRの違いで、別のソケットを見ている/tmpのソケットファイルが消えた
最後の場合はプロセスは生きています。manページとFAQによると、サーバーにSIGUSR1を送るとソケットを作り直せます。
pgrep -l tmux
pkill -USR1 tmuxopen terminal failed
tmuxが端末を初期化できないときのエラーで、後ろの文言で原因が分かります。手元で再現した例です。
| メッセージ | 状況 | 対処 |
|---|---|---|
open terminal failed: not a terminal | cronやパイプなど端末がない環境、sshで-tを付けないとき | ssh -tを使う。スクリプトならnew-session -dにする |
open terminal failed: terminal does not support clear | TERMが空やdumbなどのとき | TERMを正しく設定する |
missing or unsuitable terminal: notexist-term | TERMに対応するterminfoが無いとき | terminfoを入れる、またはTERMを変える |
最後のエラーは、SSH先で起きやすいものです。手元のターミナルが独自のTERM(Ghosttyのxterm-ghosttyなど)を使っていて、接続先にそのterminfoが無いと発生します。とりあえず動かすには、TERMを変えて接続します。
TERM=xterm-256color ssh example-server設定を変えたのに反映されない
設定ファイルを読むのはサーバーの起動時だけです。source-fileで読み込むか、tmux kill-serverでサーバーを再起動します。読み込むファイルが複数あるときは、「どのファイルが読まれるか」の節のとおり、後のファイルに上書きされていないか確認してください。
日本語が文字化けする、_になる
公式FAQによると、tmuxは環境変数LC_ALL、LC_CTYPE、LANGからターミナルのUTF-8対応を判断し、非対応と判断すると文字を_に置き換えます。ロケールの設定を見直すか、tmux -uで強制的にUTF-8で出力します。
screen、Zellij、WezTermとの違い
同じことができるツールはほかにもあります。確認できた範囲で、短く比べます。
| ツール | 形態 | 特徴 |
|---|---|---|
| tmux | ターミナルマルチプレクサ(サーバーとクライアント) | SSH先でも動く。コマンドでの操作が充実している |
| GNU screen | ターミナルマルチプレクサ | Ctrl-aがプレフィックス。-Sで名前を付け、-rで再接続する(man screenで確認)。手元のmacOSの/usr/bin/screenは4.00.03でした |
| Zellij | ターミナルマルチプレクサ | レイアウトはKDLファイルで書く。セッションの復元が既定で有効 |
| WezTerm | マルチプレクサ機能を持つターミナルアプリ | unixドメイン、SSHドメイン、TLSドメインに接続する。SSHドメインでは接続先にも互換性のあるWezTermが必要 |
サーバーにtmuxかscreenだけ入れておけば、手元のターミナルアプリを問わずに使い続けられるのが、ターミナルの外にあるマルチプレクサの強みです。
まとめ
- tmuxは、サーバーがペインの疑似端末を持っているので、クライアントが切れても中のプログラムは動き続けます。
- 階層はセッション、ウィンドウ、ペインの3つ。
tmux new -A -s workで作成と再接続が1つのコマンドで済みます。 - スクロールできないときは
Ctrl-bのあと[でコピーモードに入ります。キーはmode-keysで変わり、EDITORの値にも左右されます。 mouseの既定はtmux 3.8からオンです。バージョンで挙動が違う点に注意してください。- 設定ファイルは複数あるとすべて読まれて上書きされるので1か所にまとめ、変更後は
source-fileで読み込みます。 - 再起動するとセッションは消えます。必要ならtmux-resurrectとtmux-continuum、あるいは起動スクリプトを使います。
参考リンク
- tmux(1) manページ(OpenBSD)
- tmux Wiki: Getting Started
- tmux Wiki: Installing
- tmux Wiki: FAQ
- tmux Wiki: Clipboard
- tmux Releases
- tmux CHANGES(3.8)
- tmux 3.8 questions and comments(issue)
- TPM
- tmux-resurrect
- tmux-continuum
- Neovim FAQ
- Neovim health.lua(v0.11.6)
- Zellij: Session Resurrection
- WezTerm: Multiplexing


