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

公開日:

東京都港区赤坂台クラブで開催された『新元号決定!平成最後の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

       |
   \  __  / ピコーン
   _ (m) _  

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

      |ミ|
    /  `´  \
     ('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

私からは

異常です