先日、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以降では必要なくなったそうだ。