ターミナルの新常識!プログラムの状態を可視化する「OSC 7501」プロトコルとは?
A Terminal Protocol for Program Status (OSC 7501)
A Terminal Protocol for Program Status (OSC 7501)
「OSC 7501」は、実行中のプログラムのステータスをターミナルで直接扱えるようにするための新しいプロトコルです。この仕組みが導入されることで、コマンドラインツールやバックグラウンドプロセスとの連携が飛躍的にスムーズになります。エンジニアの作業効率を劇的に改善する可能性を秘めたこの仕様について、今後の動向から目が離せません。
昔のIBM 3270端末のステータスラインを思い出すな(古き良きものってやつだね)。実際、これかなり良いアイデアだと思う。
自分は何十年もこの簡易版を使ってるよ。iTerm2を設定して、タブでアクティビティ、新しい出力、ビジュアルベルを表示するようにしてる。LinuxではWezTermで似たようなことをしてるな。パイプラインやシーケンスで使える「bell」コマンドを持っていて、興味のあるイベントが起きたらベルを鳴らすようにしてる。一番単純なのはプログラムが終了した時かな。あと、コマンドの実行シーケンスで使えるイケてるエイリアスもあって、前のコマンドの終了ステータスに応じてベルの音色を変えたりもしてるよ。
これすごくいいね!流行ってほしい。これまでターミナルを埋め込んだ製品をいくつか開発してきたけど、ターミナルがいつユーザーの入力を待っているのかを確実に検知するのって本当に苦労するんだ。
BSD系ならもう何年も前からこれに近い機能があるよ。ターミナルで ^T を押すと、待機中のアプリケーションにSIGINFOを送れるんだ。デフォルトだとプログラム名、ブロックされている理由、リアル/ユーザー/システム時間、メモリ使用量が表示される。例えばフォアグラウンドでemacsを起動して ^T を押すとこんな感じ。
% emacs
^T
load: 0.32 cmd: emacs-31.1 64938 [select] 2.89r 0.75u 0.06s 6% 122404k
1時間前にPiのドキュメントを読んでてこれを知ったところ。herdr piエクステンションの代わりとして使うのがすごく楽しみ。エクステンションの数は最小限にしたい派だからね。あと、CIトラッカーと組み合わせるのも最高そう(Forgejoで動くやつが必要だけど)。
こういうイノベーションを見ると、terminfoが廃れたり停滞したりしているのが悲しくなるよ。おかげで新手のターミナルエミュレータのほとんどが $TERM 変数で嘘をつくようになっていて、こういう機能の検知がスケーラブルじゃなかったり、不可能だったりするんだ。それに、terminfoがなぜ一つの巨大なパッケージになっているのかもずっと理解できない。manページみたいに、各ターミナルがそれぞれの情報をドロップインする形式じゃダメなのかね。
アイデアは好きだけど、すでにターミナルベルがあるよね。自分の環境だと、エージェントの処理が終わったり何かが必要な時にはベルを鳴らすようにしてる。設定次第で、ターミナルを見ていなければデスクトップ通知が飛ぶし、ターミナルにいればマルチプレクサからトースト通知が出る。ターミナルのペインにはタイトル欄に色付きの「ベル」アイコンが出て、アタッチすると消える仕組みだ。記事でターミナルベルに全く触れられていないのが不思議だな。このプロトコルを本気で普及させたいなら、そこは議論すべきだと思う。詳細な情報は便利そうだけど、ベルのシンプルさも捨てがたいからね。
これ面白そう。zellijとghosttyを使ってOSCの独自通知をいじり回してるところなんだ。自分用にカスタムキーを作って、各ホップに逆ルートをエンコードしておけば、通知を飛ばしたウィンドウやタブ、ペインへ簡単にジャンプしたり、特定のペインにパーミッションの承認/拒否といったカスタムアクションを送り込んだりできるように拡張するつもり。
ステータスラインをサポートしているターミナルでそれを設定するのと比べてどう違うの?