GNU Screen ユーザーのための tmux カスタマイズ

長年 GNU Screen を使ってきたユーザーが tmux に移行する際に、違和感を減らすためのカスタマイズ記録です。


はじめに

20 年近く GNU Screen を使ってきました。ターミナルマルチプレクサとしては大きな不満もなく、乗り換える理由はありませんでした。

きっかけは Claude Code です。Claude Code はターミナル上で動作する AI コーディングアシスタントですが、Screen 上で使うと表示が崩れる問題がありました。具体的には、テキストの各単語に不正な背景色ブロックが付いて短冊状に表示されたり、起動時の ASCII アートロゴが白いブロックノイズに化けたりします。Screen が、Claude Code の TUI が使用するカラーエスケープシーケンスを正しく処理できていないようです。

Claude Code 起動直後の画面。ロゴが化け、テキストに不正な背景色ブロックが付いている

workspace の trust 確認画面。同様に各単語に背景色ブロックが付いている

tmux ではこの問題は起きませんでした。Claude Code を快適に使うために、tmux への移行を決めました。


Screen ユーザーが戸惑うポイント

tmux に移行してまず戸惑ったのが、画面分割まわりの操作体系の違いです。

プレフィックスキー

Screen のデフォルトプレフィックスは Ctrl+a、tmux は Ctrl+b です。これは ~/.tmux.conf で簡単に変更できるので、すぐに解決しました。

画面分割の考え方が違う

Screen の特徴として、「リージョン」と「ウィンドウ」が明確に分かれています。Ctrl+aS で画面をリージョン分割し、各リージョンに既存のウィンドウを割り当てます。リージョンを閉じてもウィンドウ(シェル)は残ります。Ctrl+aQ でリージョンを全解除して元の 1 画面に戻す、というのがよくある使い方でした。

tmux では「ペイン」がこれに相当しますが、ペインを作ると新しいシェルが自動起動します。Screen のように「画面を分割してから既存のウィンドウを割り当てる」という手順ではなく、「分割と同時に新しいシェルが生まれる」という動作です。

また、Screen の Ctrl+aQ(リージョン全解除)に直接対応するキーがありません。tmux では Ctrl+az でペインをズーム(全画面化)するのが近い感覚ですが、他のペインを閉じるわけではないので挙動が異なります。

ペインを独立したウィンドウに戻したい場合は Ctrl+a!(break-pane)で 1 つずつ分離する必要があります。複数ペインを一括で分離するコマンドはデフォルトにはありません。

こういった違いに戸惑うことが多かったので、Screen ユーザーが直感的に使えるキーバインドをカスタマイズしました。


~/.tmux.conf

以下がカスタマイズした設定です。カスタムキーバインドに加えて、デフォルトのよく使うキーバインドもコメントでチートシートとして埋め込んでいます。設定ファイル自体がリファレンスになるようにしています。

設定を変更した後は、tmux 内で Ctrl+a: を押してコマンドモードに入り、source-file ~/.tmux.conf と入力するか、シェルから tmux source-file ~/.tmux.conf を実行すると反映されます。

# =============================================
# Custom keybindings
# =============================================

# Use Ctrl+a as prefix (same as GNU Screen)
unbind C-b
set -g prefix C-a
# Ctrl+a -> a: Send literal Ctrl+a to the terminal
bind a send-prefix

# Enable mouse for pane resizing, selection, and scrolling
set -g mouse on

# Ctrl+a -> -: Split pane horizontally (top/bottom)
bind - split-window -v
# Ctrl+a -> |: Split pane vertically (left/right)
bind | split-window -h

# Ctrl+a -> @: Pull a pane from another window/session (interactive)
bind @ choose-tree "join-pane -s '%%'"
# Ctrl+a -> S: Send current pane to another window/session (interactive)
bind S choose-tree "join-pane -t '%%'"

# Ctrl+a -> Q: Break all panes into separate windows
bind Q run-shell 'while [ $(tmux list-panes | wc -l) -gt 1 ]; do tmux break-pane -d; done'

# =============================================
# Cheat sheet (default keybindings)
# =============================================

# --- Pane navigation ---
# Ctrl+a -> Arrow keys: Move between panes
# Ctrl+a -> o: Move to next pane
# Ctrl+a -> q: Display pane numbers (press number to jump)
# Ctrl+a -> z: Toggle pane zoom (fullscreen)

# --- Pane resizing ---
# Ctrl+a -> Ctrl+Arrow keys: Resize pane by 1 cell
# Ctrl+a -> Alt+Arrow keys: Resize pane by 5 cells
# Mouse drag on pane border: Resize interactively

# --- Pane arrangement ---
# Ctrl+a -> {: Swap pane forward (up/left)
# Ctrl+a -> }: Swap pane backward (down/right)
# Ctrl+a -> Space: Cycle through layouts

# --- Pane/window management ---
# Ctrl+a -> !: Break current pane into a separate window

# --- Window navigation ---
# Ctrl+a -> c: Create new window
# Ctrl+a -> n: Next window
# Ctrl+a -> p: Previous window
# Ctrl+a -> 0-9: Jump to window by number
# Ctrl+a -> w: List all windows/sessions (interactive tree)

# --- Session navigation ---
# Ctrl+a -> s: List sessions (interactive selection)
# Ctrl+a -> (: Previous session
# Ctrl+a -> ): Next session

# --- Cross-session window management (via command mode: Ctrl+a -> :) ---
# move-window -t session_name:        Move current window to another session
# link-window -s session_name:N       Share a window across sessions (same window, multiple sessions)
# unlink-window                       Remove shared window from current session

カスタムキーバインドの解説

プレフィックスの変更(Ctrl+a

Screen と同じ Ctrl+a をプレフィックスにしています。bind a send-prefix で、Ctrl+aa と押せば端末に素の Ctrl+a(行頭移動など)を送れます。これも Screen と同じ挙動です。

ペイン分割(-|

tmux のデフォルトでは " で横分割、% で縦分割ですが、少し覚えにくいと感じました。-(横線)で横分割、|(縦線)で縦分割にしています。

ペインの取り込みと送り出し(@S

@ は別のウィンドウやセッションからペインを現在のウィンドウに取り込みます。S は現在のペインを別のウィンドウやセッションに送ります。いずれもインタラクティブなツリー表示から選択できます。

なお、Screen では Ctrl+aS は横分割(リージョン分割)です。この設定ではその機能を - に移しているため、S を「ペイン送り出し」に再割り当てしています。

全ペイン分離(Q

Screen の Ctrl+aQ(リージョン全解除)に近い操作です。現在のウィンドウにある全ペインをそれぞれ独立したウィンドウに分離します。「分割して作業した後、元の 1 ペイン 1 ウィンドウの状態に戻したい」という Screen 的な使い方ができます。


キーバインド一覧

カスタム設定

キー操作
Ctrl+aプレフィックス(Screen と同じ)
Ctrl+aa端末に素の Ctrl+a を送る
Ctrl+a-横分割(上下)
Ctrl+a|縦分割(左右)
Ctrl+a@別ウィンドウ/セッションからペインを取り込む
Ctrl+aS現在のペインを別ウィンドウ/セッションに送る
Ctrl+a!現在のペインを独立ウィンドウにする(デフォルト)
Ctrl+aQ全ペインを独立ウィンドウにバラす
マウスペイン境界ドラッグでリサイズ、選択、スクロール

デフォルトキーバインド(よく使うもの)

ペイン操作

キー操作
Ctrl+a → 矢印キーペイン間移動
Ctrl+ao次のペインに移動
Ctrl+aqペイン番号表示(番号押下でジャンプ)
Ctrl+azペインのズーム切替(全画面)
Ctrl+aSpaceレイアウト順次切替

ウィンドウ操作

キー操作
Ctrl+ac新規ウィンドウ
Ctrl+an / p次/前のウィンドウ
Ctrl+a0-9ウィンドウ番号でジャンプ
Ctrl+awウィンドウ/セッション一覧(ツリー表示)

セッション操作

キー操作
Ctrl+asセッション一覧
Ctrl+a( / )前/次のセッション
Ctrl+adデタッチ(セッションを残して切断)

デタッチとアタッチ

ターミナルマルチプレクサの最も基本的な機能であるデタッチ/アタッチは、Screen と tmux でほぼ同じです。

操作Screentmux
デタッチCtrl+adCtrl+ad
セッション一覧screen -lstmux ls
アタッチscreen -rtmux attach (tmux a)
名前付きセッション作成screen -S nametmux new -s name
名前指定でアタッチscreen -r nametmux attach -t name

Screen ユーザーにとって最も馴染みのある操作なので、ここは移行のハードルが低いポイントです。


Screen との概念の対応

Screentmux備考
リージョンペインtmux はペイン作成時にシェルが自動起動する
ウィンドウウィンドウほぼ同じ概念
(なし)セッションScreen にもセッション概念はあるが、tmux の方がセッション管理が強力
Ctrl+aQ (リージョン全解除)Ctrl+aQ (全ペイン分離、カスタム)デフォルトの z(ズーム)は一時的な全画面化でペインが残る。カスタム Q で Screen に近い挙動を再現
Ctrl+aS (横分割)Ctrl+a- (カスタム)デフォルトは "

tmux 固有の便利な機能として、link-window で同じウィンドウを複数セッションから共有できます。これは Screen にはない機能です。


コピー&ペーストと OS クリップボード連携

tmux のコピーバッファと OS のクリップボードは、デフォルトでは連携していないようです。tmux 内でコピーしても OS 側に反映されません。また、mouse on にしていると tmux がマウスイベントを横取りするため、右クリックメニューからのコピペも効きません。

OSC 52 による解決

OSC 52 はターミナルのエスケープシーケンスを使ってクリップボードにアクセスする仕組みです。xclip などの外部ツールは不要で、SSH 越しでも動作します。

ターミナルエミュレータ側(Alacritty の例):

[terminal]
osc52 = "CopyPaste"

tmux 側(~/.tmux.conf):

set -g set-clipboard on
set -g mode-keys vi
set -g history-limit 10000

set-clipboard on は tmux 3.2 以降ではデフォルトで有効ですが、明示しておくと意図が明確になります。mode-keys vi はコピーモードのキー操作を vi 式にします(hjkl 移動、/ で検索など)。vi に馴染みがなければこの行を省略すれば emacs 式(デフォルト)のままで、OSC 52 によるクリップボード連携は同様に動作します。history-limit はスクロールバックの行数です(デフォルトは 2000 行)。

これだけで tmux のコピーが OS クリップボードに反映されます。

コピー操作

  1. Ctrl+a[ — コピーモードに入る
  2. Space — 選択開始
  3. Enter — コピー(OS クリップボードにも入る)
  4. 通常の Ctrl+v や中クリックで貼り付け

tmux 内で貼り付ける場合は Ctrl+a] です。

Shift キーで tmux をバイパス

Shift を押しながら操作すると tmux をバイパスしてターミナルエミュレータ側の操作になります。

  • Shift + ドラッグ: ターミナル側の選択
  • Shift + 右クリック: ターミナルのコンテキストメニュー
  • Shift + 中クリック / Shift+Ctrl+V: 貼り付け

Screen との比較

操作Screentmux (この設定)
コピーモード開始Ctrl+a[Ctrl+a[
選択開始EnterSpace
コピーEnterEnter
貼り付けCtrl+a]Ctrl+a]
OS クリップボード連携なしOSC 52 で自動連携

コピーモードの基本操作は Screen とほぼ同じです。大きな違いは OS クリップボードとの連携で、Screen にはこの機能がありませんでした。tmux + OSC 52 対応ターミナルの組み合わせでは、コピーした内容がそのまま OS のクリップボードに入るため、ブラウザや他のアプリケーションにそのまま貼り付けられます。

なお、OSC 52 対応はターミナルエミュレータに依存します。Alacritty、Ghostty、WezTerm、iTerm2、Windows Terminal などは対応していますが、xfce4-terminal は未対応です。


完全な ~/.tmux.conf

記事中で紹介した設定をまとめた完全版です。コピー&ペーストしてそのまま使えます。

# =============================================
# Prefix key (same as GNU Screen)
# =============================================
unbind C-b
set -g prefix C-a
bind a send-prefix

# =============================================
# General settings
# =============================================
set -g mouse on
set -g set-clipboard on
set -g mode-keys vi
set -g history-limit 10000

# =============================================
# Custom keybindings
# =============================================

# Pane splitting: - for horizontal, | for vertical
bind - split-window -v
bind | split-window -h

# Pull a pane from another window/session (interactive)
bind @ choose-tree "join-pane -s '%%'"
# Send current pane to another window/session (interactive)
bind S choose-tree "join-pane -t '%%'"

# Break all panes into separate windows (like Screen's Ctrl+a -> Q)
bind Q run-shell 'while [ $(tmux list-panes | wc -l) -gt 1 ]; do tmux break-pane -d; done'

# =============================================
# Cheat sheet (default keybindings)
# =============================================

# --- Pane navigation ---
# Ctrl+a -> Arrow keys: Move between panes
# Ctrl+a -> o: Move to next pane
# Ctrl+a -> q: Display pane numbers (press number to jump)
# Ctrl+a -> z: Toggle pane zoom (fullscreen)

# --- Pane resizing ---
# Ctrl+a -> Ctrl+Arrow keys: Resize pane by 1 cell
# Ctrl+a -> Alt+Arrow keys: Resize pane by 5 cells
# Mouse drag on pane border: Resize interactively

# --- Pane arrangement ---
# Ctrl+a -> {: Swap pane forward (up/left)
# Ctrl+a -> }: Swap pane backward (down/right)
# Ctrl+a -> Space: Cycle through layouts

# --- Pane/window management ---
# Ctrl+a -> !: Break current pane into a separate window

# --- Window navigation ---
# Ctrl+a -> c: Create new window
# Ctrl+a -> n: Next window
# Ctrl+a -> p: Previous window
# Ctrl+a -> 0-9: Jump to window by number
# Ctrl+a -> w: List all windows/sessions (interactive tree)

# --- Session ---
# Ctrl+a -> d: Detach from session
# Ctrl+a -> s: List sessions (interactive selection)
# Ctrl+a -> (: Previous session
# Ctrl+a -> ): Next session

# --- Cross-session window management (via command mode: Ctrl+a -> :) ---
# move-window -t session_name:        Move current window to another session
# link-window -s session_name:N       Share a window across sessions
# unlink-window                       Remove shared window from current session

# --- Copy mode ---
# Ctrl+a -> [: Enter copy mode
# Space: Start selection (vi mode) / Ctrl+Space (emacs mode)
# Enter: Copy selection (also copies to OS clipboard via OSC 52)
# Ctrl+a -> ]: Paste from tmux buffer

まとめ

Screen から tmux への移行で最も戸惑ったのは、ペイン分割まわりの操作体系の違いでした。Screen の「リージョンを分割・解除する」という考え方と、tmux の「ペインを作る・ズームする」という考え方はアプローチが異なります。

今回のカスタマイズでは、プレフィックスの変更に加えて、Q(全ペイン分離)や @/S(ペインの取り込み・送り出し)を追加することで、Screen 的なワークフローを tmux 上で再現できるようにしました。

移行のきっかけは Claude Code の表示崩れという消極的な理由でしたが、使ってみると tmux のセッション管理やペインの柔軟さは Screen より優れていると感じます。OSC 52 によるクリップボード連携など、tmux ならではの利点もあり、長年の慣れを差し引いても移行してよかったと感じています。Screen に慣れている方は、まずプレフィックスを Ctrl+a に変えるだけでも移行のハードルはかなり下がると思います。