tmuxステータスラインにXcodeバージョンを表示する

2018.02.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

複数のXcodeがインストールされている状態で、今どのバージョンがカレントなんだっけ?と迷うことがありませんか?
そこでtmuxステータスラインにXcodeバージョンを表示してみました。

Xcodeバージョンを取得するシェルスクリプトを用意する

tmuxステータスラインに表示する文字列はシェルスクリプトで組み立てます。以下がそのスクリプトです。

#!/bin/sh

v=`tmux showenv -g __tmux_xcode_description`
if [ $? -ne 0 ]; then
v=`xcodebuild -version 2> /dev/null |tr '\n' ' ' |sed -e 's/ Build version / (/' -e 's/ $/)/'`
[[ $? -eq 0 ]] && tmux setenv -g __tmux_xcode_description "$v"
else
v=`echo $v |sed -e 's/^.*=//'`
fi
echo $v

バージョン値はxcodebuildコマンドから取得します。 しかし、このコマンドの実行速度は速くありませんので、コマンド実行の都度待たされてしまい、ストレスが溜まります。 そこで、環境変数を使用してキャッシュします。それが __tmux_xcode_description です。

最初に tmux showenv でその環境変数を参照し、成功すればその値を使用します。 失敗すれば xcodebuild -version を実行してバージョン文字列を抽出しキャッシュする…という流れです。

このとき tmux showenvの出力は

__tmux_xcode_description=Xcode 9.2 (9C40b)

となりますので sed で右辺だけを取り出します(上記、スクリプト8行目)。

一方、 xcodebuild -version の出力は

Xcode 9.2
Build version 9C40b

となりますので、 trsed を使ってバージョン文字列を組み立てます(スクリプト5行目)。 組み立てたバージョン文字列はキャッシュしておきます。

このスクリプトを保存し実行権限を付与しておきます。
これをコマンドラインから実行すると以下のような出力が得られます:

$ ~/.config/tmux/xcode
Xcode 9.2 (9C40b)

tmuxステータスラインに出力する

tmuxのstatus-rightに上記スクリプトの出力を設定すればOKです。 先のスクリプトが ~/.config/tmux/xcode としてファイル化されているとすると、以下のような記述になります。

set -g status-right "#(~/.config/tmux/xcode) "

もちろん、status-left に設定しても構いません。

制限事項

残念ながら、xcode-select 実行後、即時にtmuxステータスラインは表示更新されません。 これはキャッシュしていることが原因です。 この場合は、手動で環境変数をクリアします:

$ tmux setenv -gu __tmux_xcode_description

速度が気にならない環境であればキャッシュをしないという選択もありでしょう。

最後に

tmuxステータスラインはスクリプトを用意すれば良いので応用範囲は広いと思います。 tmux-plugins にもステータスライン表示のプラグインがありますので、探してみてはいかがでしょうか?

環境

この記事中で使用したソフトウェアのバージョンは以下の通りです。

  • macOS 10.13.3 (17D47)
  • Xcode 9.2 (9C40b)
  • tmux 2.6
  • GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
  • iTerm2 Build 3.1.5