Skip to content

平成時代に憧れてたあのエディタを実装してみる

公開日:

東京都港区赤坂台クラブで開催された『新元号決定!平成最後のLT大会&PARTY』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

平成時代に憧れてた

あのエディタを実装してみる

Implement the text editor I admired in Heisei era

新元号決定!平成最後のLT大会&PARTY

2019年4月30日 #engineers_lt

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社 サービスプラットフォーム事業部
  • Emacs Lisper, PHPer
  • Emacs PHP Modeのメンテナ引き継ぎました
  • 好きなリスプはEmacs Lispです
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

時は遡る

Page 4

Laravel JP Conference直後

Page 5

Page 6

何か話さないと…

Page 7

Page 8

そうだ、テキストエディタ作ろう

|\ __ / ピコーン_ (m) _|ミ|/ `´ \('A`)ノヽノヽくく

Page 9

最初に考えてた内容

Page 10

秀丸上にEmacsを実現しよう

Page 11

先行実装

Page 12

Page 13

Page 14

昨晩手をつけてみた

Page 15

もう20年アップデートされてないし、現代風に書き直してみたら楽しいのでは???

Page 16

めちゃくちゃ手間がかかるし予想以上におもしろくない

Page 17

🤔

Page 18

はてさてどうしよう

Page 19

第2案発動

(本当に手をつけるつもりはなかった)

Page 20

平成時代に憧れてた

あのエディタを実装してみる

Implement the text editor I admired in Heisei era

新元号決定!平成最後のLT大会&PARTY

2019年4月30日 #engineers_lt

Page 21

平成時代に憧れてた

あのエディタを実装してみる

Implement a text editor I admired in Heisei era

新元号決定!平成最後のLT大会&PARTY

2019年4月30日 #engineers_lt

Page 22

そうだ、PHPでエディタ作ろう

|\ __ / ピコーン_ (m) _|ミ|/ `´ \('A`)ノヽノヽくく

Page 23

ということで今朝起きてから実装を始めました

Page 24

そもそもテキストエディタとは何か

Page 25

歴史的にはed, ex,MS-DOSのEDLINのようなラインエディタがあった

Page 26

ファイルを部分的にプリントして編集していくスタイル

Page 27

(今日「プリント」は画面上に文字を出力することを意味するが、1970年代前半ではテレタイプ端末で本当に印刷されてたらしい)

Page 28

話がそれた

Page 29

本質的な仕事

Page 30

(ファイルを読み込む)↓ユーザにごにょごにょさせる↓ファイルに書き戻す

Page 31

僕にもできそう

Page 32

どうやって「ごにょごにょ」させるかが問題

Page 33

方針

Page 34

PHPでやる

Page 35

端末でやる

Page 36

定石

||ncursesを使う

Page 37

やったことない

Page 38

簡単な方法

Page 39

画面を全部消す↓内容を全部出力↓無限に繰り返し…

Page 40

簡単じゃん

Page 41

PHPでやるにはどうすればいいか

Page 42

概ねいい感じにできる

Page 43

基本はWebアプリケーションフレームワークの実装と同じ

Page 44

HTTPじゃなくて端末の入力に対して処理していく

Page 45

Page 46

画面を消す

||

Hoa\Console\Console::clear()

Page 47

文字列を貯めるバッファの実装はとことん楽をする

Page 48

余談:エディタはテキストファイルの途中に文字を消したり追加したりするので、文字列(=文字の配列)と相性が悪い(途中挿入・削除コスト高)

Page 49

そんなわけで実装していきましょう

Page 50

Page 51

Page 52

Page 53

Page 54

Page 55

Page 56

実装しなかったけど面倒くさかったところ

Page 57

カーソル

Page 58

UTF-8は可変長

Page 59

カーソルを移動させるためには一文字づつ表示幅を調べないといけない

Page 60

「カーソル」位置を文字数で持つかバイト数で持つか

Page 61

文字列をUTF-32で持てば固定長になるのでは???

Page 62

🙃

だめです

Page 63

Unicodeの書記素クラスタ

Page 64

Page 65

この絵文字のバイト数

strlen('

');

Page 66

この絵文字のバイト数

strlen('

');// => 25

Page 67

この絵文字のUTF-8文字数

mb_strlen('

', 'UTF-8');

Page 68

この絵文字のUTF-8文字数

mb_strlen('

', 'UTF-8');// => 7

Page 69

Page 70

👨|

👩|

👦|

👦

Page 71

Zero Width Joiner

Page 72

Unicodeにおいて、1バイト1コードポイント人間に見える文字

Page 73

まったく一致しません

Page 74

エディタは完成してないです!!

Page 75

でも行きあたりばったりで設計しながら実装していくのは楽しい

Page 76

私からは異常です