萌えハッカーニュースリーダー

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

出典: https://github.com/soloterm/screen
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

その時は、私が代わりに「今、準備中です」と答えておきますね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search