generated at
ScrapBindings
2024-05-27 14:23:43 deprecated
Mousetrapをやめて、独自に作り直したtakker99/ScrapBindingsを推奨する

hr

Scrapboxに独自のkeyboard shortcutを導入するUserScript

目的
Non Vimmer向けshortcut manager
Vimmer向けにはScrapVimを開発するつもり
一旦scrapbox-edit-emulationの部分だけを試してみたかった
このmanagerをベースにtritaskを実現してみたい

特徴
いつでもkey bindを追加・削除できる
developer toolのconsoleから操作できる

使い方
js
import {scrapBindings} from '/api/code/takker/ScrapBindings/script.js'; scrapBindings.install() .then(() => scrapBindings.push(...config));
設定方法
config push() に展開して渡す
config の例:ScrapBindings-settings
js
const config = [ { key: 'ctrl+f', command: (e) => {}, type: 'editor', }, ];
キーとコマンドを単純に結びつけるだけ
keyはVim key notation形式で指定する
Mousetrapを使えば、連続したキーも入力できるようになるか
やってみても良さそう
Mousetrap形式のkeyを key に渡す
文字列のみ渡せる。
同じコマンドを複数のキーに設定したい場合は、別々の配列要素にして渡す
command にjavascriptの関数を渡す
引数は何か受け取れるようにしたほうがいいかな?
KeyboardEvent を渡しておくか。
type は省略可能
'browser' を渡すと、cursorにfocusがあたってないときのキー設定になる
defaultは 'editor'
同じキーの設定を追加すると上書きになる
設定を削除するときは、 command: undefined とする

2022-02-23
13:04:33 ScrapboxでMousetrap.jsを読み込めなくなったので、予めbundleするようにした
これにより、 script.js をbundleなしにimportできなくなった
まあ仕方ない
ついでにscrapbox-userscript-stdを使うようにした
2021-08-23
11:15:56 s/browse/browser

script.js
import { 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 };

#2024-05-27 14:25:42
#2021-08-23 11:18:15
#2020-12-23 02:21:16