【tmux】ssh接続先に応じて、自動でペインの背景色とタイトルを変更する

Windowsでtmuxを使おうとするとCygwinか[MSYS2](http://www.msys2.org/)の2択になるかと思います。
以下はMSYS2を使用している場合の手順ですが、Cygwinでもそんなに変わらないかと思います。


# tmuxのインストール

パッケージマネージャのpacman(apt-cygみたいの)でインストール出来るtmuxはバージョンが古い？様でペインのタイトルを変更することが出来ませんでした。

```sh
$ pacman -Sy tmux
$ tmux select-pane -T 'hoge'
# -T オプションの説明がない
usage: select-pane [-DdegLlMmRU] [-P style] [-t target-pane]
```

なのでgitのソースコードからビルドする形で最新バージョンをインストールしています。

```sh
$ pacman -Sy make autoconf pkg-config automake-wrapper gcc mingw-w64-x86_64-ncurses ncurses-devel libtool --noconfirm

$ cd ~/
$ git clone https://github.com/libevent/libevent.git
$ cd libevent
$ sh autogen.sh
$ ./configure
$ make
$ make install

$ cd ~/
$ git clone https://github.com/tmux/tmux
$ cd tmux
$ sh autogen.sh
$ ./configure
$ make
$ make install
```

```sh
$ tmux -S $(find /tmp -name 'tmux*')/default
$ tmux select-pane -T 'hoge'
# -T オプションが使用できる
```

`tmux`コマンドだけで起動しようとする`can't create socket: Permission denied`となり起動できませんでしたが、こちらを参考にさせていただき何とかなりました。
https://qiita.com/shibu_t/items/7556a075e25bd86aac3a


# ペインタイトルの表示

ペインタイトルを変更してもデフォルトではどこにも表示されませんので、以下の設定を追加します。

```vim:.tmux.conf
# status
set -g pane-border-status bottom
set -g pane-border-format " #{pane_index} : #T "
# border
set -g pane-border-fg green
set -g pane-border-bg black
# アクティブなペインの色
set -g pane-active-border-fg colour14
set -g pane-active-border-bg colour21
```

設定ファイルを読み込むために以下コマンドを実行。

```sh
$ tmux source-file ~/.tmux.conf \; display "Reloaded!"
```

こんな感じ。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/154029/d723bb5e-c837-2603-2862-e3a216d09c16.png)

- 選択中のペインのボーダーを変更
- ペイン番号とタイトルをボーダー下線に表示
- タイトルには現在のディレクトリが自動で反映される

試しに手動でペインタイトルを変更してみる。

```sh  
$ tmux select-pane -T 'hogehogehoge'
```  

![2.png](https://qiita-image-store.s3.amazonaws.com/0/154029/ba094eb1-2114-ed26-1439-968f8b915c56.png)

・・・変化しない。画像では伝わらないがコマンドを実行した直後、一瞬だけタイトルが変化したようにみえる。

現在選択中のペイン以外に対して実行してみる
```$ tmux select-pane -T 'hogehogehoge' -t 2```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/154029/3b083e0e-9d3d-a77e-b1a5-c568205c9d30.png)

選択中のペインが移動すると同時にタイトルが変化した。
どうやらエンターが入力された後、現在いるディレクトリ情報が自動的にペインタイトルに反映されてしまうらしい。

- 自分自身のペインタイトルを変更しようとした場合
    1. `ペイン1`で`ペイン1`のタイトルを`hoge`に変更するコマンドを入力してエンターを押す。
    2. `ペイン1`のタイトルが変更される。
    3. エンターを押されたので、`ペイン1`の現在いるディレクトリ情報が自動的にタイトルに上書きされる。
- 自分以外のペインタイトルを変更しようとした場合
    1. `ペイン1`で`ペイン2`のタイトルを`hoge`に変更するコマンドを入力してエンターを押す。
    2. `ペイン2`のタイトルが変更される。同時に選択中ペインも`ペイン2`になる。
    3. エンターが押されたのは`ペイン1`なので、`ペイン1`の現在いるディレクトリ情報が自動的にタイトルに反映されるが、`ペイン2`のタイトルは`hoge`のまま。

後の作業でも特に困らないので、ひとまずこの問題は放置しておく。

# 背景色の変更

事前に256色設定を有効にしておくこと。（いろいろな人がまとめてくれているので手順は省略します）

```$ tmux select-pane -P 'bg=cyan,fg=white'```

![4.png](https://qiita-image-store.s3.amazonaws.com/0/154029/8f20b1ba-f07e-65f0-76ae-cd3deb6e3e30.png)


# sshコマンド実行時にペインタイトル、背景色を変更する。

sshの引数をどのように判断するか？どんな色にするか？は自由に変更可能。

```sh:.bashrc
function ssh() {
  # tmux起動時
  if [[ -n $(printenv TMUX) ]] ; then
    # 現在のペインIDの退避と背景色の書き換え
    local pane_id=`tmux display -p '#{pane_id}'`
    # 接続先ホスト名に応じて背景色、文字色を切り替え
    if [[ `echo ${!#} | grep -E 'localhost|127\.0\.0\.1'` ]] ; then
        tmux select-pane -P 'fg=colour166,bg=colour233'
    else
        tmux select-pane -P 'fg=colour5,bg=colour233'
    fi
    tmux select-pane -T "${!#}"

    # 通常通りコマンド続行
    command ssh $@
    # デフォルトの色設定に戻す
    tmux select-pane -t $pane_id -P 'default'
  else
    command ssh $@
  fi
}
```

適当なホストにssh。
```ssh -p 2222 ubuntu@127.0.0.1```


![5.png](https://qiita-image-store.s3.amazonaws.com/0/154029/cd7b13b0-3e6f-aaee-e98a-410fbd063801.png)
![6.png](https://qiita-image-store.s3.amazonaws.com/0/154029/63825f14-92bd-07a7-cee2-97cc928e7eb7.png)