32blogby Studio Mitsu

tmux完全ガイド:ターミナル多重化で作業効率を上げる

tmuxのセッション・ウィンドウ・ペイン操作から.tmux.conf設定・SSH活用・開発ワークフローまで実例付きで解説。

by omitsu21 min read
目次

tmux はターミナルマルチプレクサだ。1つのウィンドウで複数のシェルセッションを管理でき、ペイン分割で画面を並べて使える。SSH接続が切れてもセッションが生き残るのが最大の強みだ。 apt install tmux または brew install tmux でインストールし、tmux new -s myproject でセッションを開始する。

「SSH接続が切れてビルドが中断した」「ターミナルのタブが20個開いてどれがどれかわからない」「開発サーバーとエディタとテストを行き来するのが面倒」

ターミナル作業でこういった問題に直面したことがあるなら、tmux が解決してくれる。1つのターミナルウィンドウで複数の画面を管理でき、SSH接続が切れてもセッションが生き残る。一度使い始めると手放せなくなるツールだ。

tmux とは

tmux(terminal multiplexer)は、1つのターミナルで複数の仮想端末を管理するツールだ。ISC ライセンスで開発されており、Linux・macOS で広く使われている。詳細なドキュメントは tmux wiki にまとまっている。

似たツールに GNU Screen があるが、tmux はより高機能で設定が柔軟だ。現在の開発者コミュニティでは tmux が標準的な選択肢になっている。

tmux の最大のメリットは セッションの永続化 だ。SSH 接続が切れても、tmux サーバー上でプロセスが動き続ける。再接続してセッションにアタッチすれば、切断前の状態がそのまま復帰する。長時間のビルドやデプロイ中に接続が不安定になっても安心だ。

tmux は 3層構造 で画面を管理する:

  • セッション(Session):作業単位のまとまり。プロジェクトごとにセッションを作るのが一般的
  • ウィンドウ(Window):セッション内のタブのようなもの。1つのセッションに複数のウィンドウを持てる
  • ペイン(Pane):ウィンドウを分割した区画。1つのウィンドウ内で複数のシェルを同時に表示できる
text
Session: "dev"
├── Window 0: "editor"
│   ├── Pane 0: vim
│   └── Pane 1: file browser
├── Window 1: "server"
│   └── Pane 0: npm run dev
└── Window 2: "test"
    ├── Pane 0: test runner
    └── Pane 1: log tail

インストール

tmux はネイティブ Windows に対応していない。WSL 内で Linux と同じ手順でインストールする。

bash
# WSL (Ubuntu)
sudo apt install tmux

バージョン確認:

bash
tmux -V
# tmux 3.6a

基本操作:セッション・ウィンドウ・ペイン

tmux の操作は プレフィックスキー を起点にする。デフォルトのプレフィックスは Ctrl+b だ。以下、prefix と表記した場合は Ctrl+b を押してから次のキーを押す、という意味になる。

セッション操作

セッションは tmux の最上位の単位だ。プロジェクトや作業内容ごとに分けて使う。

bash
# 名前付きセッションを作成
tmux new -s work

# セッション一覧を表示
tmux ls

# セッションにアタッチ(再接続)
tmux attach -t work
# 短縮形
tmux a -t work

# セッションを終了
tmux kill-session -t work

セッション内での操作:

  • prefix d — デタッチ(セッションから離脱。プロセスはバックグラウンドで動き続ける)
  • prefix s — セッション一覧を表示して切り替え
  • prefix $ — 現在のセッション名を変更

ウィンドウ操作

ウィンドウはブラウザのタブに近い概念だ。ステータスバーの下部に一覧が表示される。

  • prefix c — 新しいウィンドウを作成
  • prefix n — 次のウィンドウへ移動
  • prefix p — 前のウィンドウへ移動
  • prefix 0-9 — 番号指定で移動
  • prefix w — ウィンドウ一覧をツリー表示で選択
  • prefix , — 現在のウィンドウ名を変更
  • prefix & — 現在のウィンドウを閉じる(確認あり)

ペイン操作

ペインはウィンドウを分割して複数のシェルを同時表示する機能だ。エディタとターミナルを並べたいときに重宝する。

  • prefix % — 左右に分割
  • prefix " — 上下に分割
  • prefix 矢印キー — ペイン間を移動
  • prefix Ctrl+矢印キー — ペインサイズを調整(キーを繰り返し押す)
  • prefix z — ペインを最大化 / 元に戻す(トグル)
  • prefix x — 現在のペインを閉じる(確認あり)
  • prefix Space — レイアウトを順番に切り替え

コピーモード

tmux 内でスクロールバックやテキスト選択を行うには、コピーモードに入る必要がある。

  • prefix [ — コピーモードに入る
  • q — コピーモードを終了
  • prefix ] — バッファの内容を貼り付け

vi モード(後述の .tmux.conf で設定)の場合:

  1. prefix [ でコピーモードに入る
  2. Space で選択開始
  3. 矢印キーまたは hjkl で選択範囲を拡大
  4. Enter でコピー(選択範囲がバッファに入る)
  5. prefix ] で貼り付け

キーバインド早見表

よく使うキーバインドをカテゴリ別にまとめた。プレフィックスは省略しているが、すべて prefix のあとに押すキーだ。

セッション:

キー動作
dデタッチ
sセッション一覧・切り替え
$セッション名を変更
(前のセッションへ
)次のセッションへ

ウィンドウ:

キー動作
c新規作成
n / p次 / 前のウィンドウ
0-9番号指定で移動
w一覧表示・選択
,リネーム
&閉じる
l最後に使ったウィンドウへ

ペイン:

キー動作
%左右分割
"上下分割
矢印キー移動
Ctrl+矢印キーサイズ変更
zズーム(トグル)
x閉じる
Spaceレイアウト切り替え
{ / }ペイン位置を入れ替え
!ペインを新しいウィンドウに分離

その他:

キー動作
[コピーモード
]貼り付け
:コマンドプロンプト
?キーバインド一覧
t時計表示

.tmux.conf で自分好みに設定する

tmux の設定ファイルは ~/.tmux.conf に置く。デフォルトのキーバインドは正直覚えにくいものが多いので、自分の手に馴染む設定にカスタマイズするのが tmux を長く使うコツだ。

以下は実用的な設定例だ。必要な部分だけ取り込んで使ってほしい。

bash
# -------------------------------------------
# プレフィックスキーを Ctrl+a に変更
# -------------------------------------------
# GNU Screen と同じキー。Ctrl+b より押しやすい
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# -------------------------------------------
# ペイン分割を直感的なキーに変更
# -------------------------------------------
# | で左右分割、- で上下分割。新しいペインは現在のディレクトリを引き継ぐ
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# -------------------------------------------
# ペイン移動を vim 風にする
# -------------------------------------------
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# -------------------------------------------
# マウス操作を有効にする
# -------------------------------------------
set -g mouse on

# -------------------------------------------
# ウィンドウとペインの番号を 1 から開始
# -------------------------------------------
set -g base-index 1
setw -g pane-base-index 1

# -------------------------------------------
# ウィンドウを閉じたとき番号を詰める
# -------------------------------------------
set -g renumber-windows on

# -------------------------------------------
# 256色サポート
# -------------------------------------------
set -g default-terminal "screen-256color"
set -sa terminal-overrides ",xterm-256color:RGB"

# -------------------------------------------
# コピーモードを vi キーバインドにする
# -------------------------------------------
setw -g mode-keys vi

# -------------------------------------------
# ヒストリの上限を増やす
# -------------------------------------------
set -g history-limit 10000

# -------------------------------------------
# ステータスバーをカスタマイズ
# -------------------------------------------
set -g status-style 'bg=colour235 fg=colour136'
set -g status-left '#[fg=green]#S '
set -g status-right '%Y-%m-%d %H:%M'
set -g status-left-length 20

設定ファイルを変更したら、tmux 内で以下のいずれかで反映する:

bash
# ターミナルから
tmux source-file ~/.tmux.conf

# tmux 内のコマンドプロンプトから
# prefix : を押して入力
source-file ~/.tmux.conf

実践ワークフロー

基本操作を覚えたら、実際の作業でどう活用するかが重要だ。ここでは現場で役立つ4つのパターンを紹介する。

SSH作業の安全網

tmux が最も威力を発揮するのはリモートサーバーでの作業だ。SSH 接続が切れてもセッションが生き残るため、長時間のビルドやデータ移行を安心して実行できる。リモートサーバーを日常的に管理しているなら、ssh・rsync と組み合わせると効率が上がる。

bash
# サーバーに SSH 接続
ssh user@server.example.com

# tmux セッションを作成して作業開始
tmux new -s deploy

# 長時間かかるデプロイを実行
./deploy.sh

# 回線が不安定なら、あえてデタッチしておく
# prefix d

# --- 接続が切れた / 後日戻ってきた ---

# サーバーに再接続
ssh user@server.example.com

# セッションに復帰
tmux a -t deploy
# デプロイ結果がそのまま見える

開発環境の一括セットアップ

毎回同じウィンドウ構成を手動で作るのは非効率だ。シェルスクリプトで自動化すれば、コマンド一発で開発環境が整う。シェルスクリプトに慣れていなくても、これは良い練習題材になる。

bash
#!/bin/bash
# dev-tmux.sh — 開発用 tmux セッションを一括起動

SESSION="dev"
PROJECT_DIR="$HOME/projects/myapp"

# 既存セッションがあればアタッチして終了
tmux has-session -t $SESSION 2>/dev/null && {
  tmux attach -t $SESSION
  exit 0
}

# 新規セッション作成(デタッチ状態で)
tmux new-session -d -s $SESSION -c $PROJECT_DIR

# Pane 0: エディタ
tmux send-keys 'vim .' C-m

# 右側にペインを分割: 開発サーバー
tmux split-window -h -c $PROJECT_DIR
tmux send-keys 'npm run dev' C-m

# 右下にペインを分割: テストウォッチャー
tmux split-window -v -c $PROJECT_DIR
tmux send-keys 'npm run test -- --watch' C-m

# 左側のエディタペインにフォーカスを戻す
tmux select-pane -t 0

# セッションにアタッチ
tmux attach -t $SESSION
bash
# 実行権限を付けて使う
chmod +x dev-tmux.sh
./dev-tmux.sh

複数サーバーの同時操作

synchronize-panes を有効にすると、すべてのペインに同じキー入力が同時に送られる。複数サーバーで同じコマンドを一斉に実行したいとき便利だ。

bash
# 3つのサーバーそれぞれにペインを作成
tmux new -s servers
tmux split-window -h
tmux split-window -v
tmux select-pane -t 0

# 各ペインで SSH 接続
# Pane 0: ssh web1.example.com
# Pane 1: ssh web2.example.com
# Pane 2: ssh web3.example.com

# 全ペイン同期を有効化
# prefix : で入力
setw synchronize-panes on

# 以降の入力が全ペインに同時送信される
# 例: sudo apt update && sudo apt upgrade -y

# 同期を解除
setw synchronize-panes off

ペアプログラミング

tmux セッションには複数の端末から同時にアタッチできる。同じサーバー上で作業しているメンバーと画面を共有し、リアルタイムで同じコードを見ながら作業するのに使える。

bash
# メンバー A がセッションを作成
tmux new -s pair

# メンバー B が同じセッションにアタッチ
tmux attach -t pair

# 両者の入力がリアルタイムに反映される

ウィンドウサイズが異なる端末でアタッチすると、小さい方に合わせて表示される。同じ端末サイズで使うか、tmux attach -d -t pair(既存のアタッチをデタッチしてから接続)を使うとよい。

応用テクニック

tmux フックで自動化する

tmux のフック機能を使うと、特定のイベント発生時にコマンドを自動実行できる。

bash
# ウィンドウを作成したらペインのパスを自動同期
tmux set-hook -g after-new-window 'send-keys "cd #{pane_current_path}" C-m'

# セッション作成時にステータスバーの色を設定
tmux set-hook -g session-created 'set status-style bg=colour235'

set-hook -g はグローバル設定、set-hook はセッション単位の設定だ。after-split-windowpane-focus-inclient-attached など多くのイベントに対応している。

display-popup でフローティングウィンドウ(tmux 3.2+)

tmux 3.2 以降では display-popup でフローティングウィンドウを表示できる。ちょっとしたコマンドの実行に便利だ。

bash
# フローティングウィンドウでメモを取る
tmux display-popup -E 'vim ~/notes.md'

# fzf でセッションを切り替える
tmux display-popup -E 'tmux list-sessions -F "#{session_name}" | fzf | xargs tmux switch-client -t'

.tmux.conf にキーバインドとして登録すると、ワンキーで呼び出せる。

bash
# prefix + g でセッションスイッチャーを起動
bind g display-popup -E 'tmux list-sessions -F "#{session_name}" | fzf | xargs tmux switch-client -t'

capture-pane でペイン内容をファイルに保存

capture-pane はペインの表示内容をキャプチャしてバッファに保存する。ログの保存やデバッグに使える。

bash
# 現在のペインの内容をファイルに保存
tmux capture-pane -pS - > ~/tmux-output.log

# スクロールバッファ全体をキャプチャ(過去5000行)
tmux capture-pane -pS -5000 > ~/full-log.txt

-p はバッファの内容を stdout に出力、-S - はスクロールバッファの先頭からキャプチャする。

send-keys でバッチ操作

send-keys を使えば、外部スクリプトからペインにキーストロークを送り込める。CI/CD やテスト自動化に応用できる。

bash
# 特定のペインにコマンドを送信
tmux send-keys -t dev:0.1 'npm run build' C-m

# 全ペインに同じコマンドを送信(synchronize-panes なしで)
for pane in $(tmux list-panes -F '#{pane_id}'); do
  tmux send-keys -t "$pane" 'echo "pane: $TMUX_PANE"' C-m
done

プラグインで tmux を拡張する(TPM)

TPM(Tmux Plugin Manager)は tmux プラグインの管理ツールだ。インストール・更新・削除を自動化してくれる。

TPM のインストール

bash
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

.tmux.conf の末尾に以下を追加:

bash
# プラグインリスト
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'

# TPM を初期化(この行は必ず .tmux.conf の最下部に置く)
run '~/.tmux/plugins/tpm/tpm'

tmux 内で prefix + I(大文字の I)を押すとプラグインがインストールされる。

おすすめプラグイン

  • tmux-resurrect — 再起動後も tmux セッションを復元できる。prefix + Ctrl-s で保存、prefix + Ctrl-r で復元
  • tmux-continuum — 15分ごとに自動保存。tmux 起動時の自動復元も設定できる
  • tmux-yank — コピーモードからシステムクリップボードにコピーできるようにする

FAQ

tmux でスクロールするにはどうすればいい?

prefix [ でコピーモードに入り、矢印キーや Page Up/Down でスクロールできる。.tmux.confset -g mouse on を設定していれば、マウスホイールでもスクロール可能だ。q でコピーモードを終了する。

tmux と GNU Screen の違いは?

tmux はモダンなコードベースで、スクリプト対応が優れ、クライアント-サーバーアーキテクチャによる柔軟なレイアウト管理ができる。Screen は 1987年からある老舗だが、開発ペースは大幅に落ちている。新規で始めるなら tmux が定番だ。

tmux の中で tmux を使える?(ネスト)

使える。リモートサーバーに SSH して、そのサーバーでも tmux を使っている場合にネストになる。内側のセッションにコマンドを送るには prefix を2回押してから操作キーを押すか、内側の tmux のプレフィックスを別のキーにリバインドすると混乱しにくい。

ペインのサイズ変更はどうやる?

prefix Ctrl+矢印キー で矢印方向にサイズ変更できる。マウスモード有効時(set -g mouse on)はペインの境界線をドラッグしてもOK。コマンドで指定する場合は tmux resize-pane -D 5 のように行数を指定する。

macOS で tmux は使える?

使える。brew install tmux でインストールするだけだ。クリップボード連携には tmux-yank プラグインを入れるか、reattach-to-user-namespace を設定する。

tmux セッションを保存・復元するには?

tmux セッションは SSH 切断には耐えるが、再起動では消える。tmux-resurrect を TPM でインストールすれば、prefix + Ctrl-s で保存、prefix + Ctrl-r でレイアウト・ペイン内容・実行中プロセスを含めて復元できる。

プレフィックスキーとは何か?変更できる?

プレフィックスキー(デフォルト Ctrl+b)は tmux の全コマンドの前に押すリーダーキーだ。多くのユーザーは Ctrl+a(GNU Screen と同じ)に変更する。.tmux.confunbind C-b; set -g prefix C-a; bind C-a send-prefix と書けばよい。全オプションは tmux man page を参照。

関連記事

まとめ

tmux は「ターミナルをもっと効率的に使いたい」という要求に正面から応えてくれるツールだ。

押さえておくポイント:

  • 3層構造(Session → Window → Pane)を理解すれば操作に迷わない
  • セッションの永続化 がリモート作業の安全網になる
  • .tmux.conf でプレフィックスキーやペイン操作を自分好みに設定する
  • スクリプト化 で開発環境の構築を自動化できる

最初はプレフィックスキー + 基本的なペイン分割だけ覚えれば十分だ。慣れてきたら .tmux.conf を少しずつ育てていくのがいい。