editor(3)
メモ。
CaretとLineとModeの関係がごちゃごちゃしたので整理
- Lineは一行を表現。長さ0の場合も当然ある
- Caretはキャレットを表現。
- Modeは挿入モードか命令モードかを表現
Lineで長さ0のとき、Caretはどのような値を取るべきか、CaretのレンジがModeによって異なるのをどうするかで悩んだ。
結局、
- Caretの位置情報は負の値をとらず、Line.Length以下の値に必ずする
- Modeが挿入モードのときは0 to line.Length, 命令モードのときは0 to (Line.Length - 1)とする
- Lineの行末に改行を表す文字、もしくはEOFを表す文字を追加し、Line.Lengthが0のときや挿入モードのときだけはここにCaret位置がくることを許す
とした。
なんかまぁ、どうにかなった。
キー入力
キー入力は、イベントリスナをaddEventListener()で登録するが、キーボードのショートカットを無効化するのにいろいろ試したりした。
無効化したいキーは主に tab, delete。足りなければ別途考えることにした。
キーは普通、下記の順番で送られる。
- keydown
- keypress
- keyup
ただ、特定キーを狎下するとブラウザの挙動(フォーカス遷移(tab)やヒストリバック(delete))が発生してしまうので event.preventDefault()をリスナに入れて抑制。
が、抑制するとkeypressが発生しなくなる。
keydown, keyupとkeypressのときのキーコードが大きく違い、keypressの方が便利なので下記のようにしてみる。
- keydown
- tab, deleteだったらその処理をしてから event.preventDefault()を呼ぶ
- 上記以外ならこのイベントでは何もしない
- keypress
- キー処理
- keyup
- 何もしない
一応望んだ結果は得られたからこのままで行く。今のところIME的な機能がないので日本語入力はできない。あとで考える。