tmuxのコピーモードを解説!チュートリアルとおすすめ設定
tmuxの便利な機能に「コピーモード」があります。使いこなせれば作業効率が爆上がりなので解説します。
tmux自体の基本的な説明・使い方や設定のファイルの書き方はそれぞれ別の記事で書いてますので、「まだ知らないぞ」って方はそちらからご覧ください。
※この記事はバージョン3.5a
のtmuxに基づいて書いています。
コピーモードとは
tmuxのコピーモードはペインの出力をコピーするための機能です。キーボード操作だけで完結するので慣れると爆速です。もちろんマウス操作にも対応しています。
どういうタイミングで使うか一つひとつ見ていきましょう。
コピー
まずは単純にコピーです。エラーメッセージやログをコピーします。ググる時、人やAIに聞くときに重宝します。
出力を見る
単純に長い出力を見る時にも使います。サーバーやビルドのログなどなど。単に閲覧するだけではなく検索できるのも便利です。
筆者は「error
の文字列で検索」をよくやってます。普通に目で探すより楽です。
キーバインドのスタイルは2種類
コピーモードのキーバインドはemacs
とvi
の2種類が用意されています。好きな方を使いましょう。
デフォルトはemacs
ですが、環境変数EDITOR
などにvi
という文字列が含まれているとvi
スタイルが適用されるようです。
とはいえ、明示的に書いておいたほうがAIに設定を聞く時に便利です。
set-option -gw mode-keys vi
gwって何?
-gw
は「オプションを全ウィンドウ単位で設定する」指定です。
「オプションの単位ってどんなのがあるの?」って方は設定のファイルの書き方の記事をご覧ください。
mode-keys
はウィンドウレベルのオプションであるため、-g
よりも-gw
の方が適切です(参考:実装)。
※ウィンドウ単位の指定は set-window-option
という設定方法もありましたが、これは古い書き方です。
# set-window-option -g mode-keys vi # 古い書き方set-option -gw mode-keys vi # こっちが新しい書き方
使い方
モードと聞くとなんだか難しい感じがしますが、流れは単純です。
- コピーモードを開始
- (検索)
- コピー開始位置にカーソルを移動
- 選択を開始
- コピー終了位置にカーソルを移動
- 選択を終了
- コピー
- コピーモードを終了
デフォルトのキーバインド
コピーモードの起動はvi
・emacs
共通でprefix+[です。
よく使いそうなデフォルトのキーバインドを書いていきます。コピーモード中はprefix不要です。
内容 | vi | emacs |
---|---|---|
後方検索 | / | 割り当てなし |
前方検索 | ? | 割り当てなし |
選択開始 | Space | C-Space |
選択の解除 | Esc | C-g |
コピーモードの終了 | q | Esc |
コピー&コピーモード終了 | Enter | M-w |
カーソル移動やスクロールもそれぞれのスタイルが用意されています。
内容 | vi | emacs |
---|---|---|
左に移動 | h | Left |
上に移動 | k | Up |
下に移動 | j | Down |
右に移動 | l | Right |
行頭に移動 | ^ | C-a |
行末に移動 | $ | C-e |
半ページ上にスクロール | C-u | M-Up |
半ページ下にスクロール | C-d | M-Down |
すべてのデフォルトキーバインドはman 1 tmux
のWINDOWS AND PANES
セクションに載っています。
クリップボードの共有
デフォルトでは「tmuxのコピーモードでコピーした内容」はOSのクリップボードと共有されません。共有しておいたほうが便利なので設定しましょう。
昔のtmuxでは各々が複雑なスクリプトを書いて実現していたのですが、現在は簡単な方法が2種類用意されています。公式Wikiを参考に見ていきます。
※まずここで解説するのは「tmux内のコピー → tmux・OSでの貼り付け」です。
OSC 52を使う
1つ目の方法はOSC 52というしくみを使う方法です。
OSC 52って何?
OSC = Operating System Commandsはその名のとおり「ターミナル・OS間でやりとりするしくみ」です。OSC 52はその52番に割り振られている「クリップボード操作」です。
OSC 52でのやり方
説明ありなので長く感じるかもしれませんが、ざっくり4ステップだけです。
1 set-clipboardの設定
まずはset-clipboard
をon
またはexternal
に設定します。
set-option -s set-clipboard on# set-option -s set-clipboard external
デフォルトはexternal
です。on
だとtmux内で実行されているコマンド(echoなど)もOSC 52を通じた操作ができます。
2 Ms capabilityの確認
Ms capabilityという「ターミナル側の選択範囲(クリップボード)をtmuxで使えるようにする機能」がオンになっているか確認します。
ちなみにMsの由来は探しても出てこなかったです。単なる識別子なのかMouse selectionとかそういう意味なのかも?
確認コマンドを実行
次のコマンドをtmuxの中で実行します。
# tmuxの中で実行tmux info | grep Ms:
次のように表示されれば、Ms capabilityがオンです。次の「ステップ3」へ進みましょう。
193: Ms: (string) \033]52;%p1%s;%p2%s\a
Ms capabilityが設定済みじゃない場合
もしMs: [missing]
のような表示の場合は別途tmuxで設定が必要です。
まずtmuxの外で次のコマンドを実行します。
# prefix + d などでデタッチしてから実行!echo $TERM
この値をメモして、tmuxに次の設定をします。
set-option -as terminal-features ',YOUR-TERM-NAME:clipboard'
YOUR-TERM-NAME
の部分はさっき実行した「echo $TERM
の値」を書きます。
set-option
の細かいオプションの意味は次のとおり。
-a
:オプションの追記-s
:サーバー(ソケット)単位での設定
3 ターミナルでOSC 52を有効にする
使っているターミナルでOSC 52が有効なのか確認します。WeztermやRio Terminalだとデフォルトで有効なようです。
その他のターミナルはtmuxのWikiか検索で調べ、OSC 52を有効化してください。
4 tmuxを再起動
最後にtmuxを再起動します。
# prefix + d などでデタッチしてから実行!tmux kill-servertmux new-session -s default # セッションの作成方法はお好きに
外部ツールを使う
クリップボード共通の方法2つ目は外部ツールを使う方法です。OSC 52を使わず、pbcopy
のようなコマンドを使います。
1 set-clipboardの設定
まずはset-clipboard
をoff
に設定します。
set-option -s set-clipboard off
2 copy-commandの設定
copy-command
に使いたいクリップボード操作のコマンドを書きます。
set-option -s copy-command 'pbcopy'
Macであればpbcopy
、Linuxであればxsel -i
などです。
環境によって切り替えたいならif-shell
で分岐するのが便利です。
if-shell 'which xsel' { set-option -s copy-command 'xsel -i'}if-shell 'which pbcopy' { set-option -s copy-command 'pbcopy'}
3 tmuxを再起動
最後にtmuxを再起動します。
# prefix + d などでデタッチしてから実行!tmux kill-servertmux new-session -s default # セッションの作成方法はお好きに
OSC 52 vs 外部ツール
OSC 52の方はssh接続越しでも使えるメリットがあります。たとえば「ssh先のNeovimでヤンクしたら、ローカル側のOSのクリップボードに入る」ということです。
外部ツールの方はターミナルに依存せずに簡単に設定できます。
「OSC 52対応のターミナル」かつ「tmuxがバージョン3.2以上」ならOSC 52、そうじゃないなら外部ツール方式がいいかなと筆者は考えています。
コピーモードのキーバインド設定方法
コピーモード中のキーバインドはオプション-T
(テーブル指定)を付けて設定します。
たとえばemacs
スタイルならcopy-mode
、vi
スタイルならcopy-mode-vi
を-T
に指定します。
bind-key -T copy-mode-vi y send-keys -X copy-pipe
send-keys -X <command>
でコピーモード中にコマンドを実行できます。上記の例ではcopy-pipe
(コピー)の実行です。
見やすく書くには
筆者は見やすくするために{}
でキーバインドの中身を囲ってます。
bind-key -T copy-mode-vi y { send-keys -X copy-pipe }
カスタマイズ設定
ここからはカスタマイズの例を紹介します。
コピーモードの選択をVimに寄せる
コピーモードvi
のデフォルト設定では、Spaceが選択開始です。
筆者は選択開始(begin-selection
)をvに設定しています。
bind-key -T copy-mode-vi v { send-keys -X begin-selection }bind-key -T copy-mode-vi C-v { send-keys -X rectangle-toggle }bind-key -T copy-mode-vi V { send-keys -X select-line }
同じようにrectangle-toggle
(ブロック選択)も設定してます。
ちなみにselect-line
(行選択)はデフォルトでも設定されますが、3種類のうち1つだけ書かないのがなんとなく気持ち悪くて筆者は書いてます。
プロンプトへの移動
コピーモード中に前後のプロンプトへ移動するキーバインドも設定しています。長い出力があるときに便利です。
# OSC 133の設定が必要bind-key -N "cmode: 前のプロンプトへ移動"-T copy-mode-vi [ { send-keys -X previous-prompt -o}bind-key -N "cmode: 次のプロンプトへ移動"-T copy-mode-vi ] { send-keys -X next-prompt -o}
previous-prompt
とnext-prompt
はOSC 133に対応している環境じゃないと使えない点に注意です。
筆者の環境だと-o
(ジャンプ先をアウトプットにする)を付けないと動かないので調査中です。
マウス操作
tmuxでマウス操作を有効化するには次の1行を書くだけです。
set-option -g mouse on
過去のtmuxではスクロール優先やコピーモードとの兼ね合いがあって、WheelUpPane
やWheelDownPane
に泣く泣く自作の複雑なキーバインドを割り当てていました。
現在はmouse on
というオプション設定だけでスクロール・クリック時の挙動が用意されます。
ドラッグ時の挙動を変更
デフォルトだと、コピーモード中に「マウスによる範囲選択(ドラッグ&ドロップ)」をすると その範囲がすぐにコピー&コピーモードが終了 します。
筆者はこれが嫌なので次のように解除しています。
# コピーモードでマウス範囲選択の時の すぐコピー&終了 を解除unbind-key -T copy-mode-vi MouseDragEnd1Pane
ダブルクリックで単語選択
ダブルクリックで単語選択するキーバインドを設定してみましょう。
bind-key -T copy-mode-vi DoubleClick1Pane { select-pane ; send-keys -X select-word }
設定しといてアレですが、あんまり使っていません。
トラブルシューティングとFAQ
随時追記します。
設定が反映されない
まずは別の記事の「トラブルシューティング」をご覧ください。
tmuxは最新?
tmuxのバージョンに注意です。筆者が「動かないぞ」と悩んでいたときはそもそもssh先のtmuxが2.1でした。
公式の変更履歴を見た感じこういう対応です。
- OSC52サポート:tmux2.4以上
copy-command
:tmux3.2以上
ssh側でも同じように確認したか?
ssh側にtmuxを入れていてOSとクリップボードを共有したい場合、ssh側にも同じように設定が必要です。
ただローカル側のコピーモードを使えばよいので設定しなくてもそこまで困らないかも?
「ssh側のVim・Neovimでヤンクしたときのクリップボードが〜」という話であれば設定しましょう。
Neovimの場合は次のセクションに最低限の設定例を書いています。
ツール側で対応している?
普通に"\e]52;c;%s\a..."
と出力してコピーするならいいですが、Neovimのようなツールでも対応したいなら設定を確認しましょう。
たとえばNeovimであれば0.10から対応しているようです。サーバー側に入れる最小限の設定で入れるならこんな感じ。
vim.opt.clipboard = { "unnamedplus", "unnamed" }vim.g.clipboard = 'osc52'
これで、サーバー側のnvimでヤンクした内容がローカル側のOSのクリップボードに入ります。
現在の設定が見たい
「本当に反映されたか?」ってtmux不信に陥った時のために、現在の設定値を見る方法も書いておきます。
オプションを見る
show-options
で表示されます。
tmux show-options set-clipboard
キーバインド一覧
list-keys
で表示されます。
tmux list-keys
ただめっちゃ長いのでgrepと組み合わせるのがおすすめです。
tmux list-keys | grep "Mouse"
デフォルト設定が見たい
「デフォルト設定は何なんだろう?」って好奇心が溢れた時のために、見る方法を書いておきます。
man 1 tmux
でも載っていたりしますが、実装を見るのが一番です。
- オプション:tmux/options-table.c
- キーバインド:tmux/key-bindings.c
※リンク切れを防ぐために、リンク先は現時点(2025年8月5日)でのmasterブランチにしています。
「探すの面倒くせぇ〜」って場合はtmuxのDeepWikiに聞くと楽です。
tmux初心者のころは設定が黒魔術に見えていたのですが、今回の記事を書いて普通の構文に見えるようになったのでよかったです。
昔のtmuxだとクリップボードやマウス周りで独自に設定していたのですが、今ではデフォルトでよしなにやってくれて設定ダイエットになりました。