本稿は自作エディタをつくる Advent Calendar 2016の14日目です、レポジトリはこちら
文字を削除する
文字挿入と同じような手順で、内部DSLであるenum CommandTypeにDELETEを追加し、Backspaceキー(0x7F、13日目より)を割り振ります。
文字挿入のときは末尾文字を次のリストに動かしたりしていましたが、削除は簡単ですね。
削除すると、1文字左に動かします。
カーソルが行頭にあるときは、改行文字を削除することで前後の行が繋がるため、特殊な対応が必要そうです。
ただ、追加時も改行を考慮できていないことに気づきました。うーむ・・・(後述)
末尾カーソル問題
削除を実装していて気づいたのですが、
行にn文字あるとき、カーソル位置はn+1箇所あるんですね。
「|」が配置可能なカーソル位置、行にabcの3文字あるとすると
普通のエディタは|a|b|c|の4箇所に配置できます。うーむ・・・(持ち越し)
行を結合する
行の先頭で削除キーを押したら、行結合処理を開始するようにします。
結合した後に、1文字削除(改行文字の分)して、カーソル位置を元の行末尾位置へ動かします。
最後に、行の文字数等を再計算します。
作ってて気づいたのですが、ファイル先頭・行頭でバックスペースを押すと大抵のエディタで無視されます。
改行する
Enter(0x0D)で改行するようにします。0x0Dをそのまま文字として追加しても改行されないようなので、"\n"に置き換えます。
行の後ろにある文字を順に次の行に足していく処理になります。
改行を加える構造体の文字をハードコピーしたあとに、リストを付け替えて処理します。
余談ですが、ファイル名を表示している部分(headerと呼ぶ)の末尾に改行をつけ忘れていて、文字幅が画面ちょうどなので気づいていませんでした。
その結果、一行目が空行だとheader末尾の改行っぽい扱いになって、表示できないバグになってしまい、わりとハマりました。
空白文字を打つ
spaceキーを打つと0x20が入力されるのですが、そのまま出力しても空白にならないため" "
に置き換えました。
空行カーソル問題
現状の実装だと、カーソルは背景色を用いて表示しているのですが、空行だと文字がないため背景色がつかない?問題を見つけました。
先に述べた末尾カーソル問題や、12日目の保持しているカーソルの位置どうするか問題と合わせて、現状実装のカーソルの保持方法には問題がありそうです。
今日のまとめ
- 文字を削除できるようになりました
- 改行を追加・削除できるようになりました
遅れがちだった更新ですが、頑張って追いつきました。
粗だらけですが、ファイル保存できればだいぶエディタっぽいのではないでしょうか?