りんごとバナナとエンジニア

エンジニア修行の記録

tmux 3.0でコピーモードの設定を行う

先日、tmuxを久しぶりに使う機会があった。 tmux.conf の中身は、以前ネットで拾ってきたものをそのまま使っていたのだが、設定内容を全然使いこなせていないうえ、あまりに久しぶりすぎて中身の意味もわからない状態になってしまっていた。そこで、思い切って tmux.conf を消して作り直すことにした。
今回はコピーモードの設定を行う。tmuxを仕事で使う時で最も重要な場面は、ssh接続で時間のかかる作業を行う時であり、その場合は出力結果をコピーしてドキュメントに残しておかなければいけないことが多い。そのため、クリップボードとつなげておくことは不可欠だ。

コピーモードでのKey Table

man tmux で表示されるマニュアルが参考になった。

man7.org

コピーモードには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以降では必要なくなったそうだ。

blog.nijohando.jp