Flex Terminal + Telnet
ちまちまと改良を続けているFlexターミナルエミュレータですが、オープンソースのFlex 3.0がリリースされた記念でちょっと宣伝します。
- インターフェイスをしっかり作ったので、ライブラリとして使いやすくなりました。
- マルチバイト文字の扱いを割とまじめに実装しました。UTF-8、EUC-JP、Shift_JISが使えます。実行中にエンコーディングを変えられます。
- screenでもvimでもエスケープシーケンスの塊でも、まともに動くようになりました。
- ウィンドウサイズを変えられるようになりました。
- ANSIカラーを変えられるようになりました。
デモ:
http://syuki.skr.jp/files/dhatena/20080228/FxTerm.flv
(はてなに貼り付けるとあまりに小さい…右クリック→拡大するといい感じです)
ソースコードはCodeRepos:/lang/actionscript/FxTermにあります。どんどんいじってください。
$ svn co http://svn.coderepos.org/share/lang/actionscript/FxTerm/trunk FxTerm $ cd FxTerm $ # ↓telnetクライアントをコンパイル $ mxmlc Example.mxml $ # ↓Flash Playerで実行してみる $ Flash\ Player Example.swf
既知のバグ:
- Windowsだと見ることはできるが操作することができない
- Linuxだとフォントが等幅になってくれず、表示が崩れる
- Mac/Windows/Linuxで、日本語フォントは等幅になってくれず、多少表示が崩れる
うーむ…。解決策求ム!
それから、あまり速くないです。単純にスクロールするくらいなら快適に使えるレベルなのですが、vimで画面を縦に分割してスクロールすると、大変重いです。
エスケープシーケンスはかなりまともに動くので、見せる分にはそこそこ使えます。
MXMLにも簡単に組み込めるようになっています。↓こんな感じで使えます。
<TelnetService id="telnet"/> <Terminal id="terminal" dataProvider="{telnet}"/>
TelnetServiceでなくても、(1)flash.events.IEventDispatcherを実装したクラスで、(2)readBytes(buffer:ByteArray):voidメソッドが実装してあり、(3)データが届いたときにProgressEvent.PROGRESSイベントを発行するクラスであれば、dataProvider=""に指定できます。ProgressEvent.PROGRESSイベントを発行すると自動的にreadBytesメソッドが呼ばれ、ターミナルが更新されます。
逆に、Terminalクラスはflash.utils.IDataOutputインターフェイスを実装しているので、外からターミナルにデータを書き込む方式で使うこともできます。データを書き込んでからrefresh()メソッドを呼び出すとターミナルが更新されます。