generated at
scrapbox-keyboard-emulation
多分scrapbox以外でも使える

動作確認済みの環境
Firefox
そのうちGoogleChromeでも確認しておきたい

keyCodeとの対応
本来 key だけを設定すればいいはずなのだが、非推奨の keyCode も渡さないとキー入力したことにならないみたい
script.js
const KEYCODE_MAP = { Backspace:8, Tab: 9, Enter: 13, Delete: 46, Escape: 27, ' ': 32, PageUp: 33, PageDown: 34, End: 35, Home: 36, ArrowLeft: 37, ArrowUp: 38, ArrowRight: 39, ArrowDown: 40, a: 65, b: 66, c: 67, d: 68, e: 69, f: 70, g: 71, h: 72, i: 73, j: 74, k: 75, l: 76, m: 77, n: 78, o: 79, p: 80, q: 81, r: 82, s: 83, t: 84, u: 85, v: 86, w: 87, x: 88, y: 89, z: 90, F5: 116, F12: 123, '[': 219, };

本体
これclassにする必要ないような
外からcursorを指定できたほうが良いのでは?
cursorもscrapbox-dom-accessorで注入すれば十分では?
script.js
export class KeyboardEmulator { constructor({cursor = null} = {}){ this.cursor = cursor ?? document.getElementById('text-input'); } press(key, {shiftKey = false, ctrlKey = false, altKey = false, noKey = false} = {}) { // 大文字キーの場合は小文字にする const lowerKey = key.length === 1 ? key.toLowerCase() : key; if (!KEYCODE_MAP[lowerKey]) { console.log(`No key code of ${key}`); } const keyObj = noKey ? {} : {key: key}; this.cursor.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: true, //...keyObj, keyCode: KEYCODE_MAP[lowerKey], shiftKey: shiftKey, ctrlKey: ctrlKey, altKey: altKey,})); } }

テストtakker
test.js
import {KeyboardEmulator} from '/api/code/takker/scrapbox-keyboard-emulation/script.js'; const emulator = new KeyboardEmulator(); window.emulator = emulator;
developper toolに↓を貼り付ける
コピペと切り取りはemulateできないようだ
noKey を入れて key がないかどうかで変わるのか確かめてみたが、 key のあるなしで変化はなかった
Emac key bindings (scrapbox)はemulateできた
おそらくclipboardを使っていないからできたのだと思われる
戻るのは行ける
js
const listener = document.body.addEventListener('keydown',e=>{ if (!e.key)return; if (e.ctrlKey) return; if ('hjkl[pdyu'.split('').includes(e.key)){ e.preventDefault(); e.stopPropagation(); switch(e.key){ case 'h': emulator.press('ArrowLeft'); return; case 'j': emulator.press('ArrowDown'); return; case 'k': emulator.press('ArrowUp'); return; case 'l': emulator.press('ArrowRight'); return; case 'p': emulator.press('y',{ctrlKey: true}); return; case 'y': emulator.press('c',{ctrlKey: true}); return; case 'd': emulator.press('k',{ctrlKey: true}); return; case 'u': emulator.press('z',{ctrlKey: true}); return; case '[': emulator.press('Escape'); return; } } }); document.body.addEventListener('keydown',e=>console.log(e));

#2020-12-18 19:05:03
#2020-12-16 14:51:43
#2020-11-26 06:53:46
#2020-11-21 16:58:39
#2020-11-17 16:28:19
#2020-11-17 14:53:31
#2020-11-12 10:58:05