仕組みを学べるシンプルなターミナルエミュレータ「eduterm」

私たちがよく使用するターミナル。

毎日使っているはずなのに、あまりその仕組みを知らない方も多いはず。

先日、私も思い立ってxtermのソースコードを読んでみようしたら、C言語のifdefの嵐に圧倒され、途中で中断してしまいました。

xtermは様々なプラットフォームで動作することを期待されているので、ifdefでたくさんの場合分けをしており、思いのほか読みづらいのです。

もっとシンプルなターミナルはないものかと、インターネットをさまよっていたところ、ちょうどよいターミナルを発見しました。

それが、この「eduterm」です。

edutermのソースコードは、たった1つのソースコードeduterm.cに書かれており、448行しかありません。 しかも、たくさんのコメントを残してくれていて、とても親切なソースコードです。

コンパイルして実行すると、Xウィンドウシステムをサポートしており、ウィンドウが立ち上がります。 (ウィンドウの処理も、ターミナルとしての処理も、そしてコメントもたくさん入っているのに、この程度の行数で済んでいることに驚きです。)

f:id:toyamaguchi:20200131211132p:plain
edutermの起動

ターミナルは内部で擬似端末を用意し、シェルを起動して、入力を待ち受けるようになります。

「ls」とコマンドすれば、その返答が返ってきます。

f:id:toyamaguchi:20200131211154p:plain
lsコマンドの入力

ただし、「vi」とコマンドしようものなら、わけのわからないエスケープシーケンスがたくさん表示されてしまいます。

viはlsと違って、出力に複雑なことをしています。 viは画面上の適切な位置に、文字やカーソルを表示しなければいけないため、「VT100」というプロトコルを使っています。 そして、edutermはVT100のエスケープシーケンスをサポートしていないのです。

f:id:toyamaguchi:20200131211218p:plain
viコマンドの起動

正直、このままでは普段使いのターミナルになることはないでしょう。

しかし、ターミナルの基本的な動きを学習するには、最適なソースコードなのです。

edutermを紹介している作者のブログ記事がこちらにあるので、興味のある方は合わせて読んでおくとよいかもしれません。

「出来の悪い子ほどかわいい」とよく言いますが、このターミナルをベースにして少しずつ鍛え上げていき、VT100の機能を追加し、フォントを変えたり、色を変えたりして、自分たちのターミナルを作ってみるのも楽しいですね!