tmuxのコピーモードを解説!チュートリアルとおすすめ設定

tmuxの便利な機能に「コピーモード」があります。使いこなせれば作業効率が爆上がりなので解説します。

tmux自体の基本的な説明・使い方設定のファイルの書き方はそれぞれ別の記事で書いてますので、「まだ知らないぞ」って方はそちらからご覧ください。

※この記事はバージョン3.5aのtmuxに基づいて書いています。

コピーモードとは

tmuxのコピーモードはペインの出力をコピーするための機能です。キーボード操作だけで完結するので慣れると爆速です。もちろんマウス操作にも対応しています。

どういうタイミングで使うか一つひとつ見ていきましょう。

コピー

まずは単純にコピーです。エラーメッセージやログをコピーします。ググる時、人やAIに聞くときに重宝します。

出力を見る

単純に長い出力を見る時にも使います。サーバーやビルドのログなどなど。単に閲覧するだけではなく検索できるのも便利です。

筆者は「errorの文字列で検索」をよくやってます。普通に目で探すより楽です。

キーバインドのスタイルは2種類

コピーモードのキーバインドはemacsviの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 # こっちが新しい書き方

使い方

モードと聞くとなんだか難しい感じがしますが、流れは単純です。

  1. コピーモードを開始
  2. (検索)
  3. コピー開始位置にカーソルを移動
  4. 選択を開始
  5. コピー終了位置にカーソルを移動
  6. 選択を終了
  7. コピー
  8. コピーモードを終了

デフォルトのキーバインド

コピーモードの起動はviemacs共通でprefix+[です。

よく使いそうなデフォルトのキーバインドを書いていきます。コピーモード中はprefix不要です。

内容viemacs
後方検索/割り当てなし
前方検索?割り当てなし
選択開始SpaceC-Space
選択の解除EscC-g
コピーモードの終了qEsc
コピー&コピーモード終了EnterM-w

カーソル移動やスクロールもそれぞれのスタイルが用意されています。

内容viemacs
左に移動hLeft
上に移動kUp
下に移動jDown
右に移動lRight
行頭に移動^C-a
行末に移動$C-e
半ページ上にスクロールC-uM-Up
半ページ下にスクロールC-dM-Down

すべてのデフォルトキーバインドはman 1 tmuxWINDOWS 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-clipboardonまたはexternalに設定します。

tmux.conf
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の中で実行
tmux info | grep Ms:

次のように表示されれば、Ms capabilityがオンです。次の「ステップ3」へ進みましょう。

結果の例
193: Ms: (string) \033]52;%p1%s;%p2%s\a
Ms capabilityが設定済みじゃない場合

もしMs: [missing]のような表示の場合は別途tmuxで設定が必要です。

まずtmuxの外で次のコマンドを実行します。

tmuxは使わないで確認
# prefix + d などでデタッチしてから実行!
echo $TERM

この値をメモして、tmuxに次の設定をします。

tmux.conf
set-option -as terminal-features ',YOUR-TERM-NAME:clipboard'

YOUR-TERM-NAMEの部分はさっき実行した「echo $TERMの値」を書きます。

set-optionの細かいオプションの意味は次のとおり。

  • -a:オプションの追記
  • -s:サーバー(ソケット)単位での設定
3 ターミナルでOSC 52を有効にする

使っているターミナルでOSC 52が有効なのか確認します。WeztermRio Terminalだとデフォルトで有効なようです。

その他のターミナルはtmuxのWikiか検索で調べ、OSC 52を有効化してください。

4 tmuxを再起動

最後にtmuxを再起動します。

tmuxの外で実行
# prefix + d などでデタッチしてから実行!
tmux kill-server
tmux new-session -s default # セッションの作成方法はお好きに

外部ツールを使う

クリップボード共通の方法2つ目は外部ツールを使う方法です。OSC 52を使わず、pbcopyのようなコマンドを使います。

1 set-clipboardの設定

まずはset-clipboardoffに設定します。

tmux.conf
set-option -s set-clipboard off

2 copy-commandの設定

copy-commandに使いたいクリップボード操作のコマンドを書きます。

tmux.conf
set-option -s copy-command 'pbcopy'

Macであればpbcopy、Linuxであればxsel -iなどです。

環境によって切り替えたいならif-shellで分岐するのが便利です。

tmux.conf
if-shell 'which xsel' {
set-option -s copy-command 'xsel -i'
}
if-shell 'which pbcopy' {
set-option -s copy-command 'pbcopy'
}
3 tmuxを再起動

最後にtmuxを再起動します。

tmuxの外で実行
# prefix + d などでデタッチしてから実行!
tmux kill-server
tmux new-session -s default # セッションの作成方法はお好きに

OSC 52 vs 外部ツール

OSC 52の方はssh接続越しでも使えるメリットがあります。たとえば「ssh先のNeovimでヤンクしたら、ローカル側のOSのクリップボードに入る」ということです。

外部ツールの方はターミナルに依存せずに簡単に設定できます。

「OSC 52対応のターミナル」かつ「tmuxがバージョン3.2以上」ならOSC 52、そうじゃないなら外部ツール方式がいいかなと筆者は考えています。

コピーモードのキーバインド設定方法

コピーモード中のキーバインドはオプション-T(テーブル指定)を付けて設定します。

たとえばemacsスタイルならcopy-modeviスタイルなら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-promptnext-promptはOSC 133に対応している環境じゃないと使えない点に注意です。

筆者の環境だと-o(ジャンプ先をアウトプットにする)を付けないと動かないので調査中です。

マウス操作

tmuxでマウス操作を有効化するには次の1行を書くだけです。

Terminal window
set-option -g mouse on

過去のtmuxではスクロール優先やコピーモードとの兼ね合いがあって、WheelUpPaneWheelDownPaneに泣く泣く自作の複雑なキーバインドを割り当てていました。
現在は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から対応しているようです。サーバー側に入れる最小限の設定で入れるならこんな感じ。

~/.config/nvim/init.lua
vim.opt.clipboard = { "unnamedplus", "unnamed" }
vim.g.clipboard = 'osc52'

これで、サーバー側のnvimでヤンクした内容がローカル側のOSのクリップボードに入ります。

現在の設定が見たい

「本当に反映されたか?」ってtmux不信に陥った時のために、現在の設定値を見る方法も書いておきます。

オプションを見る

show-optionsで表示されます。

Terminal window
tmux show-options set-clipboard

キーバインド一覧

list-keysで表示されます。

Terminal window
tmux list-keys

ただめっちゃ長いのでgrepと組み合わせるのがおすすめです。

Terminal window
tmux list-keys | grep "Mouse"

デフォルト設定が見たい

「デフォルト設定は何なんだろう?」って好奇心が溢れた時のために、見る方法を書いておきます。

man 1 tmuxでも載っていたりしますが、実装を見るのが一番です。

※リンク切れを防ぐために、リンク先は現時点(2025年8月5日)でのmasterブランチにしています。

「探すの面倒くせぇ〜」って場合はtmuxのDeepWikiに聞くと楽です。


tmux初心者のころは設定が黒魔術に見えていたのですが、今回の記事を書いて普通の構文に見えるようになったのでよかったです。
昔のtmuxだとクリップボードやマウス周りで独自に設定していたのですが、今ではデフォルトでよしなにやってくれて設定ダイエットになりました。