2016/10/18 20:43:58

Powerlineで基本的なカスタマイズをする tmuxのセグメント編

tmux-powerline
目次(クリックするとジャンプします)
  • 1:Powerline設定の予備知識
  • 2:設定の準備
  • 3:設定ファイルの構成
  • 4:tmuxのステータスラインに関しての設定
  • 4.1:<バッテリー残量>セグメントを表示する
  • 4.2:<カレンダー・時計>セグメントを表示する
  • 4.3:<天気>セグメントを表示する
  • 4.4:<VSCブランチ>セグメント
  • 4.5:環境セグメント群
  • 4.5.1:<カレントディレクトリ>セグメント
  • 4.5.2:<環境変数>セグメント
  • 4.5.3:<virtualenv>セグメント
  • 4.6:ネットワークセグメント群
  • 4.6.1:<ホストネーム>セグメントを表示する
  • 4.6.2:<エクスターナルIP>セグメントを表示する
  • 4.6.3:<インターナルIP>セグメントを表示する
  • 4.6.4:<ネットワークロード>セグメントを表示する
  • 4.7:システムプロパティセグメント群
  • 4.7.1:<CPUロード>セグメント
  • 4.7.2:<システムロード>セグメント
  • 4.7.3:<アップタイム>セグメント
  • 4.8:<メール>セグメントを表示する
  • 4.9:<ミュージックプレイヤー>セグメント
  • 4.10:tumx専用のセグメント <アタッチクライアント>セグメント
  • 5:セグメントに関しての注意点
  • 5.1:幅が足りない
  • 5.2:左側にセグメントを表示させる
  • 5.3:左側に出力されるtmuxのwindowやディレクトリの情報
  • 6:まとめ

Powerline設定の予備知識

Powerlineのステータスラインはセグメント(Segments)という単位で構成されます。セグメントは部品みたいな感覚で捉えてもらえばいいかもしれません。

例えばセグメントには「カレントディレクトリ」「現在のネットワーク」「時計」「バッテリーの残量」「天気」「ホスト名」などなどさまざまな種類が存在します。

Powerlineはbashやzshなどの各シェル、ターミナルマルチプレクサのtmux、vim等に対応していますが、これらに共通で使えるコモンセグメント(Common segments)とそれぞれの環境専用のセグメントがあります。

これらのセグメントの表示・非表示の設定、表示形式の設定を行うことでステータスラインの構成をカスタマイズできます。この構成をPowerlineではテーマ(theme)と呼びます。

また別途カラーを変更することもできます。カラーはセグメント等の色を変える設定でPowerlineではカラースキーム(colorscheme)と呼びます。カラースキームは自分でつくることも可能ですし、提供されるスキームをつかうこともできます。

テーマ設定・カラースキーム設定がPowerlineの基本的なカスタマイズになりマス。

設定の準備

Powerlineでは設定ファイル(config)が~/.local/lib/python2.7/site-packages/powerline/config_files/以下に入っていますが、これを~/.config/powerlineにコピーして使用することができるようです。

これは元のファイルを汚さないための仕組みのようです。コピーしなくても元のファイルで設定変更できますが、元に戻すのが面倒になるので最初にコピーの作業をやっておきましょう。

mkdir ~/.config/powerline
cp -r ~/.local/lib/python2.7/site-packages/powerline/config_files/* ~/.config/powerline/

こうしてコピーをして、コピー先ファイルに設定を加えると、コピー元ファイルの設定が上書き(ファイルとしてではなくあくまでも設定が)されます。

コピー元ファイルは常にデフォルトになり、コピー先ファイルの設定を変えたところだけが変更点として反映される形です。いろいろ設定を試しても、すぐに戻せるので便利ですね。

設定ファイルの構成

設定にはいくつかのファイルが関係してきます。

基本的にテーマはthemesディレクトリにさらに各環境ごとのディレクトリに分けて入っています。例えばtmuxのテーマファイルは~/.config/powerline/themes/tmux/に入っています。

カラースキームもcolorschemesディレクトリに各環境ディレクトリに分けて入っています。tmuxのカラースキームファイルは~/.config/powerline/colorschemes/tmux/に入っています。

以下のような流れでカスタマイズをすることになります。順不同でも構わないですし、変更しない部分はそのままにしておいて構わないので、それほど難しく無いかと思います。

  • テーマファイルを作る(もしくはdefultファイルを編集する)
  • カラースキームファイルを作る(もしくはdefultファイルを編集する)
  • powerline.jsonで表示される記号をカスタマイズする
  • config.jsonで使うテーマファイル・カラースキームファイルを指定する
  • 設定を反映させる(ファイルを保存すると直ぐに反映される)

tmuxのステータスラインに関しての設定

@MINOはシェルでtmuxを使用しています。tmux使っている方、多いのではないでしょうか?(どうもPowerlineはデフォルトでscreenには対応していない様子です)

defult.jsonに編集を加えてもいいのですが、せっかくですので新しいテーマファイルとして作ってみます。新しいテーマファイル名はベタにtmux-thema.jsonにしてみました。

vim ~/.config/powerline/themes/tmux/tmux-thema.json 

tmux-thema.jsonの全体像は以下です(例です)

{
    "segments": {
        "right": [
            {
                "function": "powerline.segments.common.bat.battery"
            },
            {
                "function": "powerline.segments.common.time.date",
                "name": "time",
                "args": {
                    "format": "%Y/%m/%d %H:%M:%S",
                    "istime": false 
                }
            },
            {
                "function": "powerline.segments.common.sys.uptime"
            },
            {
                "function": "powerline.segments.common.net.hostname"
            },
            {
                "function": "powerline.segments.common.sys.cpu_load_percent"
            },
            {
                "function": "powerline.segments.common.vcs.branch"
            }
        ],
        "left": [
        ]
    }
}

それぞれのセグメントでは細かい設定がありますが、公式ドキュメントを確認してみてください。

Powerline Common segments

<バッテリー残量>セグメントを表示する

powerline-tmux-right-bat

ノートパソコンで作業している時、電源が取れていれば問題ないのですが、たまに電源が無い場所でも作業することがあるかもしれません。

または電源つないでいたと思っていたら線が抜けていた…。なんてこともあるかもしれません。

<バッテリー残量>セグメントの表示は以下の記述を追加します。

"function":"powerline.segments.common.bat.battery"

ちなみにバッテリーが減ってくるとデフォルトの設定では色が赤くなってきます。
powerline-tmux-right-bat3
powerline-tmux-right-bat2

<カレンダー・時計>セグメントを表示する

powerline-tmux-right-time

@MINOは仮想端末を全画面表示にするので、時計が表示されるのはありがたいです。

<カレンダー・時計>セグメントの表示は以下の記述を追加します。

{
       "function": "powerline.segments.common.time.date"
},
{
         "function": "powerline.segments.common.time.date",
         "name": "time",
           "args": {
             "format": "%H:%M:%S",
              "istime": true
      }
}

2つ記述があるのは、年月日を表示するセグメントと時間を表示するセグメントを分けているからです。

powerline.segments.common.time.dateはデフォルトで年月日を表示しますが、フォーマットを変えることで ("format": "%H:%M:%S")時計を表示させることができます。

もちろん1つのセグメントですべての年月日時間を表示させることができます。

powerline-tmux-right-time2

powerline.segments.common.time.dateを1つにして、以下のようにフォーマットを書き換えます。

{
         "function": "powerline.segments.common.time.date",
         "name": "time",
           "args": {
             "format": "%Y/%m/%d %H:%M:%S"
      }
}

<天気>セグメントを表示する

powerline-tmux-right-wth

あまり必要無いような気もしますが、現在の天気を表示することができます。

tmux-thema.jsonに以下を加えます

"function":"powerline.segments.common.wthr.weather" 

< 天気>セグメントはhttp://freegeoip.net/ からIPによって地域を取得しているようです。なので普通では特に変更をしなくてもお住まいの地域(都道府県レベル)の天気が表示できるかと思います。

天気自体はヤホーから取得しているようです。

<VSCブランチ>セグメント

バージョン管理システムの現在のブランチを表示します。この機能はvimでも表示できるので、tmuxに表示させなくても良いかもしれません。

"function":"powerline.segments.common.vcs.branch" 

環境セグメント群

<カレントディレクトリ>セグメント

現在のディレクトリを表示します。tmuxの左tmuxからの出力で簡易的にカレントディレクトリが表示されますので、このセグメントを使わなくてもディレクトリを知ることはできます。

ただパスごと認識したいときは便利かもしれません。

"function":powerline.segments.common.env.cwd

<環境変数>セグメント

任意に設定された環境変数の数を表示します。あんまり使い道がわかりませんが…。

"function":powerline.segments.common.env.environment

<virtualenv>セグメント

現在のPythonやconda virtualenvの名前を返します。これ、なんのことです?

"function":powerline.segments.common.env.virtualenv

ネットワークセグメント群

ネットワークの状態を確認できる情報を表示してくれます。

ネットワークセグメントに分類される汎用セグメントは4つの種類があります。基本的に引数を変更しなくてもデフォルトで問題なく表示できるかと思います。

<ホストネーム>セグメントを表示する

powerline-tmux-right-host

ホスト名を表示するセグメントです。

"function":"powerline.segments.common.net.hostname"

<エクスターナルIP>セグメントを表示する

外に出る際のIPを表示するセグメントです。

"function":"powerline.segments.common.net.external_ip"

<インターナルIP>セグメントを表示する

ホストのIPを表示するセグメントです。

"function":"powerline.segments.common.net.internal_ip"    

<ネットワークロード>セグメントを表示する

powerline-tmux-right-net-load

ネットワークの上り下りの速度を表示するセグメントです。wifiで作業しているときに便利かもしれません。

"function":"powerline.segments.common.net.network_load"

システムプロパティセグメント群

システムの状態を表示してくれます。

システムプロパティセグメントに分類される汎用セグメントは3つの種類があります

<CPUロード>セグメント

powerline-tmux-right-cpu

CPUの平均使用率を表示するセグメントです。

"function":"powerline.segments.common.sys.cpu_load_percent"

<システムロード>セグメント

powerline-tmux-right-sysload

システムロードを表示するセグメントです。

"function":"powerline.segments.common.sys.system_load"

<アップタイム>セグメント

powerline-tmux-right-uptime

システムのアップタイムを表示するセグメントです。

"function":"powerline.segments.common.sys.uptime"

<メール>セグメントを表示する

IMAPが使用できますのでGmail等のメール到着をアラートできます。

チャットツールなどの台頭であまりメールでやり取りすることもなくなってきたので、正直@MINOは使っていません。

またパスワードを平書きすることになるようなので、ちょっと嫌な感じです。

一応メール通知の設定は以下のようになります。

{
                "function": "powerline.segments.common.mail.email_imap_alert",
                "args":{
                    "username": "your-mailadd@gmail.com",
                    "password": "password",
                    "server": "imap.gmail.com",
                    "port": 993,
                    "folder": "Inbox",
                    "max_msgs": 100
                }

            }

<ミュージックプレイヤー>セグメント

いくつかのMedia playersの状態表示をサポートしているようですが、@MINOはネットワークで音楽聞いているので、この機能を使っていません。

詳しくは公式ドキュメントを参照してください。

Powerline Media players

tumx専用のセグメント <アタッチクライアント>セグメント

現在アクティブなセッションに接続されているtmuxのクライアントの数を表示するセグメントです。

"function":"powerline.segments.tmux.attached_clients"

ただ数字が表示されるだけのシンプルなセグメントです。

セグメントに関しての注意点

幅が足りない

紹介したセグメントを全部表示させるには画面幅が足りない可能性があります。画面幅が足りない場合、付け足したセグメントは表示されなくなるようです。必要なものだけにしたほうが良いかと思います。

例えばVSCセグメントはvimなどのエディタ環境で表示させるのが良いかもしれません。

左側にセグメントを表示させる

今回はセグメントを右側(right)のみに表示させていますが、左側(left)に表示させることもできます

jsonのleftの中にセグメントの記述をするとそのセグメントは左側に表示されます。

以下の例では<アップタイム>セグメントをleftに置いています。

powerline-tmux-left-uptime

{
    "segments": {
        "right": [
            {
                "function": "powerline.segments.common.bat.battery"
            },
            {
                "function": "powerline.segments.common.time.date",
                "name": "time",
                "args": {
                    "format": "%Y/%m/%d %H:%M:%S",
                    "istime": false 
                }
            },
            {
                "function": "powerline.segments.common.wthr.weather"
            },
            {
                "function": "powerline.segments.common.net.hostname"
            },
            {
                "function": "powerline.segments.common.sys.cpu_load_percent"
            },
            {
                "function": "powerline.segments.common.vcs.branch"
            }
        ],
        "left": [
            {
                "function": "powerline.segments.common.sys.uptime"
            }
        ]
    }
}

ただ左側はtmuxではカレントディレクトリやwindowの情報が表示され幅も内容に左右される為、セグメントを置くと個人的には若干見難いような気がします。

左側に出力されるtmuxのwindowやディレクトリの情報

左側に出力されるtmuxのwindowやディレクトリの情報はあくまでtmux側での出力なので、表示形式を変えたい場合は.tmux.conf等で設定を変更する必要があります。

一応Powerline側で非表示にできるのですが、非表示にするとなんのためにtmuxをつかっているか本末転倒なので、非表示の方法は割愛します。

まとめ

  • Powerlineでは表示部品をセグメントを呼ぶ
  • セグメントは各環境の設定ファイルで表示非表示が設定できる
  • セグメントには様々な種類があり、多種多様な組み合わせが可能
  • 基本的にセグメントの指定だけで表示がされるが、細かい設定も可能なセグメントもある