ScrapVim-lite-3/Modeの設計案 (旧)
from ScrapVim-lite-3/Mode
文字列からコマンドを解釈する
ScrapVim-lite-3/ParseStateにVim key notationを一つづつ渡して解析させる
ParseStateの初期状態は派生クラスで決める
初期状態を実体ではなく型で取得したいな
初期状態に戻るたびに作り直したい
それとも各ParseStateで初期状態を決めるか?
コマンド実行後にそれぞれのParseStateで初期状態に戻るよう指示すればいい
this.execute実行時に、new InitialParseState()を実行するようにしておけばいいか
解析したcommand情報を持っておく
型:normal modeをJavascript Objectで表現してみる#5fd3d0e91280f00000b9e82e
ParseStateは遷移する都度に破棄する
必要な機能
外部から与えられたVim key mapをParseStateに一つづつ渡す
ParseStateに渡すやつ
ParseStateを切り替える関数
this._changeState()
引数に、新しいParseStateと未処理のVim key mapを受け取る
引数が何もなかったら、初期状態のParseStateに切り替える
前ターンまでに解析したcommand情報
this._parsedCommand
これParseStateにもたせたほうがいいのでは?
常に一つのParseStateだけを持っているなら、Modeに持たせても問題なかった
複数のParseStateを持たせられるようにすると、それぞれのstateで異なる解析結果が出てくることになる
それなら、各ParseStateに解析情報をもたせたほうがいい
cons: データが肥大化する?遅くなる
それは動くようになったら考えよう
外部から与えられたVim key command
1文字ずつ渡す
command情報を書き換える関数
this._setCommand()
command情報を実行する関数
this._execute()
返り値で情報をもらって、Mode側で状態を書き換えたほうがいいかも
こういうやつScrapVim-lite-3/ParseResponseをParseStateの解析処理関数から返してもらう
↓旧仕様
code:ts
interface ParseResponse {
type: 'execute' | 'terminate' | 'parsing' | 'statechange';
command?: VimCommand;
newState?: ParseState;
restChar: string;
}
restCharいらないな
本来は、どのStateに遷移するかを判断するStateで使うつもりだった
https://gyazo.com/caf77d3922add082a12286f9403c7feb
CountOrMotionStateに数字が渡されたらCountStateに遷移する
その際、渡された数字をそのままCountStateにも渡す必要がある
しかし、ParseStateを複数持たせられるようにするなら必要ないな
現時点で使っているParseStateを格納する変数
ParseStateは複数持てるようにする | scrapVim-lite-3
派生クラスで実装するやつ
modeの名前を返す関数
this.getModeName()
defaultのParseStateを生成する関数
this.createDefaultParseState()
bodyにはreturn new ParseState()とか書いておけばいい
command実行後の初期化処理とかで使う
握りつぶすキーの条件
preventDefaultCallback
与えられたVim key mapのdefault動作を握りつぶすかどうかを決める
例えばInsertModeなら、<ESC>や<C-[>を握りつぶす
code:script.js
parse(vimKeyMap) {
}
コマンドリスト
const commands
派生クラスで指定する
ParseStateで定義する
cf. ScrapVim-lite-3#5fd536ff1280f00000312bc1