editor(3)

palegreen2011-09-02

メモ。

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。足りなければ別途考えることにした。

キーは普通、下記の順番で送られる。

  1. keydown
  2. keypress
  3. keyup

ただ、特定キーを狎下するとブラウザの挙動(フォーカス遷移(tab)やヒストリバック(delete))が発生してしまうので event.preventDefault()をリスナに入れて抑制。

が、抑制するとkeypressが発生しなくなる。
keydown, keyupとkeypressのときのキーコードが大きく違い、keypressの方が便利なので下記のようにしてみる。

  1. keydown
    • tab, deleteだったらその処理をしてから event.preventDefault()を呼ぶ
    • 上記以外ならこのイベントでは何もしない
  2. keypress
    • キー処理
  3. keyup
    • 何もしない

一応望んだ結果は得られたからこのままで行く。今のところIME的な機能がないので日本語入力はできない。あとで考える。