本稿は自作エディタをつくる Advent Calendar 2016の12日目です、レポジトリはこちら
更新遅れて申し訳ないです。
テキストを挿入する
前回まででカーソル位置に対するデータは取得できていた雰囲気になっていたのですが、
いくつかバグを修正ました
- 0始まりと1始まりを勘違いしていた
- 変にキャッシュした計算結果が実際のデータと食い違っていた
が主な要因です。
前者は0始まりに揃えるといった対策を、後者は早すぎる最適化は・・・、といった感じの反省でしょうか。
その取得した位置に対して、以下の処理を順に実行していきます。
- 格納しきれない時は、挿入したい文字列の後ろに空の構造体を追加
- 格納しきれない時は、末尾の文字を後ろの構造体の先頭へ移す(再帰呼び出し)
- 挿入する文字サイズ分、配列を後ろにずらす
- 挿入する文字を配列にコピーする
以上で、カーソルの位置に文字を追加することができました。
わりと私生活と職場などの外部要因でここまで3日に分けて書きましたが(しかも更新遅れた)、
これを読んでエディタを作ろうと思う人がいたら、「ほんとはそこまで難しくないよ」と伝えたいです。
逆に、もっと考えておけばよかったと思うのは以下の3点です
カーソルの位置を文字数で保持しているが、半角と全角が入り乱れる文でカーソルを上下移動する際は、文字幅で保持していないと違和感がある
(例)「|」の文字をカーソルと思ってください
あいう|えお
0123456789abcdef
(カーソルを1つ下に移動)
理想(文字幅を考慮)
あいうえお
012345|6789abcdef
現状(文字数のみで計算)
あいうえお
012|3456789abcdef
いまは後者の実装になっています
普通のエディタ(atomとかvs codeとか)は文字幅を考慮してる・・・いや、してないですね。後者っぽい。
でも動かすと違和感があります。普段半角しか打たないからかな?
保持しているカーソルの位置と、実際のカーソル位置がズレたほうが使いやすそう
(例)「|」の文字をカーソルと思ってください
状態1
abc|de
(空行)
012345
(カーソルを1つ下に移動)
状態2
abcde
|(空行)
012345
(カーソルを1つ下に移動)
状態3
abcde
(空行)
012|345
状態2のときに、カーソル位置を先頭に戻してしまうと、状態3の時に文字0の位置にカーソルが動きます。
好みもあると思いますが、いっぱんにソースコードを書く時は上のようなカーソル移動をしてほしい気がします。今後の課題ですね。
文字を打つと、カーソル位置が1個後ろに行く
気にしたことがなかったですが、言われてみるとそうですね。
盲点でした。直さなきゃ・・・。
今日のまとめ
- 文字を打てるようになった
明日は文字を削除できるようにしたい(忙しくて更新できてなかったので、今日ですが・・)
毎日更新はなかなか大変です。定時退社とはいったい・・・