iTerm2 APIを使う ~画面分割&コマンド実行~
前回の記事の続きです.
前回の記事ではiTerm2 APIを使って背景色を簡単に変更できるコマンドを作りました.
今回はもう一つiTerm2 APIを使ったiTerm2向けのコマンドを作ったので紹介します.
先に完成品
以下リポジトリです.
作った背景
自分はいつも会社に来てパソコンを起動したらまず開くのはiTerm2です.エンジニアに限らず会社で働いていれば誰でもメモは取ると思うのですが,自分はvimを使ってYYYYMMDD.txtというファイルを毎日作ってメモを書いています.過去にメモ用のファイルを自動生成するコマンドを作った記事を書きましたが,実際にこれを使っています.
ターミナルでメモを書いているのですが,メモを書いている時に別のファイルを参照したい場合があるので,ターミナルは常に画面分割して使っています.
さらに,社内的な話になってしまいますが,人員が日々増えていっているためか,Wi-Fiの調子が悪くなることがたびたびあり,とても厄介なので常にpingを使ってネットワークの接続状態をターミナルで表示しています.あと,Macだと繋いでいるネットワークがダウンした時に別の登録済みのネットワークに自動接続しに行く設定があるので,現在接続しているネットワークの情報も常にターミナルで表示しています.
あと,これは自分の完全な好みなんですが,Macは最大画面表示をしているとステータスバーが全部隠れるようになっているので現在時刻をパッと確認したい時に少し面倒です(時計を持ち歩かないのが悪いのですが).ついでに少し自分は目が悪いので,ターミナルに大きい文字で時計を表示しています.
そして出来上がった,自分が毎日業務で開いているiTerm2のメインウィンドウの画面(の再現)がこちら.
画面左がメモを編集する領域
画面右上が過去のメモを開いたり簡単な作業をする領域
画面下中央がping監視
画面右中央が時計
画面右下が接続中のWi-FiのSSID
毎日iTerm2起動 -> 画面分割 -> コマンド実行をやっていたのですが,あまりにも面倒なので,コマンドひとつで全部実行できるようにしました😁
完成品紹介&解説
完成品のリポジトリにREADMEを書いたのと,前回の紹介記事とほぼ変わらないので,動作環境についてはほとんど変わりません.前回に追加して何種類か自作コマンドを増やしたので,その関係でいくつかのコマンドをインストールする必要はあると思います.
あと,GitHubにPushするために便宜上パスをリポジトリからの相対パスなども含まれていますが,実際にはパスの通った場所にこれらのコマンドを置いて,コード内の各種パスを適宜書き換える必要があると思います.
ターミナルの画面分割
これはiTerm2のAPIを使いました.iTerm2のドキュメントで参考になりそうな例が紹介されていたので,一部拝借しました.
ターミナル上でのコマンド実行
コマンドというよりも,ターミナルに文字を送るという表現の方が正しいかもしれませんが,以下のような方法で実現しています.
# 右下のペインに'myping\n’を入力する
await right_bottom_pane.async_send_text("myping\n")
各種自作コマンド解説
今回は三つのコマンドを作成しました.どれも自分が便利にしたいために作ったコマンドなので汎用性があるかは謎です笑
myping
単純にpingを飛ばしているだけのコマンドなのですが,ネットワークが不安定になったときに一眼でわかるように視覚情報を追加しました.出力結果に応じてテキストの色を変えているのですが,色を変更する方法は下記の記事が参考になりました.今回のコマンドは少なくとも同じバージョンのzshなら動くはずです.
ちなみにpingを飛ばしてネットワークの接続が不安定になったときにはこのように表示が変わるようになっています.
getssid
今繋がっているWi-FiのSSIDをwatchで継続的に監視するコマンドです.今繋がっているWi-FiのSSIDを取得するコマンドそのものは下記になります.
networksetup -getairportnetwork en0
なんでAirportなのかはよくわかりません.
myclock
これが現在時刻をデカデカと表示するためのコマンドになります.内部的には一秒ごとにdateコマンドを実行して,その結果をfigletコマンドにパイプで渡しているという簡単な作りです.
watch -n 1 -t 'date "+%H:%M" | figlet -c -w 50 -f roman'
コマンドの実態は上記のワンライナーです.watchコマンドの-tオプションで余計な標準出力を消して,時刻だけをパイプに渡せるようにしました.
本当は秒まで出力したかったのですが,figletの出力サイズと画面分割しているターミナルの領域の都合上表示が見切れてしまうので諦めました.
figletコマンドとは,受け取った文字列をいい感じのアスキーアートにして大きな文字として表示してくれるコマンドです.出力結果のフォントもいろいろ設定できます.romanというフォントが見やすくて分割した画面領域に収まりが良かったので採用しました.
ちなみに,この時計の文字も色を変えたくて試行錯誤してみましたが,どうしてもfiglet側でエスケープされずに文字列として認識されてしまうので諦めました.
おまけ: CPU使用率とかバッテリー使用率とか(時計とか)を確認できるようにする
自分自身上記のコマンドを作ってから知ったのですが,iTerm2はステータスバーの機能を使っていくつかのパフォーマンスを表示できるみたいです.自分はバッテリー使用率を常に見ていたいのでこれも上記のコマンドと一緒に併用しています.ステータスバーで時間もみれるのですが,せっかくなので自作コマンドもつかってデカデカと表示しています笑
ステータスバーの設定方法
iTerm2のPreferences > Profiles > Sessionの下の方にあるStatus bar enabledにチェックを入れます.
このままだとほとんど情報がないので,Configure Status Barで表示したい情報をカスタマイズします.気になったアイテムを下の領域にドラッグ&ドロップすると有効になります.Auto-Rainbowを設定すると,それぞれのアイテムをいい感じの色に変えてくれます🌈
デフォルトだとStatus barは画面上側に出ますが,個人的には上よりも下にあった方が見やすいので下に移動します.
Preferences > Appearance > General > Status bar locationをBottomにします.
ステータスバーを有効にするとこんな感じになります.
バッテリー表示はグラフも見れたり,充電中のマークが見れたりと結構便利です.
おわりに
今回はiTerm2 APIと自作コマンドを組み合わせてターミナルの各種画面を一発で開くコマンドを作りました.
iTerm2 APIをPythonで書くまでasync/awaitのことをほとんど知らなかったことは秘密😅