tmux の status line にネットワーク情報を表示する (Cygwin版)

# はじめに

ターミナルマルチプレクサ tmux のステータスバーは、かなり柔軟にカスタマイズすることができます。
また、macOS上では、[ここ](http://qiita.com/b4b4r07/items/01359e8a3066d1c37edc)や[ここ](http://qiita.com/arks22/items/a792d9d43d913c373520)で紹介されているように、WifiのSSID、電波強度、バッテリー状況等、WindowsのタスクバーやmacOSのメニューバーに表示されているような情報まで表示することもできます。
ターミナルを全画面表示して作業をする人にとってはとてもありがたいのですが、上記の記事はいずれもmacOS向けに書かれたものです。職場でMacもBash on Windowsも使えず、Windows7に入れたCygwinの中で泣く泣く暮らしている僕のような者は指をくわえて見ることしかできません。
そこで、自分的に必須なWifi関連の情報表示だけでも、Cygwin環境下で実現できるようzshスクリプトを組みました。


# 成果

![スクリーンショット 2017-06-27 20.08.50.png](https://qiita-image-store.s3.amazonaws.com/0/29000/28bb77f7-ede6-6644-895b-2fad8a25dd32.png)


こんな感じです。

右上に Wifi の電波強度・SSIDを表示しています。

![スクリーンショット 2017-06-27 20.08.50_a.png](https://qiita-image-store.s3.amazonaws.com/0/29000/674a0382-5d04-4975-5a89-5722177c5513.png)



### 環境
- Windows7 Professional SP1 64bit
    - Cygwin 2.8.0-1
- Windows10 Home
    - Cygwin 2.8.0


# 解説

情報の取得は、以下のスクリプトで実現しています。

```zsh:/usr/local/bin/wifi
network_info=(`netsh wlan show interfaces | sed -e '/^\s*$/d' -e 's/\s//g' | awk -F : '{print $2}'`)

state=${network_info[5]}
ssid=${network_info[6]}
signal=${network_info[15]}

case "${state}" in
    "connected")
        signals=(▁ ▂ ▄ ▆ █)
        signal_icon=""
        signal_=`echo $((${signal%\%} / 100.0 * 5 + 1))`

        for ((i=0; i < $signal_; i++ )); do
            signal_icon="${signal_icon}${signals[$i]}"
        done
        ;;
    "authenticating")
        signal_icon="#[fg=yellow] ... #[default]"
        ;;
    "disconnected")
        signal_icon="#[fg=red] ✘ #[default]"
        ;;
esac

echo "${signal_icon} #[bg=colour027,fg=white] ${ssid} #[bg=default,fg=default]"
```

### 前提

Cygwin内で`chcp 65001`を実行し、文字コードをUTF-8にしておきます。
zshを起動する度に入力するのは面倒なので、起動時に実行させるため、`~/.zshrc`等に書いておくことをおすすめします。

```zsh:~/.zshrc
...
chcp 65001 > /dev/null
...
```

### 1行目

```zsh
network_info=(`netsh wlan show interfaces | sed -e '/^\s*$/d' -e 's/\s//g' | awk -F : '{print $2}'`)
```

`netsh`コマンドは、Windows環境下でネットワークに関する情報を見たり操作するコマンドです。Cygwinからでも同様のコマンドが使えます。

以下のコマンドで、ワイヤレスネットワーク接続の情報を得ることができます。

```zsh
$ netsh wlan show interfaces
```

![スクリーンショット 2017-06-27 20.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/29000/6c7ada1a-83c9-edb6-f198-15704d6a25b0.png)


ここから State, SSID, Signal 欄のデータを取り出すために、シェル芸を駆使していきます。
まずは余計な空行を削除します。

```zsh
$ netsh wlan show interfaces | sed -e '/^\s*$/d'
```

![スクリーンショット 2017-06-27 20.09.50.png](https://qiita-image-store.s3.amazonaws.com/0/29000/a0f9d9f0-5af7-218a-6861-0be0e82fdcc9.png)


各行には無駄なスペースがたくさんあるので、それも取り除きます。

```zsh
$ netsh wlan show interfaces | sed -e '/^\s*$/d' -e 's/\s//g'
```

![スクリーンショット 2017-06-27 20.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/29000/9a1adf2e-496b-78da-9677-e32394665ae7.png)


最後に、`:`をフィールドセパレータにして各行を分割し、その2列目を出力します。

```zsh
$ netsh wlan show interfaces | sed -e '/^\s*$/d' -e 's/\s//g' | awk -F : '{print $2}'
```

![スクリーンショット 2017-06-27 20.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/29000/07cfe37a-3a86-2f26-0095-05b4d57d6175.png)


MACアドレス(Physicaladdress)やBSSIDは値自体も`:`で区切られているため出力がおかしいですが、今回は必要ないデータなので無視します。

これで`:`以降の文字列を取ることができたので、全体を`(````)`で囲み、配列にして変数に入れます。

```zsh
network_info=(`netsh wlan show interfaces | sed -e '/^\s*$/d' -e 's/\s//g' | awk -F : '{print $2}'`)
```

後は`network_info[5]`, `network_info[6]`のように行番号をインデックスとすることで、各データを取り出せます。

### 7~23行目

```zsh
case "${state}" in
    "connected")
        signals=(▁ ▂ ▄ ▆ █)
        signal_icon=""
        signal_=`echo $((${signal%\%} / 100.0 * 5 + 1))`

        for ((i=0; i < $signal_; i++ )); do
            signal_icon="${signal_icon}${signals[$i]}"
        done
        ;;
    "authenticating")
        signal_icon="#[fg=yellow] ... #[default]"
        ;;
    "disconnected")
        signal_icon="#[fg=red] ✘ #[default]"
        ;;
esac
```

取得したState欄のデータ(接続状態)によって表示を変えます。

- `connected` → 電波状態を表すアイコン(▁ から ▁▂▄▆█ まで5段階)
- `authenticating` → ...
- `disconnected` → ✘

最後にアイコンとSSIDを繋げて出力します。

```zsh
echo "${signal_icon} #[bg=colour027,fg=white] ${ssid} #[bg=default,fg=default]"
```

これらをスクリプトにまとめ、PATHの通った場所(/usr/local/bin 等)に配置し、CLIから実行すると、以下のような出力を得られます。

![スクリーンショット 2017-06-27 20.29.09.png](https://qiita-image-store.s3.amazonaws.com/0/29000/94a9b6da-83d4-ec6d-61a2-30a11a4c2a46.png)


`#[]`で記述されているのはtmuxの色指定です。そのままtmuxに渡すと、背景色や文字色を変えてくれます。


## .tmux.conf

tmux 設定ファイルに以下のように記述します。

```:~/.tmux.conf
set-option -g status-right "#(wifi) [%m-%d(%a) %H:%M:%S] "
```

`#()`で囲むと、その中の文字列をシェルコマンドとして認識してくれます。
上記スクリプトを`/usr/local/bin/wifi`として保存した場合、`#(wifi)`と記述します。

設定ファイルを再読込すると、status line の右側にステータス + 現在時刻が表示されます。


# 参考サイト

- [ターミナルマルチプレクサ tmux をカスタマイズする](http://qiita.com/b4b4r07/items/01359e8a3066d1c37edc)
- [tmuxのステータスバーにssidとかバッテリーとか音量とかload averageとか出す](http://qiita.com/arks22/items/a792d9d43d913c373520)