Page 1
平成時代に憧れてた
あのエディタを実装してみる
Implement the text editor I admired in Heisei era
新元号決定!平成最後のLT大会&PARTY
2019年4月30日 #engineers_lt
公開日:
by USAMI Kenta@tadsan
に東京都港区の赤坂台クラブで開催された『新元号決定!平成最後のLT大会&PARTY』でライトニングトーク(5分)として発表しました。
Implement the text editor I admired in Heisei era
新元号決定!平成最後のLT大会&PARTY
2019年4月30日 #engineers_lt
時は遡る
Laravel JP Conference直後
何か話さないと…
そうだ、テキストエディタ作ろう
|\ __ / ピコーン_ (m) _|ミ|/ `´ \('A`)ノヽノヽくく
最初に考えてた内容
秀丸上にEmacsを実現しよう
先行実装
昨晩手をつけてみた
もう20年アップデートされてないし、現代風に書き直してみたら楽しいのでは???
めちゃくちゃ手間がかかるし予想以上におもしろくない
🤔
はてさてどうしよう
(本当に手をつけるつもりはなかった)
Implement the text editor I admired in Heisei era
新元号決定!平成最後のLT大会&PARTY
2019年4月30日 #engineers_lt
Implement a text editor I admired in Heisei era
新元号決定!平成最後のLT大会&PARTY
2019年4月30日 #engineers_lt
そうだ、PHPでエディタ作ろう
|\ __ / ピコーン_ (m) _|ミ|/ `´ \('A`)ノヽノヽくく
ということで今朝起きてから実装を始めました
そもそもテキストエディタとは何か
歴史的にはed, ex,MS-DOSのEDLINのようなラインエディタがあった
ファイルを部分的にプリントして編集していくスタイル
(今日「プリント」は画面上に文字を出力することを意味するが、1970年代前半ではテレタイプ端末で本当に印刷されてたらしい)
話がそれた
本質的な仕事
(ファイルを読み込む)↓ユーザにごにょごにょさせる↓ファイルに書き戻す
僕にもできそう
どうやって「ごにょごにょ」させるかが問題
方針
PHPでやる
端末でやる
定石
||ncursesを使う
やったことない
簡単な方法
画面を全部消す↓内容を全部出力↓無限に繰り返し…
簡単じゃん
PHPでやるにはどうすればいいか
概ねいい感じにできる
基本はWebアプリケーションフレームワークの実装と同じ
HTTPじゃなくて端末の入力に対して処理していく
画面を消す
||
Hoa\Console\Console::clear()
文字列を貯めるバッファの実装はとことん楽をする
余談:エディタはテキストファイルの途中に文字を消したり追加したりするので、文字列(=文字の配列)と相性が悪い(途中挿入・削除コスト高)
そんなわけで実装していきましょう
実装しなかったけど面倒くさかったところ
カーソル
UTF-8は可変長
カーソルを移動させるためには一文字づつ表示幅を調べないといけない
「カーソル」位置を文字数で持つかバイト数で持つか
文字列をUTF-32で持てば固定長になるのでは???
だめです
Unicodeの書記素クラスタ
この絵文字のバイト数
strlen('
');
この絵文字のバイト数
strlen('
');// => 25
この絵文字のUTF-8文字数
mb_strlen('
', 'UTF-8');
この絵文字のUTF-8文字数
mb_strlen('
', 'UTF-8');// => 7
👨|
👩|
👦|
👦
Zero Width Joiner
Unicodeにおいて、1バイト1コードポイント人間に見える文字
まったく一致しません
エディタは完成してないです!!
でも行きあたりばったりで設計しながら実装していくのは楽しい
私からは異常です
