tmux 3.0でコピーモードの設定を行う
先日、tmuxを久しぶりに使う機会があった。 tmux.conf
の中身は、以前ネットで拾ってきたものをそのまま使っていたのだが、設定内容を全然使いこなせていないうえ、あまりに久しぶりすぎて中身の意味もわからない状態になってしまっていた。そこで、思い切って tmux.conf
を消して作り直すことにした。
今回はコピーモードの設定を行う。tmuxを仕事で使う時で最も重要な場面は、ssh接続で時間のかかる作業を行う時であり、その場合は出力結果をコピーしてドキュメントに残しておかなければいけないことが多い。そのため、クリップボードとつなげておくことは不可欠だ。
コピーモードでのKey Table
man tmux
で表示されるマニュアルが参考になった。
コピーモードには2種類のKey Tableが用意されており、それぞれviとemacsと名付けられている。名前の通り、viやemacs風のキーバインドを使うことができ、デフォルトではemacsの方が使われる。
自分はviの方がなじみがあるので、viのKey Tableを使うことにした。 tmux mode-keys
コマンドでKey Tableを設定できる。
setw -g mode-keys vi
余談だが、 tmux.conf
に書く内容は、全て tmux
コマンドに続ける形でコマンドラインから実行できる。単に実行させたいコマンドの一覧を書いているだけなので、設定ファイルの書き方を調べるよりもマニュアルを見る方がわかりやすかった。
コピーモードでのキーバインド
次に、よりviに近くなるようなキーバインドに変更する。ビジュアル選択は v
キーで行い、コピーは y
キーにしたい。
マニュアルによると、 tmux bind-key
コマンドでキーバインドを変えることができる。 bind-key [-nr] [-T key-table] key command [arguments]
の形式である。また、エイリアスとして bind
コマンドでも良い。
また、コピーモードでのキーバインドを設定する際は、 send-keys
コマンドが必要になる。マニュアルの以下の部分が非常にわかりやすい。
Commands are sent to copy mode using the -X flag to the send-keys com‐ mand. When a key is pressed, copy mode automatically uses one of two key tables, depending on the mode-keys option: copy-mode for emacs, or copy-mode-vi for vi. Key tables may be viewed with the list-keys com‐ mand. The following commands are supported in copy mode: Command vi emacs append-selection append-selection-and-cancel A back-to-indentation ^ M-m begin-selection Space C-Space bottom-line L cancel q Escape clear-selection Escape C-g copy-end-of-line [<prefix>] D C-k ...
コピーモードで使えるコマンドは、 begin-selection
などあらかじめ定義されている。指定したキー(例えば v
キー)を押すと、 send-keys
コマンドが呼び出され、対応するコピーモードコマンドが呼び出されるという流れになっている。
デフォルトでのキーバインド設定は、 tmux list-keys
コマンドで見ることができる。
tmux list-key bind-key -T copy-mode C-Space send-keys -X begin-selection bind-key -T copy-mode C-a send-keys -X start-of-line bind-key -T copy-mode C-b send-keys -X cursor-left bind-key -T copy-mode C-c send-keys -X cancel bind-key -T copy-mode C-e send-keys -X end-of-line bind-key -T copy-mode C-f send-keys -X cursor-right bind-key -T copy-mode C-g send-keys -X clear-selection bind-key -T copy-mode C-k send-keys -X copy-end-of-line bind-key -T copy-mode C-n send-keys -X cursor-down bind-key -T copy-mode C-p send-keys -X cursor-up ...
tmux.conf
にも、この形式の通りに書けば良い。 v
キーと y
キーであれば、以下のように書ける。
bind-key -T copy-mode-vi v send-keys -X begin-selection bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
なお、OSのクリップボードと連携させるためには、以前は reattach-to-user-namespace
ライブラリが必要だったが、 tmux2.6以降では必要なくなったそうだ。