generated at
ScrapVim-lite-3
またscratchから作り直す
あと2,3回scrap & build繰り返しそうtakker

設計をなんとかしたい
キー入力を解釈する部分
Vim comamndsと実際の命令とを結びつける部分
命令集
引数に規格を与える
DOMは引数からではなくscrapbox-dom-accessorを直接使う
modeごとにcommandを分けたほうが良いのかもしれない
Vimiumの実装を参考にする
Mode KeyHandlerMode NormalMode というふうに派生していた
Modeの下にStateを置く方法も考えていた
数字入力state
operater state
text objectの入力を受け付ける状態
いや、こっちの方が良いかも
delete({register, count,range}) などの関数を用意して置く
diw / da[ など、vim commandとして解決できる文字列が渡されたら、 delete などに適切な引数を渡して実行する
ひとかたまりのcommandをparseする部分と、引数で対処方法を変えられる関数群とで分離させる
で、それぞれのmodeに対してそれぞれこのペアを用意する
下手にstateの切り替えとかを考えない分シンプルかも。
コマンド周り
Mode
モードの管理
ここから派生して NormalMode / InsertMode / VisualMode を作る
commandはmodeに持たせてもいいか
具体的なcommand, vim key bindの解決などの関数をもたせる
モードの切り替えごとに関数とコマンド解析をすげ替えるかんじ
modeの切り替えは ModeChanger で行う
切り替え指示はイベント経由で行う
global関数として公開する
commandからmodeを切り替えたいときは、このglobal関数を使う
Parser
渡されたvim commandの文字列を解析する
1文字ずつ解析する
これちょっとややこしいか?
operatorとかrangeごとに文字集合を作っておいて
どの文字の次にどの文字が来るのかを決めておく必要がある
これもmodeごとにparserをまるごと交換する感じになるかな
やっぱなんかややこしくなってきたなあ。
一番簡単なのは、全てのコマンドの組み合わせ列挙してしまうことか?
いやいやそれも大変だろう
少なくとも繰り返しに関しては列挙不可能だ
いまparseしているcommandに関するデータを保存しておくことかかなあ?
{count: 0, command: delete, range:{count, command:moveLeft}} とか
実行するときに、 command({count,range}) と変数を組み立てて実行する
range は選択範囲を作る関数とその繰り返し数。返り値は選択範囲情報
range 以下は command に応じて変えて良いかも
例えば {count: 0, command: replace, char: 'a'} など
一旦Vimの主要commandを全部洗い出して、それぞれに対して↑の形式でcommandを表現できるか確かめてみると良さそう
keyboard
キー入力をVIm用の文字に変換する
Mode からEvent伝播を止めるかどうか決めるcallback関数を設定する
Normal mode
<C-v> <F5> など一部のキーを除いて横取りする
IME入力に関しては、compositionendのときに入力文字列を全て取得してsequenceに流す
1文字ずつ入力されたものとみなす
editorに流し込まれたtextは全部消す
Visual mode
Normal modeと同じ
Insert Mode
事前に設定したkey以外はそのまま流す

一旦最低限度のprototypeを作ってみるかな
機能はhjklだけにする
とはいえ、コマンドの追加は簡単だろうけど
実際のコマンド実行とコマンドの解釈を切り分ける設計にしているから、コマンドの中身はそこまで関係ない
必要なクラスを羅列する
register
コマンドにしか関係しないのでいらない
ParseState で文字列解析するときにいるかもしれないが
Mode
以下の派生クラスを作る
NormalMode
InsertMode
解析用クラス
解析用関数
コマンドと入力文字列との対応表を管理するクラス
KeyInput
ScrapVim
entry point
KeyInput ModeChanger を持つ
KeyInput で得た結果を ModeChanger に渡す
モード変更を行う
うまい具合に、モード更新関数をコマンドに渡して使わせたいな
イベントを使う
図解
event監視とそれをmodeに渡す操作はScrapVim-lite-3/ScrapVimで行う
Mode の中身
commandは Mode ではなく ParseState にもたせたほうがよさそう
commandとvim key mapが対応している
Mode はcommandとvim key mapとの対応を知る必要がない
vim key mapの解析は全て ParseState に任せている
commandの実行はするが、中に入っているcommandの種類にかかわらず同じ方法で実行できる
一方で ParseState は文字とcommandとの対応表が必須になる
特に、vim key mapの種類ごとに対応表を用意する必要がある
e.g. motion, text object, 数字, ...
対応表のデータ自体は別のファイルに書いておいても良いかも
全ての対応表を一つのファイルに書くのか、対応表ごとにファイルを分けるのかは、まあそのとき決めればいいだろう
コマンド追加がしやすい方でいい


まだ実装しないやつ
Settings
custom key bindや挙動の設定をするやつ
まだ後回し

#2020-12-18 02:02:58
#2020-12-16 14:50:34
#2020-12-13 05:17:50
#2020-12-12 02:22:23