tmux導入メモ
存在は知っていたけど、今ひとつ何が嬉しいのかわからなかったので放置していたのですが、ふと思いつき勉強のために導入してみることにしました。
導入に関してちょっと躓いたこともあったので、調査したこととトラブルシュートをメモにしました。
これから導入する人は参考にしていただくと幸いです。
tmuxとは
tmux(terminal multiplexer)は、1つのターミナルセッション内で複数の仮想ターミナルを作成・管理できるツールです。
主な特徴
- セッション管理: 作業環境を保持し、後で復帰可能
- デタッチ・アタッチ: セッションから離脱して、後で再接続
- マルチプレクシング: 複数のターミナルを同時に操作
- リモート作業: SSH接続が切れても作業を継続
インストール
# macOS (Homebrew)
brew install tmux
# Ubuntu/Debian
sudo apt-get install tmux
セッション、ウインドウ、ペイン
tmuxは、「セッション」「ウインドウ」「ペイン」の3つの階層構造で構成されています。
セッション(Session)
- 最上位の概念
- プロジェクトや作業単位ごとに作成
- デタッチ・アタッチが可能
- 複数のウインドウを含む
# セッション作成
tmux new-session -s project1
# セッション一覧
tmux ls
# セッションにアタッチ
tmux attach -t project1
ウインドウ(Window)
- セッション内の仮想ターミナル
- ブラウザのタブのような概念
- 複数のペインを含む
# 新しいウインドウ作成
Ctrl+B c
# ウインドウ切り替え
Ctrl+B 0 # 0番ウインドウ
Ctrl+B 1 # 1番ウインドウ
Ctrl+B n # 次のウインドウ
Ctrl+B p # 前のウインドウ
ペイン(Pane)
- ウインドウ内の分割された領域
- 1つのウインドウを複数に分割
- 各ペインで異なるコマンドを実行
# 左右に分割
Ctrl+B %
# 上下に分割
Ctrl+B "
ウインドウでマルチペイン
ウインドウの作成
tmuxでは、セッション内に複数のウインドウを作成できます。
# 新しいウインドウを作成
Ctrl+B c
# 名前を指定してウインドウを作成
Ctrl+B c
Ctrl+B , # ウインドウ名を変更
# コマンドラインから作成
tmux new-window -n "window_name"
tmux new-window -n "editor" vim
tmux new-window -n "server" "npm start"
ウインドウの管理
# ウインドウ一覧表示
Ctrl+B w
# ウインドウ名を変更
Ctrl+B ,
# ウインドウを閉じる
Ctrl+B &
# または
exit # 全てのペインを終了
ウインドウの移動
# ウインドウの順序を変更
Ctrl+B . # ウインドウ番号を変更
# ウインドウを別のセッションに移動
Ctrl+B :
move-window -t session_name:
ウインドウの切替
作成したウインドウ間を効率的に切り替える方法です。
# 番号指定でウインドウ切り替え
Ctrl+B 0 # 0番ウインドウ
Ctrl+B 1 # 1番ウインドウ
Ctrl+B 2 # 2番ウインドウ
# ...
Ctrl+B 9 # 9番ウインドウ
順次切り替え
# 次のウインドウ
Ctrl+B n
# 前のウインドウ
Ctrl+B p
# 最後に使用したウインドウ
Ctrl+B l
インタラクティブな切り替え
# ウインドウ一覧から選択
Ctrl+B w
# 矢印キーで選択してEnter
# ウインドウ名で検索
Ctrl+B f
# ウインドウ名の一部を入力
実用的な使用例
# 開発環境の例
# ウインドウ0: エディタ
Ctrl+B c
Ctrl+B , → "editor"
# ウインドウ1: サーバー
Ctrl+B c
Ctrl+B , → "server"
# ウインドウ2: データベース
Ctrl+B c
Ctrl+B , → "database"
# ウインドウ3: Git操作
Ctrl+B c
Ctrl+B , → "git"
# 切り替え例
Ctrl+B 0 # エディタに移動
Ctrl+B 1 # サーバーに移動
Ctrl+B w # 一覧から選択
ウインドウの分割
ウインドウを分割するということはペインを追加することになります。
たとえば、Ctrl+B "
で分割すると、画面が上下に分割され、下にペインが1つ作成されて2個のペインが表示されることになります。
# 現在のウインドウを左右に分割
Ctrl+B % # 右にペインを追加
# 現在のウインドウを上下に分割
Ctrl+B " # 下にペインを追加
# ペインのサイズ調整
Ctrl+B Alt+矢印キー
用語について
tmuxの英語ドキュメントでは:
-
Vertical Split (
%
) = 縦の線で分割 → 結果として左右に分割 -
Horizontal Split (
"
) = 横の線で分割 → 結果として上下に分割
日本語では分割される結果に注目して「左右分割」「上下分割」と表現した方が分かりやすいです。
ペイン操作
ペイン間の移動・切替
# 基本的なペイン移動
Ctrl+B 矢印キー # 上下左右の矢印キーで移動
# ペイン番号で直接移動
Ctrl+B q # ペイン番号を表示
Ctrl+B q 1 # 1番ペインに移動
Ctrl+B q 2 # 2番ペインに移動
# 順次移動
Ctrl+B o # 次のペインに移動
Ctrl+B ; # 前回のペインに戻る
ペインの管理
# ペインを閉じる
Ctrl+B x
# ペインのズーム(全画面化)
Ctrl+B z
# ペインの入れ替え
Ctrl+B { # 左/上に移動
Ctrl+B } # 右/下に移動
# ペインの回転
Ctrl+B Ctrl+o # ペインを時計回りに回転
ペインの同期
# 全ペインに同じコマンドを送信
Ctrl+B :
setw synchronize-panes on
# 同期解除
Ctrl+B :
setw synchronize-panes off
レイアウト変更
# プリセットレイアウト
Ctrl+B スペース # レイアウト切り替え
# 手動レイアウト
Ctrl+B Alt+1 # 横並び
Ctrl+B Alt+2 # 縦並び
Ctrl+B Alt+3 # メインペイン+サブペイン
セッションの独立性
- 各セッションは独立した環境
- セッション間でペインは共有されない
- 異なるプロジェクトで異なるレイアウトを使用可能
実用例
# 開発用セッション
tmux new-session -s dev
# ペイン1: エディタ
# ペイン2: サーバー起動
# ペイン3: ログ監視
# 管理用セッション
tmux new-session -s admin
# ペイン1: システム監視
# ペイン2: データベース
# ペイン3: バックアップ
セッション切り替え
# セッション一覧表示
Ctrl+B s
# セッション切り替え
Ctrl+B ( # 前のセッション
Ctrl+B ) # 次のセッション
# 外部からセッション切り替え
tmux switch-client -t session_name
一般的な使用
基本的なワークフロー
# 1. セッション作成
tmux new-session -s work
# 2. ウインドウ分割
Ctrl+B % # 左右に分割
Ctrl+B " # 上下に分割
# 3. 各ペインで作業
# ペイン1: コード編集
# ペイン2: テスト実行
# ペイン3: サーバー起動
# 4. セッションからデタッチ
Ctrl+B d
# 5. 後で再接続
tmux attach -t work
開発環境の構築例
# プロジェクト用セッション
tmux new-session -s myproject
# ウインドウ1: 開発
Ctrl+B c
# ペイン1: エディタ (vim/code)
# ペイン2: サーバー起動
# ペイン3: ログ監視
# ウインドウ2: Git
Ctrl+B c
# Git操作用
# ウインドウ3: データベース
Ctrl+B c
# DB操作用
便利な設定(~/.tmux.conf)
# 端末設定の改善
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
# マウス操作を有効化
set -g mouse on
# 必要に応じて変更
# # ウインドウ番号を1から開始
# set -g base-index 1
#
# # ペイン番号を1から開始
# setw -g pane-base-index 1
#
# # プレフィックスキーを変更(Ctrl+A)
# set -g prefix C-a
# unbind C-b
#
# # 分割キーを変更
# bind | split-window -h
# bind - split-window -v
# ペイン移動を簡単に(vim風)
bind h select-pane -L # 左のペインに移動
bind j select-pane -D # 下のペインに移動
bind k select-pane -U # 上のペインに移動
bind l select-pane -R # 右のペインに移動
# ペインのリサイズ(alt 矢印)
bind -n M-Right resize-pane -R 5
bind -n M-Left resize-pane -L 5
bind -n M-Up resize-pane -U 5
bind -n M-Down resize-pane -D 5
# テキストコピー機能の設定
setw -g mode-keys vi # Vi風の操作
# set -g default-command "reattach-to-user-namespace -l zsh" # macOSクリップボード連携(旧MacOs用/`brew install reattach-to-user-namespace`する必要があります)
set -g default-shell /bin/zsh # MacOS Monterey 以降の場合はこちらを使用する
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy" # y でシステムクリップボードにコピー
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy" # Enter でもコピー
bind-key -T copy-mode-vi v send-keys -X begin-selection # v で選択開始
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy" # マウスドラッグでコピー
※ 設定ファイルを変更後はtmux source-file ~/.tmux.conf
を実行しないと反映されません。
実用的なコマンド
# セッション管理
tmux new-session -s name # セッション作成
tmux attach -t name # セッション接続
tmux detach # セッションデタッチ
tmux kill-session -t name # セッション削除
# ウインドウ管理
Ctrl+B c # 新しいウインドウ
Ctrl+B & # ウインドウ削除
Ctrl+B , # ウインドウ名変更
# ペイン管理
Ctrl+B % # 左右に分割
Ctrl+B " # 上下に分割
Ctrl+B x # ペイン削除
Ctrl+B z # ペインズーム
Ctrl+B 矢印キー # ペイン移動
Ctrl+B q # ペイン番号表示
Ctrl+B o # 次のペイン
テキストのコピーとペースト
基本的なコピー方法
# コピーモードに入る
Ctrl+B [ # コピーモード開始
もしくは
Ctrl+B PgUp # ページアップでコピーモード開始
# テキスト選択
Space # 選択開始
矢印キー # 選択範囲拡張
Enter # 選択確定・コピー実行
# ペースト
Ctrl+B ] # tmux内でペースト
コピーモード内での操作
# 移動
↑↓←→ # カーソル移動
PgUp/PgDn # ページ移動
Ctrl+U/Ctrl+D # 半ページ移動
Home/End # 行の先頭/末尾
Ctrl+A/Ctrl+E # 行の先頭/末尾
# 検索
/ # 前方検索
? # 後方検索
n # 次の検索結果
N # 前の検索結果
# 終了
q # コピーモード終了
Esc # コピーモード終了
実用的な使い方
# ログの一部をコピー
1. Ctrl+B [ # コピーモードに入る
2. ↑↓で目的の行に移動
3. Spaceで選択開始
4. ↑↓←→で選択範囲を調整
5. Enterでコピー実行
6. Cmd+V で他のアプリにペースト
# 長いコマンド出力をコピー
1. Ctrl+B [ # コピーモードに入る
2. Ctrl+Home # バッファの先頭に移動
3. /keyword # 検索で目的の場所に移動
4. Space # 選択開始
5. End # 行末まで選択
6. Enter # コピー実行
トラブルシューティング
基本的なトラブルシューティング
# 全セッション表示
tmux ls
# 全セッション終了
tmux kill-server
# 設定リロード
tmux source-file ~/.tmux.conf
# セッション情報表示
tmux info
# 現在の設定を確認
tmux show-options -g
tmux show-window-options -g
エスケープシーケンスの問題
tmux終了時に端末に変な文字が表示される場合の対処法:
# 問題の症状
^[[?1;2c^[[>0;276;0c^[]10;rgb:cccc/cccc/cccc%
# 即座の解決
reset # 端末をリセット
clear # 画面をクリア
Ctrl+L # 画面をクリア
根本的な解決法:
# ~/.tmux.confに以下を追加
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
macOS固有の問題
reattach-to-user-namespaceエラー
旧macOSの場合はreattach-to-user-namespaceを使用している様子。
症状:
# tmuxセッションが即座に終了
tmux new-session -s test
[exited]
# 設定読み込み時のエラー
tmux source-file ~/.tmux.conf
no server running on /private/tmp/tmux-501/default
原因:
-
reattach-to-user-namespace
がインストールされていない - 設定ファイルでこのコマンドを参照しているが、実際には存在しない
解決方法:
# 1. パッケージをインストール
brew install reattach-to-user-namespace
# 2. または設定を無効化
# ~/.tmux.confから以下の行をコメントアウト
# set -g default-command "reattach-to-user-namespace -l zsh"
クリップボードが機能しない (旧macOSの場合)
macOS Monterey 以降では下記が設定してあれば、reattach-to-user-namespaceを使用しないでコピーできる様子。
set -g default-shell /bin/zsh
症状:
- tmux内でコピーしたテキストが他のアプリで使用できない (旧macOS)
解決方法:
# 1. reattach-to-user-namespaceをインストール
brew install reattach-to-user-namespace
# 2. ~/.tmux.confに以下を追加
set -g default-command "reattach-to-user-namespace -l zsh"
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
Linux固有の問題
クリップボードが機能しない (Linuxの場合)
解決方法:
# X11環境
sudo apt-get install xclip
# ~/.tmux.confに追加
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
# Wayland環境
sudo apt-get install wl-clipboard
# ~/.tmux.confに追加
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"
一般的な問題
設定が反映されない
# 1. 設定ファイルの場所を確認
ls -la ~/.tmux.conf
# 2. 設定の構文エラーを確認
tmux source-file ~/.tmux.conf
# 3. 全セッションを終了して再起動
tmux kill-server
tmux new-session -s test
キーバインドが効かない
# 現在のキーバインドを確認
tmux list-keys
# 特定のキーバインドを確認
tmux list-keys -T copy-mode-vi
# mode-keysの設定を確認
tmux show-window-options -g mode-keys
セッションが見つからない
# 全セッションを確認
tmux ls
# サーバーが起動していない場合
tmux new-session -d -s temp
tmux ls
設定の確認方法
# 現在の端末設定
tmux show-options -g default-terminal
tmux show-options -g terminal-overrides
# マウス設定
tmux show-options -g mouse
# プレフィックスキー設定
tmux show-options -g prefix
# コピーモード設定
tmux show-window-options -g mode-keys
Mac標準ターミナルでのoptionキー・矢印キーのカスタマイズ(実体験メモ)
option+矢印キーが効かない場合の対処
MacのTerminal.appでは、.tmux.confでbind -n M-Right
などを設定しても、option+矢印キーがtmuxに正しく伝わらない場合があります。
主な現象
- option+→やoption+←を押すと、tmuxには「M-Right」ではなく「M-f」「M-b」などとして送信されることが多い
- そのため、
bind -n M-Right
ではなく、bind -n M-f
やbind -n M-b
でバインドするとうまくいく
解決策1:tmuxのバインドを変更する
bind -n M-f resize-pane -R 5 # option+→ で右にリサイズ
bind -n M-b resize-pane -L 5 # option+← で左にリサイズ
解決策2:「メタキーとしてオプションキーを使用」にチェック
- Terminal.appの「設定」→「キーボード」→「メタキーとしてオプションキーを使用」にチェックを入れる
- これにより、option+↑/option+↓(上下)もtmuxで
M-Up
やM-Down
として認識されるようになり、
.tmux.conf
でbind -n M-Up
やbind -n M-Down
を設定していれば上下のリサイズも可能になる
- Mac標準ターミナルではoption+矢印キーの挙動が特殊なため、tmuxのバインドを「M-f」「M-b」などにすることで直感的な操作が可能
- 「メタキーとしてオプションキーを使用」にチェックを入れることで上下方向もカバーできる
例:実際にうまくいった設定
bind -n M-f resize-pane -R 5 # option+→ で右にリサイズ
bind -n M-b resize-pane -L 5 # option+← で左にリサイズ
bind -n M-Up resize-pane -U 5 # option+↑ で上にリサイズ
bind -n M-Down resize-pane -D 5 # option+↓ で下にリサイズ