ScrapBindings
2024-05-27 14:23:43 deprecated
目的
Non Vimmer向けshortcut manager
このmanagerをベースにtritaskを実現してみたい
特徴
いつでもkey bindを追加・削除できる
使い方
jsimport {scrapBindings} from '/api/code/takker/ScrapBindings/script.js';
scrapBindings.install()
.then(() => scrapBindings.push(...config));
設定方法
config
を push()
に展開して渡す
jsconst config = [
{
key: 'ctrl+f',
command: (e) => {},
type: 'editor',
},
];
キーとコマンドを単純に結びつけるだけ
やってみても良さそう
文字列のみ渡せる。
同じコマンドを複数のキーに設定したい場合は、別々の配列要素にして渡す
command
にjavascriptの関数を渡す
引数は何か受け取れるようにしたほうがいいかな?
KeyboardEvent
を渡しておくか。
type
は省略可能
'browser'
を渡すと、cursorにfocusがあたってないときのキー設定になる
defaultは 'editor'
同じキーの設定を追加すると上書きになる
設定を削除するときは、 command: undefined
とする
2022-02-23
これにより、 script.js
をbundleなしにimportできなくなった
まあ仕方ない
2021-08-23
11:15:56 s/browse/browser
script.jsimport { textInput } from "../scrapbox-userscript-std/dom.ts";
import Mousetrap from "https://esm.sh/mousetrap@1.6.5";
class ScrapBindings {
constructor() {
this.binders ={
edit: {
mousetrap: new Mousetrap(textInput()),
config: [],
},
browser: {
mousetrap: new Mousetrap(),
config: [],
},
};
}
clear() {
for (const binder of this.binders) {
binder.config.forEach(({key}) => binder.mousetrap.unbind(key));
binder.config = [];
}
}
push(...config) {
// すべて上書きする
for (const {key, command, type: type_} of config) {
const binder = this.binders[type_ ?? 'edit'];
binder.mousetrap.unbind(key);
if (command) binder.mousetrap.bind(key, command);
}
// 設定情報の更新
for (const [type, binder] of Object.entries(this.binders)) {
const targetConfig = config.filter(tuple => (tuple.type ?? 'edit') === type);
const keys = targetConfig.map(({key}) => key);
binder.config = [...binder.config.filter(({key}) => !keys.includes(key)),
...targetConfig.filter(({command}) => command)];
}
}
show({key, type = 'edit'} = {}) {
// 空で呼び出されたら、すべての設定情報を表示する
if (!key) {
console.log(this.binders);
return;
}
console.log(this.binders[type].config.find(
pair => pair.key === key
) ?? "no command registerd.");
}
}
const scrapBindings = new ScrapBindings();
window.scrapBindings = scrapBindings;
export { scrapBindings };