Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@s4kr4

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

はじめに

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

成果

スクリーンショット 2017-06-27 20.08.50.png

こんな感じです。

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

スクリーンショット 2017-06-27 20.08.50_a.png

環境

  • Windows7 Professional SP1 64bit
    • Cygwin 2.8.0-1
  • Windows10 Home
    • Cygwin 2.8.0

解説

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

/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等に書いておくことをおすすめします。

~/.zshrc
...
chcp 65001 > /dev/null
...

1行目

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

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

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

$ netsh wlan show interfaces

スクリーンショット 2017-06-27 20.09.38.png

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

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

スクリーンショット 2017-06-27 20.09.50.png

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

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

スクリーンショット 2017-06-27 20.09.58.png

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

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

スクリーンショット 2017-06-27 20.10.09.png

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

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

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行目

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を繋げて出力します。

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

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

スクリーンショット 2017-06-27 20.29.09.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 の右側にステータス + 現在時刻が表示されます。

参考サイト

8
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What is going on with this article?