りばーさいだー

気ままに書いてみます

tmux v2.4 以降はコピーモード設定が変更された

tl;dr

  • 新しい環境をセットアップしていた
  • いつもの dotfiles が使えなかった
  • tmux v2.3 -> v2.4 で設定のしかたが大きく変わっていたので変える必要がある
# こんな感じ
- bind -t vi-copy v begin-selection
+ bind -Tcopy-mode-vi v send -X begin-selection

きっかけ

新しい環境を用意していました。

当然のようにいつもの dotfiles で initialize したら tmux がうまく動かなかった。どうやら一部の bind-key の構文がうまく動いていないようだった。

エラーを追う

usage: bind-key [-cnr] [-T key-table] key command [arguments]

なんか bind の構文が変わったのかな。

とりあえず自分の tmux のバージョンを知っておく。

$ tmux -V
tmux 2.6

あれ、そんなにバージョンの数字大きかったっけ…調べてみよう。

tmux のリポジトリでチェンジログ( tmux/CHANGES )から grep してみると ココがどうもそれっぽい。 いくつかのキーテーブルに後方互換の無い変更が行われたらしい。

今回関係がある部分だけ抽出すると、

The emacs-copy and vi-copy tables have been replaced by the copy-mode and copy-mode-vi tables. Commands are sent using the -X and -N flags to send-keys.

ということだった。親切にも例を書いてくれているので見てみる。

# So the following:

  bind -temacs-copy C-Up scroll-up
  bind -temacs-copy -R5 WheelUpPane scroll-up

# Becomes:

  bind -Tcopy-mode C-Up send -X scroll-up
  bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

なるほどね。 hoge-copy というテーブルが消えて copy-mode に置き換わり、 bind してから send -X で実現するように修正されたと。

では例に習って自分の設定も修正してみる。

- bind -t vi-copy v begin-selection
+ bind -Tcopy-mode-vi v send -X begin-selection

幸せになれました。

付録

ちょっとググっても新しい tmux での vi キーバインドによるコピーモード設定が見つからなかったので共有。

# 選択開始: v
- bind -t vi-copy v begin-selection
+ bind -Tcopy-mode-vi v send -X begin-selection

# 行選択: V
- bind -t vi-copy V select-line
+ bind -Tcopy-mode-vi V send -X select-line

# 矩形選択: C-v
- bind -t vi-copy C-v rectangle-toggle
+ bind -Tcopy-mode-vi C-v send -X rectangle-toggle

# ヤンク: y
- bind -t vi-copy y copy-selection
+ bind -Tcopy-mode-vi y send -X copy-selection

# 行ヤンク: Y
- bind -t vi-copy Y copy-line
+ bind -Tcopy-mode-vi Y send -X copy-line

# ペースト: C-p
- bind C-p paste-buffer
+ bind-key C-p paste-buffer

ペーストは好みが別れるバインドかもしれない。

誰かの参考になれば良いな。