C-x 【tmux】
Weztermのペイン操作をtmuxに任せ
てEmacs風キーバインドにしたけれど

Weztermを使い始めたとき、画面分割機能は便利だと感じました。
しかし、実際に使ってみると問題が浮上しました。
Emacsを日常的に使っている私にとって、Weztermのペイン切り替えキーバインドとEmacsのキーバインドが衝突するのです。

さらに、SSH接続先での作業を考えると、Weztermの分割機能だけでは不安があります1
WiFiが切れたら作業が中断される。
長時間かかる処理を実行中に接続が切れたら、全てが水の泡です。

関連記事

1. tmuxという選択肢

tmuxは、SSH接続の不安定さから作業を守る保険のようなものです。
仕組みはシンプルです。
リモートサーバー側でtmuxを起動すると、SSH接続が切れてもセッションが継続されます。
後で再接続すれば、作業をそのまま再開できるのです。

tmuxという選択肢 セッション永続化の保険 SSH切断後も作業継続 プレフィックスキーで衝突回避 Emacs風キーバインド実現 リモート側で完結 ローカルのEmacsと 干渉しない

この特性は、リモート開発では非常に重要です。
会議でノートPCを閉じても、電車でトンネルに入っても、作業は止まりません。

そして、tmuxにはもう一つの利点があります。
プレフィックスキーという概念です。
デフォルトではC-bですが、これをC-xに変更すれば、Emacs風の操作が実現できます。
Weztermとは違い、tmuxのキーバインドはリモートサーバー側で完結するため、ローカルのEmacsと衝突しません。

1.1. 役割分担の明確化

最終的に、私は次のような役割分担に落ち着きました。

役割分担の明確化 Wezterm GPU描画 / 高速レンダリング tmux セッション管理 / ペイン分割 それぞれが得意なことに専念

Weztermは、GPU加速による高速な描画エンジンとして使います。美しいフォント表示と滑らかなスクロールは、Weztermの強みです。しかし、セッション管理やペイン分割の責任は持たせません。

tmuxは、セッション管理とペイン分割を担当します。SSH接続先で起動し、作業環境を構築します。Emacs風のキーバインドも、ここで設定します。

この分離により、ローカルとリモートで一貫した操作感を維持できます。ローカルのターミナルでもリモートのサーバーでも、同じC-x 2で画面を分割し、同じC-x oでペインを移動できるのです。

2. tmuxインストール

まず、Homebrewを使ってtmuxをインストールします2

brew install tmux

インストール後、バージョンを確認しておきましょう。

tmux -V

2.1. 実際の使い方

設定が完了したら、tmuxを起動します。

tmux

これで新しいセッションが開始されます。
セッションに名前を付けることもできます。

tmux new -s work
Code language: JavaScript (javascript)

workという名前のセッションが作成されます。
複数のプロジェクトで作業する場合、セッション名を付けると管理が楽になります。

2.2. SSH接続での活用

リモートサーバーに接続するとき、tmuxの真価が発揮されます。

ssh user@server
Code language: CSS (css)

サーバーにログインしたら、tmuxを起動します(サーバー側でtmuxがインストールされている必要があります)。

tmux new -s dev
Code language: JavaScript (javascript)

ここで作業を始めます。
コードを編集し、テストを実行し、ログを監視します。
画面を分割して複数の作業を並行して進められます。

作業を中断したいときは「デタッチ(detach)」と呼ばれる操作で、tmuxセッションから抜けます。
これは、セッションは終了せず、サーバー側のバックグラウンドで動き続けます3

exit
Code language: PHP (php)

SSH接続を終了します。
WiFiを切っても、PCをスリープさせても構いません。
リモートサーバー上のtmuxセッションは、何事もなかったかのように動き続けています。

後で作業を再開するときは、再度SSHでログインし、セッションにアタッチします。

ssh user@server
tmux attach -t dev
Code language: CSS (css)

画面には、デタッチ前の状態がそのまま残っています。
編集中のファイルも、実行中のコマンドも、全てそのままです。

3. Emacs風キーバインドの設定

設定ファイルを作成します。

Emacs風キーバインドの設定 ~/.config/tmux/tmux.conf C-x 2 → 上下分割 C-x 3 → 左右分割 C-x o → ペイン移動 C-x 0 → ペイン削除 プレフィックス C-x で Emacs と統一

tmux 3.1以降であれば、設定ファイルを~/.config配下に置けます4
ディレクトリ構造が整理されるため、推奨されるパスです。

mkdir -p ~/.config/tmux
Code language: JavaScript (javascript)
nano ~/.config/tmux/tmux.conf
Code language: JavaScript (javascript)

以下の内容を記述します。
各設定の意味を順に説明していきます。

# プレフィックスキーをC-xに変更
unbind C-b
set -g prefix C-x
bind C-x send-prefix

# C-x 2: 横分割(上下に分割)
bind 2 split-window -v -c "#{pane_current_path}"

# C-x 3: 縦分割(左右に分割)
bind 3 split-window -h -c "#{pane_current_path}"

# C-x o: ペイン間を順に移動
bind o select-pane -t :.+

# C-x 0: 現在のペインを閉じる
bind 0 kill-pane

# C-x 1: 現在のペイン以外を全て閉じる
bind 1 kill-pane -a

# マウス操作を有効化
set -g mouse on

# 256色対応
set -g default-terminal "screen-256color"

# ステータスバーの配色
set -g status-style bg=black,fg=white
Code language: PHP (php)

3.1. プレフィックスキーの変更

最初の3行がプレフィックスキーの設定です。tmuxでは、全てのコマンドの前にプレフィックスキーを押します。デフォルトのC-bをアンバインドし、C-xを新しいプレフィックスとして設定します。

bind C-x send-prefixは、C-x C-xと2回押すことで、実際のC-xをアプリケーションに送信するための設定です。Emacs内でC-xを使う必要がある場合に役立ちます。

3.2. 画面分割

bind 2 split-window -vは、C-x 2で画面を横方向(上下)に分割します。-vはvertical(縦方向に線を引く=上下に分割)を意味します5。混乱しやすいですが、tmuxの用語では「縦線で区切る」という意味でverticalなのです。

bind 3 split-window -hは、C-x 3で画面を縦方向(左右)に分割します。こちらは横線ではなく縦線、つまりhorizontalです。

-c "#{pane_current_path}"は重要なオプションです。これがないと、新しいペインはホームディレクトリから始まります6。このオプションにより、分割前のペインと同じディレクトリで新しいペインが開きます。

3.3. ペイン間の移動と削除

bind o select-pane -t :.+は、C-x oでペインを順に巡回します。EmacsのC-x o(other-window)と同じ動作です。

bind 0 kill-panebind 1 kill-pane -aは、Emacsのウィンドウ削除コマンドに対応します。C-x 0は現在のペインを閉じ、C-x 1は他の全てのペインを閉じて現在のペインだけを残します。

3.4. その他の設定

set -g mouse onを設定すると、マウスでペインのリサイズや選択ができます。キーボード操作が基本ですが、マウスも使えると便利です。

set -g default-terminal "screen-256color"は、色の表示を正しく保つための設定です。これがないと、一部のアプリケーションで色が正しく表示されません。

3.5. セッションの管理

複数のセッションを同時に管理できます。

tmux new -s project-a
# 作業...
C-x d

tmux new -s project-b
# 作業...
C-x d
Code language: PHP (php)

現在のセッション一覧を確認するには、次のコマンドを使います。

tmux ls

出力例:

project-a: 1 windows (created Mon Jan 27 10:00:00 2025)
project-b: 1 windows (created Mon Jan 27 10:05:00 2025)
Code language: CSS (css)

特定のセッションにアタッチするには、名前を指定します。

tmux attach -t project-a

これで、プロジェクトごとに独立した作業環境を維持できます。

4. 実際に使ってみた感想は…

実は、このEmacs風キーバインド、あまりうまくいきませんでした。

tmuxの中で、Emacsを使っていると、どちらのフレームが移動するのか混乱するのです。
なので、Emacs内でターミナルを動かす方がよいかもしれません。

5. まとめ

Weztermのペイン操作をtmuxに任せることで、Emacs風のキーバインドを実現しました。
WeztermはGPU描画に専念し、tmuxはセッション管理とペイン分割を担当します。

この構成の利点は3つです。
Emacsとのキーバインド衝突がなくなること、SSH接続が切れても作業が継続されること、ローカルとリモートで一貫した操作感が得られることです。

  1. tmuxはターミナルマルチプレクサとして、SSHセッションとは独立してリモートサーバー上で動作します。そのため、ネットワーク接続が切断されても、tmuxセッション内で実行中のプロセスは継続されます。これは長時間かかるビルド処理やトレーニング処理を実行する際に特に有用です。 – Terminal shortcuts for coding agents: Claude Code, Amp …
  2. macOSでは、Homebrewによるインストールが最も一般的です。Homebrew経由でインストールすると、最新版のtmuxが提供され、依存関係も自動的に解決されます。執筆時点での最新版はtmux 3.x系列です。 – How to Use Claude Code ( +Tips and Shortcuts )
  3. tmuxのデタッチ機能により、セッションはデーモンとしてバックグラウンドで継続されます。SSH接続が切断されても、tmuxサーバープロセスはリモートサーバー上で動作し続けるため、後から同じセッションに再接続(アタッチ)できます。複数のセッションを同時に管理することも可能です。
  4. tmux 3.1以降はXDG Base Directory仕様に対応しており、~/.config/tmux/tmux.confを優先的に読み込みます。従来の~/.tmux.confも後方互換性のために引き続きサポートされています。
  5. tmuxの用語では-v(vertical)は「縦線で区切る」ことを意味し、結果として画面は上下に分割されます。-h(horizontal)は「横線で区切る」ことを意味し、左右に分割されます。この命名は直感に反しますが、「どの方向に線を引くか」という視点で理解すると覚えやすくなります。
  6. #{pane_current_path}はtmuxの変数で、現在のペインの作業ディレクトリを表します。この変数を-cオプションで指定することで、新しいペインが分割前のペインと同じディレクトリで開始されます。プロジェクトディレクトリ内で作業している際に、毎回cdコマンドでディレクトリ移動する手間が省けます。