よんちゅBlog

― このブログは自分用のメモや日々の問題などを共有するためのものです ―

20121005185841 お知らせ:  2013/07/17 ブログデザインをリニューアルしました。

カッコイイtmuxを目指して!! - tmux-powerlineを改良したよ

この記事は既に内容がだいぶ古いです…

tmux-powerlineは2012年12月半ばあたりで大幅なバージョンアップが行われたため、この記事の設定方法は使用できません。
また、この記事で挙げていた旧tmux-powerlineの問題もほぼ解決されました。
Modularize files and functions by jfelchner · Pull Request #92 · erikw/tmux-powerline

最新のtmux-powerlineの設定方法は本家のREADEMEを見て頂くの一番速いかと思います。

また、最新のtmux-powerlineの私の設定はこちらにありますので、参考までにどうぞ。

tmux-powerlineとは、tmuxのステータスバーをvim-powerlineのようにかっこ良くしてくれるスクリプトです。

Macだとデフォルトでこんな感じになります。

f:id:yonchu:20121114145556p:plain

どうでしょう。なかなか良い感じではないでしょうか。
iTunesの曲名や天気など、そこまでやるか〜と思ってしまうようなものまであります。

カスタマイズも簡単!

カスタマイズも非常に簡単で、各項目の表示/非表示を切り替えるだけならスクリプト内の該当行をコメントアウトするだけですみます。
また、色の変更も簡単に行うことができます。

以下、status-left.sh より一部抜粋
ステータスラインに表示される各項目は基本的に以下の形式をとっています。

# status-left.sh

declare -A hostname    # 名前は被らなければなんでもOK
hostname+=(["script"]="${segments_path}/hostname.sh")    # 使用するスクリプト名
hostname+=(["foreground"]="colour0")    # フォアグランドカラーを指定 (256色)
hostname+=(["background"]="colour33")    # バックグラウンドカラーを指定 (256色)
hostname+=(["separator"]="${separator_right_bold}")
register_segment "hostname"    # ←この行をコメントアウトするだけで表示/非表示を切り替え可能

ただし、出力内容の微調整や標準では未対応の情報を表示させたい場合には、自分でスクリプトを書き換えるか、新しく作成する必要があります。
独自スクリプトを作成した場合は、そのスクリプトのパスを指定するか、そのスクリプトをPATHの通った所におきスクリプト名を指定することで利用できます。

だがしかし、不便な点も…

しかし、この tmux-powerline にはいくつか不便な点があります。

ざっと上げてみると、

  • bashのバージョンが4以上でなければならない (e.g. macのデフォルトのbashは3.x)
  • OSを自動で判別してくれない(config.shを環境に応じて書き換えなければならない)
  • 設定が外出しできない
  • tmux-powerlineのオン/オフが、切り替えはできるがオフの時の表示スタイルが指定できない。
  • ウィンドウサイズによって出す情報を可変できない。(ウィンドウが小さいと何も表示されなくなってしまう)

っとまあこんな感じで、実際に使用してみると意外と使いづらい点が多かったりします。
色々な環境で作業をしている方、さらに設定ファイル等を使いまわしている方にとっては結構致命的な点もありますよね。

というわけで、上記の問題をそれなりに解決してくれるラッパースクリプトを作りました。
その名も "tmux-powerline-wrapper"
そのままですね。

作成したものはgithubにて公開しています。

tmux-powerline-wrapper について

まずは上記問題の対応状況について

  • bashのバージョンが4以上でなければならない (e.g. macのデフォルトのbashは3.x)

  → 起動前に判定する方法を提供 ※1

  • OSを自動で判別してくれない(config.shを環境に応じて書き換えなければならない)

  → 自動で判別します

  • 設定が外出しできない

  → できます

  • tmux-powerlineのオン/オフ切り替えはできるけど、オフの時の表示スタイルを指定できない。

  → 環境変数によりオン/オフを切り替え ※1

  • ウィンドウサイズによって出す情報を可変できない。(ウィンドウが小さいと何も表示されなくなってしまう)

  → ウィンドウサイズの情報を提供、それを使って細かく微調整できます

※1 bashが未対応の場合や、tmux-powerlineをオフにした場合、ユーザ指定のデフォルトスタイルを適用することができます。
つまり、tmux-powerline導入前のスタイルが適用されるわけです。

インストール方法

まずはbashのバージョンを確認します。
(以下は Mac OS X 10.8.2 のデフォルトbashの場合です)

$ bash--version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.

上記のようにbashのバージョンが4未満だった場合は、バージョンが4以上のbashをインストールする必要があります。
Macの場合はhomebrewを使用すれば簡単にインストールすることができます。

$ brew install bash

Linuxなどの場合は、パッケージを用意するなりご自身でコンパイルするなりして用意して下さい。

続いて、githubより tmux-powerlinetmux-powerline-wrapper を持ってきます。

$ mkdir ~/.tmux
$ cd ~/.tmux

$ git clone git://github.com/yonchu/tmux-powerline.git
$ git clone git://github.com/yonchu/tmux-powerline-wrapper.git

配置する場所は基本的にどこでも良いですが、必ず tmux-powerline と tmux-powerline-wrapper を同一ディレクトリに置き、ディレクトリ名を変更しないようにして下さい。

続いて、tmuxの設定ファイル "~/.tmux.conf" に以下の設定を追加します。
(頭3行は既に設定している場合は不要です)

set-option -g status on
set -g status-interval 5    # ステータスバーの更新間隔[sec] (デフォルト:15sec)  適当に変更して下さい
set-option -g status-utf8 on

# Left status line
if "~/.tmux/tmux-powerline-wrapper/test-tmux-powerline.sh" \
    "set-option -g status-left-length 100"
if "~/.tmux/tmux-powerline-wrapper/test-tmux-powerline.sh" \
    "set-option -g status-left '#(~/.tmux/tmux-powerline-wrapper/status-left.sh)'"

# Right status line
if "~/.tmux/tmux-powerline-wrapper/test-tmux-powerline.sh" \
    "set-option -g status-right-length 100"
if "~/.tmux/tmux-powerline-wrapper/test-tmux-powerline.sh" \
    "set-option -g status-right '#(~/.tmux/tmux-powerline-wrapper/status-right.sh)'"

tmux-powerline-wrapper の配置場所が上記と異なる場合は適宜変更して下さい。
tmux-powerline を使用しない場合に適用されるユーザスタイルおよびステータスラインの設定は、上記設定より前に行なって下さい。

※ 設定を2行以上にわたって記述する場合、"¥" 記号にて行の継続を指示する必要がありますが、この機能は tmux 1.7 から使用可能なため、それ以前のtmuxを使用する場合には1行で記述するようにして下さい。

続いて、tmux-powerline 側でカレントディレクトリを取得できるようにするため、使用シェルに応じて以下の設定を追加します。

bashの場合は、~/.bashrc に以下のように記述します。

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

zshの場合は、~/.zshrc に以下のように記述します。

PROMPT="$PROMPT"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

※ 既にプロンプトに何らかの設定を行なっている場合は、その設定のあとに上記設定を追加するようにして下さい。

なお、上記設定はプロンプトの表示内容には影響しないので心配しないでください。
この設定がなくてもだいたいの機能は動きますが、一部gitなどのVCS情報の表示機能などが正常に動作しません。

最後に、tmuxを起動して以下のように表示されれば成功です。(Macの場合)
(※ ウィンドウ幅によって表示される情報が増減します)

f:id:yonchu:20121114163005p:plain

"tmux-powerline-wrapper" 内の "sample.tmux.conf" に ".tmux.conf" のサンプル設定があるので参考にして下さい。

tmux-powerlineのオン/オフ切り替え

tmux 起動前の場合は、以下のようにして tmux-powerline をオフにすることができます。

$ DISABLE_TMUX_POWERLINE=true
$ export DISABLE_TMUX_POWERLINE

tmux起動後にオン/オフを切り替える場合は以下のコマンドを使用します。

# オン→オフ
$ tmux setenv -ug DISABLE_TMUX_POWERLINE

# オフ→オン
$ tmux setenv -g DISABLE_TMUX_POWERLINE true

その後、設定ファイル(.tmux.conf)のリロードを行なって下さい。
設定ファイルのリロード方法が分からない方は、tmuxに慣れるためにまず最初に覚えるべきキーバインド - よんちゅBlog を参考にして下さい。

カスタマイズ

ステータスバーの表示スタイルや表示情報をカスタマイズしたい場合は、
まず、tmux-powerline-wrapper 内にある ".tmux-powerlinerc"".tmux-powerline-status-left.sh", ".tmux-powerline-status-right.sh" をホームディレクトリまたは "~/.tmux" へコピーして下さい。

配置するディレクトリはどちらでもOKです。
両方に置いた場合は、ホームディレクトリのファイルが優先されます。

$ cp ~/.tmux/tmux-powerline-wrapper/.tmux-powerlinerc ~/
$ cp ~/.tmux/tmux-powerline-wrapper/.tmux-powerline-status-left.sh ~/
$ cp ~/.tmux/tmux-powerline-wrapper/.tmux-powerline-status-right.sh ~/

まず、".tmux-powerlinerc" のカスタマイズです。

# Usage of patched font for symbols. true or false.
#USE_PATCHED_FONT=false

# Weather Yahoo
# Tokyo, JP - http://weather.yahoo.com/japan/tokyo-prefecture/tokyo-26235342/
TMUX_POWERLINE_WEATHER_YAHOO_LOCATION='26235342'
TMUX_POWERLINE_WEATHER_YAHOO_UNIT='c'
TMUX_POWERLINE_WEATHER_YAHOO_UPDATE_PERIOD=600

今のところ、表示する天気の地域, 単位(c/f/k), 更新間隔[sec]、パッチ当てフォントを使用するかどうかが変更可能です。

表示される天気はデフォルトでは東京になっています。
変更したい場合は、 Yahoo! Weather へアクセスし、好きな地域を選択後、表示されたページのURLの末尾にある数値を設定ファイルに記述して下さい。

続いて、ステータスラインの変更です。
コピーした ".tmux-powerline-status-left.sh" または ".tmux-powerline-status-right.sh" を変更して下さい。

変更方法は、基本的に本家 tmux-powerline のときと同様です。
加えて、以下のようにウィンドウサイズによって表示する情報を可変させることができます。
(書き方はシェルスクリプトと同様です)

# .tmux-powerline-status-left.sh より抜粋

register_segment "tmux_session_info"
if [ "$window_width" -ge 160 ]; then
    register_segment "hostname"
fi
if [ "$window_width" -ge 200 ]; then
    register_segment "username"
fi
if [ "$window_width" -ge 140 ]; then
    register_segment "ostype"
fi
register_segment "lan_ip"
register_segment "wan_ip"
if [ "$window_width" -ge 188 ]; then
    register_segment "vcs_branch"
fi
if [ "$window_width" -ge 230 ]; then
    register_segment "vcs_compare"
    register_segment "vcs_staged"
    register_segment "vcs_modified"
    register_segment "vcs_others"
fi

"$window_width" が現在のウィンドウサイズを示しているので、それに応じて表示させる情報をカスタマイズして下さい。

また、現在のウィンドウサイズは、tmux起動後にターミナルにて "tmux-powerline-wrapper/segments/window-width.sh" を実行することで確認することができます。
微調整したい場合にご使用下さい。

ステータスバー表示に利用できるスクリプトは、tmux-powerline/segments 内と tmux-powerline-wrapper/segments 内にあります。
お好みに応じてご使用ください。
ここにないものについては各自自作して頂ければと思います。

注意事項

フォントパッチについて

ステータスラインを良い感じに表示させるためにはvim-powerline 同様、使用するフォントにパッチを当てる必要があります。
自身で好きなフォントにパッチを当てたい場合は、vim-powerline に同梱されているfontpatcher を使用すると良いでしょう。
また、パッチ当て済みのフォントもいくつか配布されています。

パッチ当て済みフォントを使用しない場合は、".tmux-powerlinerc" にて以下のように設定すると良いでしょう。

# Usage of patched font for symbols. true or false.
USE_PATCHED_FONT=false
256色対応

tmuxを256色で表示させるためには、使用しているターミナルが256色表示に対応している必要があります。

以上です。

なんだかtmuxの本来の使い方から外れてきているような気がしますね。
ステータスバーのウィンドウ名が全然見えなかったりして…
ステータスバーの複数行表示ができたりすると、色々夢が広がるんですけどねぇ。