tmux v2.9 マイグレーションガイド 〜 tmux をv2.9 に上げたらinvalid option エラーが出た

# tmux をv2.9 にアップグレードしたら出たエラー 

tmux をv2.9 にアップグレードすると以下のようなエラーが出るようになりました。

```text
/home/your-name/.tmux.conf:9: invalid option: pane-active-border-fg
/home/your-name/.tmux.conf:10: invalid option: message-bg
/home/your-name/.tmux.conf:12: invalid option: status-right-attr
/home/your-name/.tmux.conf:13: invalid option: message-fg
/home/your-name/.tmux.conf:14: invalid option: message-command-bg
/home/your-name/.tmux.conf:15: invalid option: status-attr
/home/your-name/.tmux.conf:17: invalid option: pane-border-fg
/home/your-name/.tmux.conf:18: invalid option: status-left-attr
/home/your-name/.tmux.conf:19: invalid option: window-status-fg
/home/your-name/.tmux.conf:20: invalid option: window-status-attr
/home/your-name/.tmux.conf:21: invalid option: window-status-activity-bg
/home/your-name/.tmux.conf:22: invalid option: window-status-activity-attr
/home/your-name/.tmux.conf:23: invalid option: window-status-activity-fg
/home/your-name/.tmux.conf:25: invalid option: window-status-bg
```

これはtmux をv2.9 系へ上げたことによっていくつかのオプションの記載方式が変わったためです。
このissue は既に挙げられています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">tmux がv2.9 にバージョンアップしたことに対してマイグレーションに関するissue が約3 日前から上がっている。これから自分のtmux 設定ファイルもマイグレーション始めるか💪<a href="https://t.co/fCoHvhDUPI">https://t.co/fCoHvhDUPI</a></p>&mdash; tsutomu (@tsuna0x00) <a href="https://twitter.com/tsuna0x00/status/1122675442173890560?ref_src=twsrc%5Etfw">April 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# どのように修正すればよいか 
今まで記載していたオプションを以下のように書式変更すれば良いです。

```text:例)オプションの変更例
set -g pane-border-fg "colour236"
↓　↓　↓　↓　↓
set -g pane-border-style fg="colour236"

setw -g window-status-activity-bg "colour16"
setw -g window-status-activity-attr "underscore"
setw -g window-status-activity-fg "colour45"
↓　↓　↓　↓　↓
setw -g window-status-activity-style bg="colour16","underscore",fg="colour45"
```

新しく書式が変更されたオプションについては以下のものになります。

```text:新しく書式が変更されたオプション一覧
message-command-style
message-style
mode-style
pane-active-border-style
pane-border-style
status-left-style
status-right-style
status-style
window-active-style
window-status-activity-style
window-status-bell-style
window-status-current-style
window-status-last-style
window-status-style
window-style
```

# 修正する 
tbutts 氏のmigration スクリプトを使うと簡単にできます。

- tbutts/tmux-migrate-options.py
    - https://gist.github.com/tbutts/6abf7fb5b948c066bf180922fb37adcf

これを`tmux-migrate-options.py` というファイル名で保存して以下のようにコマンドを実行すればOK です。

```console
$ wget https://gist.githubusercontent.com/tbutts/6abf7fb5b948c066bf180922fb37adcf/raw/198f744327a9924febdd11677f044a4ecd3f3c96/tmux-migrate-options.py
$ cp ~/.tmux.conf ~/.tmux.conf.org
$ python tmux-migrate-options.py ~/.tmux.conf.org > ~/.tmux.conf
$ diff ~/.tmux.conf.org ~/.tmux.conf
......
```

※.tmux.conf から`source-file` でファイルを別ファイルからインポートしている場合はそのファイルに対しても実行するようにしてください。

# 後方互換性も持たせたい場合 
後方互換性も持たせたい場合はtmux.conf のif-shell 構文を使って以下のようにtmux のバージョンによって適用するオプションを変更することができます。

```text:tmux.conf内に書く例
# ......
run-shell "tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-)"
if-shell -b '[ "$(echo "$TMUX_VERSION < 1.9" | bc)" -eq 1 ]' \
        "setw -g window-status-activity-bg 'colour16'; \
         setw -g window-status-activity-attr 'underscore'; \
         setw -g window-status-activity-fg 'colour45'"
        "setw -g window-status-activity-style bg='colour16','underscore',fg='colour45'"
```

* 2019/05/06 @ttdoda さんのコメントより、v2.9未満から`foo-{fg,bg,attr}` スタイルを適用するのではなくv1.9未満から使うように修正

上記のようにすることでtmux v2.9 未満の場合は従来どおりのオプションを、v2.9 以上の場合は新しいオプション書式を適用するようになります。

以上でtmux v2.9 へのマイグレーションは完了です。
楽しいtmux v2.9 ライフを😎

# 参考 
- Tmux 2.8.X to 2.9.X migratio #1689
    - https://github.com/tmux/tmux/issues/1689

- tbutts/tmux-migrate-options.py
    - https://gist.github.com/tbutts/6abf7fb5b948c066bf180922fb37adcf

- How to write if statement in .tmux.conf to set different options for different tmux versions?
    - https://stackoverflow.com/questions/35016458/how-to-write-if-statement-in-tmux-conf-to-set-different-options-for-different-t