「SSH接続が切れてビルドが中断した」「ターミナルのタブが20個開いてどれがどれかわからない」「開発サーバーとエディタとテストを行き来するのが面倒」
ターミナル作業でこういった問題に直面したことがあるなら、tmux が解決してくれる。1つのターミナルウィンドウで複数の画面を管理でき、SSH接続が切れてもセッションが生き残る。一度使い始めると手放せなくなるツールだ。
tmux とは
tmux(terminal multiplexer)は、1つのターミナルで複数の仮想端末を管理するツールだ。BSD ライセンスで開発されており、Linux・macOS で広く使われている。
似たツールに GNU Screen があるが、tmux はより高機能で設定が柔軟だ。現在の開発者コミュニティでは tmux が標準的な選択肢になっている。
tmux の最大のメリットは セッションの永続化 だ。SSH 接続が切れても、tmux サーバー上でプロセスが動き続ける。再接続してセッションにアタッチすれば、切断前の状態がそのまま復帰する。長時間のビルドやデプロイ中に接続が不安定になっても安心だ。
tmux は 3層構造 で画面を管理する:
- セッション(Session):作業単位のまとまり。プロジェクトごとにセッションを作るのが一般的
- ウィンドウ(Window):セッション内のタブのようなもの。1つのセッションに複数のウィンドウを持てる
- ペイン(Pane):ウィンドウを分割した区画。1つのウィンドウ内で複数のシェルを同時に表示できる
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 と同じ手順でインストールする。
# WSL (Ubuntu)
sudo apt install tmux
バージョン確認:
tmux -V
# tmux 3.6a
基本操作:セッション・ウィンドウ・ペイン
tmux の操作は プレフィックスキー を起点にする。デフォルトのプレフィックスは Ctrl+b だ。以下、prefix と表記した場合は Ctrl+b を押してから次のキーを押す、という意味になる。
セッション操作
セッションは tmux の最上位の単位だ。プロジェクトや作業内容ごとに分けて使う。
# 名前付きセッションを作成
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 で設定)の場合:
prefix [でコピーモードに入るSpaceで選択開始- 矢印キーまたは
hjklで選択範囲を拡大 Enterでコピー(選択範囲がバッファに入る)prefix ]で貼り付け
キーバインド早見表
よく使うキーバインドをカテゴリ別にまとめた。プレフィックスは省略しているが、すべて prefix のあとに押すキーだ。
セッション:
| キー | 動作 |
|---|---|
d | デタッチ |
s | セッション一覧・切り替え |
$ | セッション名を変更 |
( | 前のセッションへ |
) | 次のセッションへ |
ウィンドウ:
| キー | 動作 |
|---|---|
c | 新規作成 |
n / p | 次 / 前のウィンドウ |
0-9 | 番号指定で移動 |
w | 一覧表示・選択 |
, | リネーム |
& | 閉じる |
l | 最後に使ったウィンドウへ |
ペイン:
| キー | 動作 |
|---|---|
% | 左右分割 |
" | 上下分割 |
矢印キー | 移動 |
Ctrl+矢印キー | サイズ変更 |
z | ズーム(トグル) |
x | 閉じる |
Space | レイアウト切り替え |
{ / } | ペイン位置を入れ替え |
! | ペインを新しいウィンドウに分離 |
その他:
| キー | 動作 |
|---|---|
[ | コピーモード |
] | 貼り付け |
: | コマンドプロンプト |
? | キーバインド一覧 |
t | 時計表示 |
.tmux.conf で自分好みに設定する
tmux の設定ファイルは ~/.tmux.conf に置く。デフォルトのキーバインドは正直覚えにくいものが多いので、自分の手に馴染む設定にカスタマイズするのが tmux を長く使うコツだ。
以下は実用的な設定例だ。必要な部分だけ取り込んで使ってほしい。
# -------------------------------------------
# プレフィックスキーを 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 内で以下のいずれかで反映する:
# ターミナルから
tmux source-file ~/.tmux.conf
# tmux 内のコマンドプロンプトから
# prefix : を押して入力
source-file ~/.tmux.conf
実践ワークフロー
基本操作を覚えたら、実際の作業でどう活用するかが重要だ。ここでは現場で役立つ4つのパターンを紹介する。
SSH作業の安全網
tmux が最も威力を発揮するのはリモートサーバーでの作業だ。SSH 接続が切れてもセッションが生き残るため、長時間のビルドやデータ移行を安心して実行できる。
# サーバーに SSH 接続
ssh user@server.example.com
# tmux セッションを作成して作業開始
tmux new -s deploy
# 長時間かかるデプロイを実行
./deploy.sh
# 回線が不安定なら、あえてデタッチしておく
# prefix d
# --- 接続が切れた / 後日戻ってきた ---
# サーバーに再接続
ssh user@server.example.com
# セッションに復帰
tmux a -t deploy
# デプロイ結果がそのまま見える
開発環境の一括セットアップ
毎回同じウィンドウ構成を手動で作るのは非効率だ。シェルスクリプトで自動化すれば、コマンド一発で開発環境が整う。
#!/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
# 実行権限を付けて使う
chmod +x dev-tmux.sh
./dev-tmux.sh
複数サーバーの同時操作
synchronize-panes を有効にすると、すべてのペインに同じキー入力が同時に送られる。複数サーバーで同じコマンドを一斉に実行したいとき便利だ。
# 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 セッションには複数の端末から同時にアタッチできる。同じサーバー上で作業しているメンバーと画面を共有し、リアルタイムで同じコードを見ながら作業するのに使える。
# メンバー A がセッションを作成
tmux new -s pair
# メンバー B が同じセッションにアタッチ
tmux attach -t pair
# 両者の入力がリアルタイムに反映される
ウィンドウサイズが異なる端末でアタッチすると、小さい方に合わせて表示される。同じ端末サイズで使うか、tmux attach -d -t pair(既存のアタッチをデタッチしてから接続)を使うとよい。
まとめ
tmux は「ターミナルをもっと効率的に使いたい」という要求に正面から応えてくれるツールだ。
押さえておくポイント:
- 3層構造(Session → Window → Pane)を理解すれば操作に迷わない
- セッションの永続化 がリモート作業の安全網になる
.tmux.confでプレフィックスキーやペイン操作を自分好みに設定する- スクリプト化 で開発環境の構築を自動化できる
最初はプレフィックスキー + 基本的なペイン分割だけ覚えれば十分だ。慣れてきたら .tmux.conf を少しずつ育てていくのがいい。
ターミナル作業をさらに快適にしたいなら、fzf であいまい検索を導入するのもおすすめだ。tmux + fzf の組み合わせで、ターミナル作業の生産性が大きく変わる。CLI ツール全体の見取り図は CLIツール完全マップ を参考にしてほしい。