takker99/ScrapBindings
ScrapboxにVim key notationで独自のkeyboard shortcutを導入するUserScript
https://github.com/takker99/ScrapBindings
目的
Non Vimmer向けshortcut manager
Vimmer向けにはtakker99/ScrapVimを開発するつもり
まあ、キー表記はVim key notationを使ってしまっているが
ScrapBindingsは/villagepump/プロジェクトホームを開くとエラーが出る2024/4/14→ページ遷移で#text-inputが消えるせいでショートカットが消えてしまうので、そのバグ修正も兼ねている
背景
takker99/ScrapVimを開発するのにだいぶコスト(時間、設計考察)がかかりそう
先にMousetrap相当の簡単なkeyboard shortcutを設定できるprogramを作っておきたい
interface
instanceを作成するときに、event listenerを登録するtargetを渡す
$ const mousetrap = new Mousetrap(document);
名前はMousetrapのパクリ
optionsは第2引数にわたす(これは変更なし)
Mousetrap.prototype.bindでキーを登録する
$ mousetrap.bind("<C-j>", command);
$ mousetrap.bind({ gg: goHome, G: goEnd });
同じキー配列に対して、一つしかコマンドを登録できない
2つ登録しようとすると、一番最後に登録しようとしたcommandで上書きされる
Mousetrap.prototype.unbindで解除
$ mousetrap.bind("gg", "G");
Mousetrap.prototype.resetで全解除
実装
key sequenceを貯めてstatus-barに表示してみるテストを参考にしつつ作る
2024-05-27 11:37:48 実装してたら、async generatorなしでできちゃった
vim key notaitonのparseはvim-like-key-notationを使う
久々にclass (JavaScript)で実装した
途中でkey bindingsを追加したい状況が生じたため、classに切り替えた
mutableというか、statefull(ステートフル)な昨日はclassを使うのがすっきりするのかもしれない
ほとんどのことが関数型プログラミングで事が済む分、classじゃないと実装し辛いもの、つまりclassで実装することに意義がある場面が明確になり、classの性質への理解が進むのかもしれない
実装したいこと
モード切り替え?
これができればscrapvimになる
IME入力にも対応する?
/yosider-scripts/takker99/ScrapBindings#666ec12fe5172d00006fdd50
key sequenceを貯めてstatus-barに表示してみるテストでは対応していたが、意図的に外した
理由は忘れたtakker.icon
やることを減らして早く完成させたかったか
VimはIMEから入力された文字に対応していないので、このscriptでも対応しなくて支障ないと思ったか
同じキー配列に複数のcommandを登録できるようにする?
前に登録したcommandの実行が拒否されたら、次のコマンドが実行される
たとえば、ポップアップがでているときにpを押すと貼り付け、コードブロック中で押すとコード実行を行うとか
2024-05-27
11:55:00 テストする
キーバインドはScrapBindings-settingsからいくつか取り出して試す
12:06:58 テスト開始
12:18:50 Event.isTrustedがfalseのものを外さないと無限ループになる?
12:21:08 直った。しかしkey sequenceが動いていない
12:32:42 状況がわからない。@takker99/debug-jsでconsole出力させる
12:48:20 キー判定をミスってただけだった
12:51:21 無視するキー入力が来たときはtimerを消さない
12:56:07 コマンドの実行に失敗しても、reset()を必ず実行する
13:07:58 <A-t>と<A-t><A-j>がある場合のテストも完了
<A-t><A-j>と入力されればそのコマンドを実行する
<A-t>入力後flushIntervalms間入力がなければ、<A-t>のコマンドを実行する
あー、<A-t>の次になにか入力されたとき、そのkey sequenceとmatchするcommandがなければ、<A-t>にマッチするcommandを即時実行するようにするか
待たずに連続して入力できる
14:17:01 実装完了
ちょっと手こずった
code:mod.ts
export * from "https://raw.githubusercontent.com/takker99/ScrapBindings/0.3.2/mod.ts";
#2024-07-07 11:08:01
#2024-06-25 09:11:30
#2024-06-07 00:28:46
#2024-06-06 16:13:19
#2024-05-26 14:09:15