ScrapVim-lite-3/Mode
ScrapVim-lite-3のモードを表すクラス
各モード固有の設定はconstructorから注入する
作成用関数を用意しておく
createInsertModeとか
code:script.js
export class Mode {
constructor({
name,
createDefaultParseState,
preventDefaultCallback,}) {
this.createDefaultParseState = createDefaultParseState;
this._preventDefaultCallback = preventDefaultCallback;
this._parseState = [];
this._modeName;
}
このクラスで実装するもの
modeの名前
get modeName()
握りつぶすキーかどうかを判断する関数
get preventDefaultCallback()
ScrapVim-lite-3/KeyInputで使用する
コマンドの解釈
this.exec()
ScrapVim-lite-3/command文字列を一つずつ受け取り、内部でthis._parseStateに渡す
this._parseStateの返り値によって処理を分ける
ScrapVim-lite-3/ParseResponse
{type: 'not found'}
対象のParseStateを削除する
{type: 'pending'}
何もしない
{type: 'ready to execute'}
このmessageを返してきたParseStateの個数で処理を変える
1個だけのとき
そいつを実行する
複数あったとき
this._parseState中で一番要素番号が若いものを実行する
複数matchしたという警告メッセージをconsoleに出すようにするといいかも
実行し終わったら、this._parseStateを空っぽにする
{type: 'change state'}
このmessageを返してきたParseStateを削除し、新しいParseStateを挿入する
同じ要素番号に挿入する
挿入するParseStateは返り値の中にある
複数入っている場合もある
this._parseStateが空っぽになったら、ParseStateの初期値を入れる
this.createDefaultParseState()を使う
ScrapVim-lite-3/ParseStateFunctionを用いることにした
{type: 'command', command}
commandを実行する
複数の関数がこの形式のobjectを返してきた場合は、this._parseState中で一番要素番号が若いものを実行する
実行したらthis._parseStateを空にする
{type: 'states', parseState}
type: 'states'の返り値のparseStateを全て結合して、this._parseStateに代入する
コマンドの実行
this._execCommand()
this.exec()で使う内部関数
ScrapVim-lite-3/VimCommandを受け取って実行するだけ
VimCommandの実行関数と、VimCommandの定義を一緒にしたほうがいい気がしてきた
でも実行する場所を限定させたいからなあ
止めておこう
ScrapVim-lite-3/ParseStateの追加・削除
this._clear()
全削除
this._replace(index,[...])
indexでしていた部分に[...]を挿入する
[...]が空だったら削除と同じ
this._reset()
全削除&defaultのParseStateを入れる
常にScrapVim-lite-3/ParseStateFunctionを総入れ替えする方式にした
実際のmodeを生成するのに必要な情報
これらをconstructorに注入する
modeの名前
name
defaultのParseStateを生成する関数
this.createDefaultParseState()
bodyにはreturn new ParseState()とか書いておけばいい
command実行後の初期化処理とかで使う
握りつぶすキーの条件を返す関数
preventDefaultCallback
与えられたVim key mapのdefault動作を握りつぶすかどうかを決める
例えばInsertModeなら、<ESC>や<C-[>を握りつぶす
ScrapVim-lite-3/Modeの設計案 (旧)
#2020-12-17 19:32:23
#2020-12-13 05:21:47