generated at
Popup Menuに独自のkeyboard shortcutを割り当てるUserScript
結構簡単に作れそう
12:48:38 簡単に作れた

2022-06-19 18:55:51 正規表現でもボタンを特定できるようにした
Ankiの穴埋めを作るPopupMenuのshortcutを設定する上で必要だった
2021-01-20 22:23:48 キーを削除する函数を追加した
使うかどうかはわからないが……
2021-01-19 11:08:05 もう少しまともに作り直した

動機
複数行に打ち消し線を引くPopup Menu - を割り当てたかった

実装したいこと
IMEがonのときでも使えるようにしたい

使い方
1. script.jsを自分のprojectにコピーする
ここでは Popup_Menuに独自のkeyboard_shortcutを割り当てるUserScript/script.js にコピーしたとする
2. 読み込む
js
import {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() で設定を削除する
設定例
js
import {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.js
class 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();

#2022-06-19 18:56:36
#2021-03-13 03:45:52
#2021-01-20 22:24:05
#2021-01-19 11:08:00