前回、
本格的に sequential-command.el をちゃんと実現してみようかなと思います
と言っていましたが、なんとか「ぽい」ものを実現できました。
Sequential Command
設定としては sequential-command.definitions にある A から Z までのスロットに実行したいコマンドのリストを定義しておくと、それらがそのまま sequential-command.executeA から sequential-command.executeZ のコマンドから呼び出せるようになります。
例えば、
{ "sequential-command.definitions": { "A": [ "cursorLineStart", "cursorTop", "sequential-command.seqReturn" ], [...] }
と設定している場合、sequential-command.executeA を呼び出すたびに「cursorLineStart(行頭)」「cursorTop(先頭行)」「sequential-command.seqReturn(元のカーソル位置」と順番にカーソルを移動します*1。
やはり1つのキーバインドで複数のコマンドが実行できるのは便利。
VSCode Extensionでは、キーバインド設定ができるコマンドは動的に作成できず、あらかじめExtensionのpackage.jsonに記載しておく必要があるみたいなので*2、上記のようなスロット形式にしました。まあ26個もあれば十分でしょう。
本家 sequential-command.el との違い
先ほど、「ぽい」ものと言ったのですが、残念ながらSequential Commandの挙動は本家の挙動を完全には模倣できていません。
仕組みとしては、ステートを持った上で sequential-command.execute* を実行するたびに登録されているコマンドを順番に実行するのですが、他のコマンドを実行した場合、その順番を保持しているステートをクリアする(上記の例だとまた「cursorLineStart(行頭)」から開始するようにする)必要があります。
ところが「コマンドを実行された」というイベントは現在のVSCode(1.96.4)には提供されていないようなのです。
なので、一定時間経過したらステートをクリアするようにしました( sequential-command.sequenceTimeout で設定できます)。
この課題、良い解決策があれば是非教えてください!
では
良いエディタライフを。