Tmux 2.4 がリリースされたので気になった点

[CHANGES][] を参考に、いくつか気になる点を書き出してみました。

[CHANGES]: https://github.com/tmux/tmux/blob/master/CHANGES

# mode-table がなくなり、key-table に統合された

今回メインの修正点として挙げられているものです。これのせいで 2.4 にした途端、[コピーモードが動かずに阿鼻叫喚][copy]です。

[copy]: http://qiita.com/KanchiShimono/items/d3904c0dc4acf40b6705

2.3 までは

* mode-table
  - vi-copy, emacs-copy —— コピーモード
  - vi-edit, emacs-edit —— コマンド入力モード
  - vi-choice, emacs-choice —— 選択モード（`list-windows` とか）
* key-table
  - root —— prefix（デフォルトでは `<C-B>`）無しで打ったときのモード
  - prefix —— prefix 付きで打ったときのモード

これだけあったのが、2.4 だと

* key-table
  - root
  - prefix
  - copy-mode
  - copy-mode-vi

これだけ！だいぶすっきりしました。

今までは `bind-key` コマンドで `-c`, `-t`, `-T` を組み合わせて設定してたことが `-T` だけで良くなったのです。

```sh:2.3以前の設定
# v で範囲指定スタート
bind-key -t vi-copy v begin-selection
```

```sh:2.4以降の設定
# v で範囲指定スタート
bind-key -T copy-mode-vi v send-keys -X begin-selection
```

こんな感じ。コマンドがちょっと冗長になってしまいましたがしょうがない。

ただ、上でさらっと書いているのですが、**`*-edit`, `*-choice` が消えています。**[CHANGES][] をもう一度よく読んでみると、

> The emacs-edit, vi-edit, emacs-choose and vi-choose tables have been replaced by fixed key bindings in the command prompt and choose modes.
>
> emacs-edit（以下略）はコマンド入力モードと選択モードで予め定義されたキーバインドに置き換えられました。

とのことなので、**設定で変更不能になった**んですかね。まあ、`tmux vi-edit` とかでググっても全然ヒットしないので、誰も使ってなかったんでしょうか……。

# 設定ファイルで if 文が使えるようになった。

これは [example_tmux.conf][ex] に例示されています。

[ex]: https://github.com/tmux/tmux/blob/9d041d8e6c1f24828da727077bc13b49c1f58654/example_tmux.conf#L11-L14

```sh
# If running inside tmux ($TMUX is set), then change the status line to red
%if #{TMUX}
set -g status-bg red
%endif
```

環境変数 `$TMUX` が定義されているときにステータスラインが赤色になります。`#{...}` 構文はステータスラインに使える変数がそのまま使えます（`#{host}` とか）が、`%if .. %endif` ブロックで使うなら例に挙げられているように環境変数で場合分けするのが便利そうです。

これに併せて、変数が特定の値と一致、不一致する場合についての演算子も追加されています。

```sh
# $HOGE が fuga なら真
%if #{==:#{HOGE},fuga}

# $HOGE が fuga でなければ真
%if #{!=:#{HOGE},fuga}
```

ただこれ……せっかくの新機能ですが、イマイチ使いどころが分かりません。よくある用途としては

* [tmuxの設定をOSによって切り替える - 理系学生日記](http://kiririmode.hatenablog.jp/entry/20150207/1423296151)

上記記事のように OS によって設定を切り替える、というのが考えられるのですが、OS を判別する portable な方法としては `uname` コマンドくらいしかありません。しかし今回追加された `%if` ブロックは（基本的に）環境変数での分岐しか出来ないのです。

予め環境変数に `uname` の結果を入れとけばいいのですが、だったら最初から `if-shell` 使うよね……。(´・ω・｀)

# マイナーな変更点

どうせだから、そのほかの修正点についても一行コメントで書いていきます。よくわからない、とか書いてる部分は[原文][CHANGES]を参考にしてください（そして教えてください＞＜）。

## 互換性を失うもの

* `set-remain-on-exit` コマンドがなくなりました。代わりに hook で同じことができます。
* “before” hook がなくなりました。又、一部のコマンドだけが “after” hook を持つようになりました。他に、いくつか追加された hook もあります。
  - → hook は使ってないのでよくわかりません……。
* `xterm-keys` オプションはデフォルトで ON になりました。

## その他の改良点

* マウスのダブルクリック・トリプルクリックをサポートしました。
* BCE (Background Colour Erase) をサポートしました。
  - → [これ][]のための対応が必要なくなったのかな。
* コピーモードでの検索中、ヒットした全ての文字列がハイライトされるようになりました。又、ヒットした数も表示されます。デフォルトの emacs キーバインドのとき、ハイライトは対話的に更新されます（所謂インクリメンタルサーチ）。
* `source-file` コマンドに glob パターンが使えるようになりました。
* ステータスラインで使える変数が増えました。
  - `#{version}`
  - `#{client_termtype}`
  - `#{client_name}`
  - `#{client_written}`
* `detach-client` に `-E` オプションが付きました。クライアントが終了する代わりに別のコマンドを実行出来ます。
  - → [この PR][] によるものですが、正直用途がニッチすぎてよくわからない。
* 各コマンドに独自の別名を設定できるようになりました。`別名=コマンド`の形で設定できます。これは不明なコマンドがパースされたときに利用されます。
  - → `command-alias` というオプションのことみたいです。
* `break-pane` コマンド実行時に `-n` オプションを使うことで、新しく作成されるウィンドウに名前を設定できるようになりました。
* OSC 52 をサポートするようになったので tmux 内部のプログラムが tmux のバッファーをセットできるようになりました。
  - → 何のこっちゃ。
* マウスの “all event” モード（1003）がサポートされるようになりました。
  - → よくわからない……。
* Strikethrough（打ち消し線）がサポートされました。
  - → iTerm2 では[まだ対応していません](https://gitlab.com/gnachman/iterm2/issues/5130)。
* session group に `-t` オプションで名前が付けられるようになりました。
* `terminal-overrides` と `update-environment` オプションは配列で指定するようになりました（以前の `set -ag` 構文も変更無しで動きます）。
* その他、たくさんのパフォーマンス改良点があります。


[これ]: https://sunaku.github.io/vim-256color-bce.html
[この PR]: https://github.com/tmux/tmux/pull/717