Popup Menuに独自のkeyboard shortcutを割り当てるUserScript
結構簡単に作れそう
12:48:38 簡単に作れた
2022-06-19 18:55:51 正規表現でもボタンを特定できるようにした
2021-01-20 22:23:48 キーを削除する函数を追加した
使うかどうかはわからないが……
2021-01-19 11:08:05 もう少しまともに作り直した
動機
実装したいこと
IMEがonのときでも使えるようにしたい
使い方
ここでは Popup_Menuに独自のkeyboard_shortcutを割り当てるUserScript/script.js
にコピーしたとする
2. 読み込む
jsimport {popupBindings} from '../Popup_Menuに独自のkeyboard_shortcutを割り当てるUserScript/script.js';
popupBindings.start();
popupBindings.push(
{key: 'c', buttonName: 'Copy plain'},
);
key
に設定したいshortcut keyを、 buttonName
にshortcut keyを設定するbuttonの名前を入れる
`修飾キーには対応していない
popupBindings.push()
で設定を追加し、 popupBindings.pop()
で設定を削除する
設定例
jsimport {popupBindings} from '../Popup_Menuに独自のkeyboard_shortcutを割り当てるUserScript/script.js';
popupBindings.start();
popupBindings.push(
{key: '-', buttonName: '\uf0cc'}, // 複数行打ち消し線
{key: ']', buttonName: '\uf127'}, // リンクを外す
{key: 'c', buttonName: 'Copy plain'},
);
script.jsclass PopupBindings {
constructor() {
this._mappings = [];
this.started = false;
}
start() {
if(this.started) return;
document.addEventListener('keydown', e => {
const buttons = document.getElementsByClassName('popup-menu')
?.[0]?.getElementsByClassName('button')
if (!buttons) return; // そもそもpopup menuがなかったら何もしない
for (const {key, shiftKey, ctrlKey, altKey, buttonName} of this._mappings) {
if (e.key !== key
|| e.shiftKey !== shiftKey
|| e.ctrlKey !== ctrlKey
|| e.altKey !== altKey) continue;
const button = [...buttons].find(
button => buttonName instanceof RegExp ?
buttonName.test(button.textContent) :
button.textContent === buttonName
);
if (!button) continue;
e.preventDefault();
e.stopPropagation();
button.click();
return; // 一つ見つかれば、実行して終了する
}
});
this.started = true;
}
push(...mappings) {
for (const {key, shiftKey, ctrlKey, altKey, buttonName} of mappings) {
this._mappings.push({key,
shiftKey: shiftKey ?? false,
ctrlKey: ctrlKey ?? false,
altKey: altKey ?? false,
buttonName,
});
}
}
pop(...mappings) {
for (const {key, shiftKey, ctrlKey, altKey, buttonName} of mappings) {
const index = this._mappings.findIndex(mapping =>
mapping.key === key
&& mapping.shiftKey === (shiftKey ?? false)
&& mapping.ctrlKey === (ctrlKey ?? false)
&& mapping.altKey === (altKey ?? false)
&& mapping.buttonName === bottonName);
if (index === -1) continue;
delete this,_mapping[index];
}
}
}
export const popupBindings = new PopupBindings();