2025/03/21 17:43 Show HN: A terminal emulator in pure PHP

ねえロボ子、ScreenっていうPHP製のターミナルエミュレータがあるの知ってる?

ターミナルエミュレータですか?PHPでですか?

そう!LaravelのSoloを強化するために作られたみたいだけど、PHPアプリでリッチテキストベースのUIを作るのに使えるらしいのじゃ。

へえ、面白そうですね。記事によると「ターミナルの機能をエミュレートし、ANSIエスケープコードを処理して、フォーマット、カーソル移動、その他のターミナル機能を制御」するんですね。

そうそう!ANSIエスケープシーケンスをサポートしてて、カーソルの位置とか、テキストのスタイルとか、画面の操作ができるんだって。まるで魔法みたいじゃろ?

確かに、ターミナルで動くアプリケーションを作るのが簡単になりそうですね。それに、「Unicode/マルチバイト文字(UTF-8、絵文字、全角文字)をサポート」しているのも嬉しいです。

ロボ子も絵文字好きなのじゃな。それにCJK文字みたいな全角文字の表示幅も正しく計算してくれるらしいぞ。

それはすごいですね!ところで、どうしてこのようなものが作られたんでしょうか?

記事によると、Solo for LaravelでTUI(テキストユーザーインターフェース)を作る時に、複数のプロセスを個別のパネルで同時に実行する際に、ANSIエスケープコードによる画面の乱れを防ぐためらしいのじゃ。

なるほど、仮想ターミナルバッファを作成して、ANSI操作を安全な環境内で実行するんですね。

そういうこと!インストールはComposerで`composer require soloterm/screen`でできるみたいじゃ。PHP 8.1以上とmbstring拡張機能が必要らしいから注意が必要じゃな。

基本的な使い方は、`use SoloTerm\Screen\Screen;`でScreenクラスをuseして、`$screen = new Screen(80, 24);`でインスタンスを作成するんですね。幅と高さを指定できるんですね。

`$screen->write("Text and ANSI codes");`でテキストを書き込んで、`echo $screen->output();`で出力する、と。

ANSI処理も色々できるみたいですね。カーソル移動やテキストスタイリング、画面クリア、スクロールなど。

カーソル位置の保存と復元もできるらしいぞ!`\e7`で保存して、`\e8`で復元じゃ。

256色とRGBカラーもサポートしているんですね。カスタム統合のためにターミナルクエリに応答するコールバック設定もできるなんて、すごいですね。

テストも充実してるみたいで、スクリーンショットベースのテストアプローチで、実際のターミナルの動作との正確な一致を検証してるらしいのじゃ。

`ENABLE_SCREENSHOT_TESTING`という環境変数でスクリーンショットを有効にできるんですね。

MITライセンスで、Aaron Francisさんが開発したみたいじゃな。今度、何か作ってみるのも面白そうじゃ。

そうですね。私も何かアイデアを考えてみます。ところで博士、このScreenを使って、ターミナルで動くAIチャットボットを作ったら面白いと思いませんか?

それ、すごく面白そう!でも、もしそのチャットボットが私に「博士、おやつはまだですか?」って聞いてきたら、どうしようかの?

その時は、私が代わりに「今、準備中です」と答えておきますね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。