Writing an editor in less than 1000 lines of code, just for fun

Salvatore Sanfilippo

1000行未満でエディタを書いてみた、ただ楽しみのために

警告:長くて、正直あまり役に立たないブログ記事だ。要約すると、遊びで、ncursesに依存せず、シンタックスハイライトと検索機能を備えた1000行未満のテキストエディタを書いた、という話だ。コードはここにある: http://github.com/antirez/kilo

スクリーンキャストはこちら: https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb

感傷的な人向けに、続きをどうぞ…

数週間前、NanoエディタがもはやGNUプロジェクトの一部ではなくなったというニュースがあった。最初の反応は、へえ、今でもあんな古いエディタを気にかける人がいるんだ、というものだった。しかもそれは、元をたどれば端末ベースの電子メールクライアントに付属していたエディタのクローンだ。もう一度言おう、「電子メールクライアント」だ。電子メールクライアントという概念自体が、もはや過去のものになっている。すべてが変わったのだ。それなのにHacker Newsでは、たとえばシステム管理の作業で、見知らぬシステムにたまたまnanoが入っていたおかげで助かった、といったコメントをいくつも読んだ。うちの息子が初めてCでプログラムを書いたのもNanoだった。事前の知識がなくてもファイルを編集できる、十分手軽な体験ではある。

そんなことをきっかけに、Nanoよりもずっと小さなテキストエディタを書いてみようと考え始めた。基本的には、ただ楽しみのためだ。私は小さなプログラムが好きで、尊敬している。

今どきエディタを書くなんて、どれほどダサく、無駄で、時間の浪費だろうか。僕らはキラキラしたすごいプロジェクト、とてもクールで、とても複雑で、価値のあるものを作るべきなのだろう。でも、はっきりした目的もなく何かを作るのは、ときに清々しいことでもある。そこには思い出もあった…

Commodore 16に内蔵されていたアセンブラや、その後子ども時代に使った数々のホームコンピュータやBASICインタプリタでの最初の体験を覚えている。エディタは、人間と機械をつなぐ根本的な接点だ。コンピュータが解釈できる何かを、人間が書き込めるようにしてくれる。点滅する四角いプロンプトは、多くの人の記憶から決して消えないだろう。

まあ、そんな綺麗事はさておき、当時の自分には時間がほとんどなかった。家族の予定と、友人との長いバーベキュー用に肉を準備する合間を縫って、2つの週末にまたがる数時間しか取れなかった。何か小細工をして、空き時間でエディタを書き上げられないだろうか。目標は、とても小さく、cursesを使わず、シンタックスハイライト付きで、とりあえず使えるエディタを書くことだった。それが条件だ。大したことではないように見えて、一からすべてを数時間で書くのは、やはり難しい。

でも……待てよ、実は以前にもエディタを書いたことがある。子ども向けのLuaベースのプログラミング環境であるLOAD81プロジェクトの一部だ。それを再利用すればいいのでは……そして、画面への描画にSDLを使う代わりに、VT100のエスケープシーケンスを直接端末に送るとしたらどうだろう? そのためのコードならlinenoiseにもある。あれもおもちゃのプロジェクトとして始まったが、最終的には他の多くの本格的なプロジェクトで使われるようになったものだ。なら、その二つを混ぜ合わせてみるか……

最初の週の土曜の朝は海に行った、最高だった。その後、エディンバラからカターニアへ兄が到着し、一日の終わりには庭で一緒にノートパソコンを広げ、日中30度もあった暑さからなんとか身を守りながら、エディタの最初の骨組みをハックし始めた。LOAD81のコードはかなりモジュール化されていたので、元のプロジェクトから切り離すのは簡単だった。数時間もすると、なんとなく編集できるようになり、もう寝る時間になっていた。翌日も、海に出かける前にまた作業した。15歳の息子は結局1時まで寝ている。思えば自分も15歳の夏はそうだった。だから彼が起きるのを待つ間、30分ごとのスプリントでコーディングし、残りの時間は愛する娘と遊んで過ごした。ようやく日曜の夜遅くに、残りの部分をなんとか修正しようとした。

そういえば、数年前まではプロジェクトに没頭するとなれば、文字通り何日もぶっ通しでハックしていたものだ。もう年を取ったが、それでもおもちゃのエディタを書いて、それを真剣な仕事だと考えられるくらいには、まだ若いのかもしれない :-)

とはいえ現実は厳しい。月曜日がやってきた。本業だ。おもちゃのプロジェクトにかまけている暇はない。週末に作ったものを公開する時間すらなかった……最低限の磨き上げと、ブログ投稿が必要だったからだ。

再び「Kilo」エディタに手を触れることができたのは、この月曜日を待たなければならなかった。Kiloという名前は、コードが1024行未満だからだ。行数を数えるユーティリティのclocにかけると、1024行に達するまでまだ約100行の余裕があると表示された。やはり本格的なエディタには「検索」機能が必要だろう。というわけで、コードに戻り、ついでに少し構造を整理してコメントも書き直してみた。ご存知の通り、二つのプロジェクトの断片を数時間で混ぜ合わせたコードは、品質が最高とは言い難いからだ。

さて、そろそろ公開する時だ。このクレイジーなプロジェクトも終わりだ。誰かがこれを出発点にして本物のエディタを書いてくれるかもしれないし、あるいは従来のREPL形式を超えた、新しい面白いCLIを作るために使われるかもしれない。

コードはこちら: http://github.com/antirez/kilo

HNのコメント: https://news.ycombinator.com/item?id=12065217

原文は Salvatore Sanfilippo により に公開されました。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。