【iTerm2】ステータスバーのコンポーネントを自作してみた

こんにちは。データインテグレーション部改めデータアナリティクス事業本部の岩澤です。
(いまだに部名になれません...長い)

会社PCのMacで利用しているiTerm2が、先日3.3にアップデートされ、新機能としてステータスバーとpythonスクリプト用APIが追加されました。

このステータスバーは表示内容をカスタマイズ可能であり、デフォルトで以下を表示するコンポーネントが用意されています。

  • 現在のディレクトリ
  • gitのステータス
  • CPU使用率
  • バッテリー残量
  • etc...

さらに、同時実装されたpythonスクリプトAPIを利用すれば、コンポーネントを自作することもできるようになっています。

どんな感じかな~と気になったので、コンポーネントを自作してみました。

※tutorialを見ながら試行錯誤していますので、最適ではない可能性があります。その点はご了承ください。
※2019-08-08 11:50 見づらい画像を調整しました。

環境

OS:macOS Mojave 10.14.6
iTerm2:3.3.0

スクリプト環境の準備

最初にスクリプト環境の作成を行います。

  1. iTermのメニューより[Scripts]→[New Python Script]を選択します

  2. 「Full Environment」を選択します

  3. 「Long-Running Daemon」を選択します

  4. 「~/Library/Application Support/iTerm2/Scripts/AutoLaunch」ディレクトリを選択し、 適当な名前(WeatherDisplay)を付けて[Save]ボタンを押下します

※「AutoLaunch」ディレクトリが見つからない場合は左下の[New Folder]からディレクトリを作成できます。

pythonスクリプトの実装

前の手順で作成したスクリプト環境は以下にあります。

~/Library/ApplicationSupport/iTerm2/Scripts/AutoLaunch/

このスクリプト環境の中には

  • ライブラリを含んだpython実行環境 (iterm2envディレクトリ以下)
  • スクリプトのひな形 (WeatherDisplay/WeatherDisplay/WeatherDisplay.py)
  • 設定ファイル (setup.cfg)

が含まれています。

それでは早速pythonスクリプトの実装を行ってみます。
ひな形ファイルの内容を下記スクリプトで上書き保存します。

#!/usr/bin/env python3

from datetime import datetime
import requests
import iterm2

params = (("format", "4"),)

async def main(connection):
    # コンポーネントの準備
    component = iterm2.StatusBarComponent(
        short_description="東京の天気", # コンポーネントの↓に表示される短い説明
        detailed_description="Show the weather in Tokyo",
        knobs=[],
        exemplar="[Weather in Tokyo]",   # サンプルとしてUI上に表示する内容
        update_cadence=300,              # 更新周期(秒)。不要ならばNone
        identifier="jp.classmethod.example.weather.in.tokyo",  # 一意に識別するID
    )

    # 表示内容を返す関数
    @iterm2.StatusBarRPC
    async def coro(knobs):
        request = requests.get("http://wttr.in/Tokyo", params=params)
        outputtext = request.text.replace("\n", "")  # 末尾の改行と除去しないと表示されない
        return outputtext

    # 
    await component.async_register(connection, coro)

iterm2.run_forever(main)

足りないpythonライブラリを追加する

上書き保存したらiTerm自体を再起動します。 このまま再起動するとスクリプトが実行され...るのですが、エラーが出ています。

エラーの内容はスクリプトコンソールで確認することができます。
スクリプトコンソールを表示するには、メニューより[Scripts]→[Manage]→[Console]です。


スクリプト環境にrequestsライブラリが無いみたいですね...では追加します。

  1. [Scripts]→[Manage]→[Manage Dependencies...]を選択します

  2. [Script Dependency Editor]ダイアログにて、[Script:]でライブラリを追加したいスクリプトを選択し、[Add]ボタンを押下します

  3. [Add Dependency]ダイアログにて追加したいライブラリ(ここでは「requests」)を入力して[OK]ボタンを押下します

  4. 確認ダイアログが表示されるので[OK]ボタンを押下します

  5. インストールダイアログが表示されるので完了まで待ちます

    ライブラリを追加後、iTermを再起動します。
    スクリプトコンソールに何もエラーがなければ...実装成功です。

動作を確認する

それでは実装したコンポ―ネントを使ってみます。

  1. [iTerm2]→[Preferences]を選択します

  2. [Preferences]ダイアログが表示されるので、[Profiles]タブを選択します

  3. 左下で使用中のプロファイルを選択、右側で[Session]タブを選択します

  4. [Status bar enables]のチェックを入れ、[Configure Status Bar]ボタンを押下します

  5. [Status Bar Component Menu]ダイアログにて自作コンポーネントが表示されているので、下側にドラッグ&ドロップ、[OK]で閉じます

コンソールを確認すると...こんなかんじで天気が表示されます。

まとめ

というわけで今回はiTerm2のステータスバーコンポーネントの自作をしてみました。
他にも各種操作をhookしたり、ショートカットから呼べるコマンドを自作したりとかできるようなので、みなさんも色々作ってみてはどうでしょうか?

それではまた。
仕事と関係ないように見えますけど道具のメンテって重要ですから!必要ですから!!

参考文献

Python API Introduction — iTerm2 Python API 0.26 documentation

chubin/wttr.in: The right way to check the weather