diff --git a/src/plugins/hotkeyPlugin.ts b/src/plugins/hotkeyPlugin.ts index 8585c0628c..c187075ef7 100644 --- a/src/plugins/hotkeyPlugin.ts +++ b/src/plugins/hotkeyPlugin.ts @@ -278,10 +278,12 @@ const combinationToBindingKey = ( // MetaキーはCommandキーとして扱う // NOTE: hotkeys-jsにはWinキーが無く、Commandキーとして扱われている // NOTE: Metaキーは以前採用していたmousetrapがそうだった名残り + // NOTE: hotkeys-jsでは方向キーのarrowプレフィックスが不要 const bindingKey = combination .toLowerCase() .split(" ") .map((key) => (key === "meta" ? "command" : key)) + .map((key) => key.replace("arrow", "")) .join("+"); return bindingKey as BindingKey; }; @@ -310,15 +312,18 @@ export const eventToCombination = (event: KeyboardEvent): HotkeyCombination => { if (event.metaKey) { recordedCombination += "Meta "; } - if (event.key === " ") { - recordedCombination += "Space"; - } else { - if (["Control", "Shift", "Alt", "Meta"].includes(event.key)) { - recordedCombination = recordedCombination.slice(0, -1); - } else { - recordedCombination += - event.key.length > 1 ? event.key : event.key.toUpperCase(); - } + // event.codeからevent.key形式へと変換 + // TODO: 主要なキーも使えるようにする + const eventKey = event.code.replace(/Key|Digit|Numpad/, ""); + // 英字 数字 上下左右 Enter Space Backspace Delete Escape F1~ - /のみ認める + if ( + /^([A-Z]|\d|Arrow(Up|Down|Left|Right)|Enter|Space|Backspace|Delete|Escape|F\d+|-|\/)$/.test( + eventKey, + ) + ) { + recordedCombination += eventKey; } + // 修飾キーのみだった場合末尾がスペースになるので削除 + recordedCombination = recordedCombination.replace(/\s$/, ""); return HotkeyCombination(recordedCombination); };