tmuxを2.6にアップグレードしてコピーができなくなる

皆さんは開発時にどのようなツールを使っているでしょうか?私はCUI派で長らくvim+tmuxの組み合わせを採用しています。

先日、tmuxをアップグレードしたのですが、そこで発生した問題と解決策を紹介したいと思います。

旅するエンジニアの三宅です。先週末はお休みをいただいて福井へ行ってきました。ソースカツ丼が美味しくて4日のうち3日はソースカツ丼を食べました。

遊んでばかりいるように思われると困るので、今回はエンジニアらしい話題です。

何気なくtmuxをアップデート

11月に入ってOSをmacOS High Sierraにアップデートした際に、どうもvimのシンタックスハイライトの描画が怪しくなり、とりあえず、まずはvimをアップグレードしました。

それでもどうにも不安定なので、関係しているとしたらtmuxではないかということで最新版の2.6にアップデートしてみました。

$ brew upgrade tmux

tmuxがエラーを吐きcopy-modeが動かなくなる

アップグレードが無事終了したので立ち上げてみると以下のようなエラーを吐くようになりました。

/Users/kotamiyake/.tmux.conf:12: usage: bind-key [-cnr] [-T key-table] key command [arguments] [0/0]0/0]
/Users/kotamiyake/.tmux.conf:13: usage: bind-key [-cnr] [-T key-table] key command [arguments] 
/Users/kotamiyake/.tmux.conf:16: usage: unbind-key [-an] [-T key-table] key 
/Users/kotamiyake/.tmux.conf:17: usage: bind-key [-cnr] [-T key-table] key command [arguments]

とりあえず起動はしたのですが、コピーした内容がうまくクリップボードに保存されなくなってしまいました。

これは不便ということで、Googleで検索してみると以下の記事を見つけました。

どうやらcopy-modeの設定が変わったということでした。記事の通りcopy-modeの設定を修正してからtmuxを起動するとエラーを吐かなくなり、コピーした内容がちゃんとクリップボードに保存されるようになりました。

Before

bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

After

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 "reattach-to-user-namespace pbcopy"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"

tmuxinatorが使えなくなった…と思ったら

tmuxinatorが使えなくなったので、代わりにtmux-resurrectを導入するという流れのつもりが、先程試してみたら問題なく起動できてしまいました。

とは言え、気になったので、このtmux-resurrectを導入してみたいと思います。

tmuxinatorは設定した状態に戻すだけですが、tmux-resuccrectは元の状態に復元してくれるということです。

tmux-resurrectの導入

READMEに沿って進めていきます。

Tmux Plugin Managerというものがあり、そちらを導入したほうが良いということでした。

Tmux Plugin Managerのインストール

tmux-plugins/tpm: Tmux Plugin Manager

インストールは簡単でgit cloneするだけです。

$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

それから下記の設定を.tmux.confに追加します。

set -g @plugin 'tmux-plugins/tpm'
run '~/.tmux/plugins/tpm/tpm'

最後に設定をリロードして完了です。

$ tmux source ~/.tmux.conf

tmux-resurrectのインストール

tmux-plugins/tmux-resurrect: Persists tmux environment across system restarts.

下記の設定を.tmux.confに追記してprefix+Iを実行して完了です。

set -g @plugin 'tmux-plugins/tmux-resurrect'

これでtmuxの情報を保存、復元ができるようになりました!

めでたしめでたし…と思ったら、うまく動きません。

どうやらデフォルトのbind-keyとtmux-resurrectのbind-keyが被っていたようです。

そこで私はドキュメントを参考にして以下のように設定しました。

set -g @resurrect-save 'S'
set -g @resurrect-restore 'R'

tmux-resurrect/custom_key_bindings.md at master · tmux-plugins/tmux-resurrect

これで晴れてtmux-resurrectが使えるようになりました。

今後はPC再起動などでターミナルを閉じないといけないときでも、ささっとprefix-Sを打ち込んで、再起動後にprefix-Rを押せば元の環境が戻ってくるようになりました。

まとめ

当然のことですが、ツール類のアップデートについては慎重に行わなくてはいけないということを改めて感じました。

それでも新しいツールを試すことができるのはわくわくするので、今後も慎重になりつつも開発環境の改善をしていきたいと思います。

TimeCrowdに戻る