diff --git a/app/src/config/keymap.ts b/app/src/config/keymap.ts index 196b99515..32bfa5885 100644 --- a/app/src/config/keymap.ts +++ b/app/src/config/keymap.ts @@ -425,36 +425,8 @@ export const keymap = { keymapStr += "⌘"; } if (event.key !== "Shift" && event.key !== "Alt" && event.key !== "Meta" && event.key !== "Control") { - if (event.key === "ArrowUp") { - keymapStr += "↑"; - } else if (event.key === "ArrowDown") { - keymapStr += "↓"; - } else if (event.key === "ArrowLeft") { - keymapStr += "←"; - } else if (event.key === "ArrowRight") { - keymapStr += "→"; - } else if (event.key === "Tab") { - keymapStr += "⇥"; - } else if (event.key === "Backspace") { - keymapStr += "⌫"; - } else if (event.key === "Delete") { - keymapStr += "⌦"; - } else if (event.key === "Enter") { - keymapStr += "↩"; - } else if (Constants.KEYCODE[event.keyCode]) { - if (event.shiftKey) { - keymapStr += Constants.KEYCODE[event.keyCode][1]; - } else { - keymapStr += Constants.KEYCODE[event.keyCode][0]; - } - } else if (["/", ".", "+", "-", "*"].includes(event.key)) { - keymapStr += event.key; - } else if (event.code.startsWith("Digit") || event.code.startsWith("Key") || event.code.startsWith("Numpad")) { - // 新版 Electron 可以支持 Alt["I", "E", "N", "U"],故移除原有判断 - keymapStr += event.code.substring(event.code.length - 1).toUpperCase(); - } else { - keymapStr += event.key === "Unidentified" ? "" : (event.key.length > 1 ? event.key : event.key.toUpperCase()); - } + keymapStr += event.key === "Unidentified" ? "" : + (Constants.KEYCODELIST[event.keyCode] || (event.key.length > 1 ? event.key : event.key.toUpperCase())); } it.setAttribute("data-value", keymapStr); // Mac 中文下会直接输入 diff --git a/app/src/constants.ts b/app/src/constants.ts index 5e45cc614..f24b1dc0a 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -101,19 +101,110 @@ export abstract class Constants { public static readonly QUICK_DECK_ID = "20230218211946-2kw8jgx"; - public static readonly KEYCODE: { [key: string]: string[] } = { - "186": [";", ":"], - "187": ["=", "+"], - "188": [",", "<"], - "189": ["-", "_"], - "190": [".", ">"], - "191": ["/", "?"], - "192": ["`", "~"], - "219": ["[", "{"], - "220": ["\\", "|"], - "221": ["]", "}"], - "222": ["'", '"'], - }; + public static readonly KEYCODELIST: { [key: number]: string } = { + 8: "⌫", + 9: "⇥", + 13: "↩", + 16: "⇧", + 17: "⌘", + 18: "⌥", + 19: "Pause", + 20: "CapsLock", + 27: "Escape", + 32: " ", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "←", + 38: "↑", + 39: "→", + 40: "↓", + 44: "PrintScreen", + 45: "Insert", + 46: "⌦", + 48: "0", + 49: "1", + 50: "2", + 51: "3", + 52: "4", + 53: "5", + 54: "6", + 55: "7", + 56: "8", + 57: "9", + 65: "A", + 66: "B", + 67: "C", + 68: "D", + 69: "E", + 70: "F", + 71: "G", + 72: "H", + 73: "I", + 74: "J", + 75: "K", + 76: "L", + 77: "M", + 78: "N", + 79: "O", + 80: "P", + 81: "Q", + 82: "R", + 83: "S", + 84: "T", + 85: "U", + 86: "V", + 87: "W", + 88: "X", + 89: "Y", + 90: "Z", + 91: "⌘", + 92: "⌘", + 93: "⌘", + 96: "0", + 97: "1", + 98: "2", + 99: "3", + 100: "4", + 101: "5", + 102: "6", + 103: "7", + 104: "8", + 105: "9", + 106: "*", + 107: "+", + 109: "-", + 110: ".", + 111: "/", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 144: "NumLock", + 145: "ScrollLock", + 182: "MyComputer", + 183: "MyCalculator", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'", + } // 冲突不使用 "⌘S/Q" // "⌘", "⇧", "⌥", "⌃" // "⌘A", "⌘X", "⌘C", "⌘V", "⌘-", "⌘=", "⌘0", "⇧⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌘⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", @@ -164,7 +255,7 @@ export abstract class Constants { expand: {default: "⌘↓", custom: "⌘↓"}, collapse: {default: "⌘↑", custom: "⌘↑"}, insertBottom: {default: "⌥⌘.", custom: "⌥⌘."}, - refTab: {default: "⇧⌘>", custom: "⇧⌘>"}, + refTab: {default: "⇧⌘.", custom: "⇧⌘."}, openBy: {default: "⌥,", custom: "⌥,"}, insertRight: {default: "⌥.", custom: "⌥."}, attr: {default: "⌥⌘A", custom: "⌥⌘A"}, @@ -243,7 +334,7 @@ export abstract class Constants { moveToLeft: {default: "⌥⌘L", custom: "⌥⌘L"}, moveToRight: {default: "⌥⌘R", custom: "⌥⌘R"}, "delete-row": {default: "⌘-", custom: "⌘-"}, - "delete-column": {default: "⇧⌘_", custom: "⇧⌘_"} + "delete-column": {default: "⇧⌘-", custom: "⇧⌘-"} } }, plugin: {}, diff --git a/app/src/protyle/util/hotKey.ts b/app/src/protyle/util/hotKey.ts index f03ca84f8..10d40c653 100644 --- a/app/src/protyle/util/hotKey.ts +++ b/app/src/protyle/util/hotKey.ts @@ -9,32 +9,16 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { // [] if (hotKey.indexOf("⇧") === -1 && hotKey.indexOf("⌘") === -1 && hotKey.indexOf("⌥") === -1 && hotKey.indexOf("⌃") === -1) { - if (hotKey === "⇥") { - hotKey = "Tab"; - } - if (!event.ctrlKey && !isCtrl(event) && !event.altKey && !event.shiftKey && event.code === hotKey) { + if (!event.ctrlKey && !isCtrl(event) && !event.altKey && !event.shiftKey && hotKey === Constants.KEYCODELIST[event.keyCode]) { return true; } return false; } const hotKeys = hotKey.split(""); - if (hotKey.endsWith("↑") || hotKey.endsWith("↓") || hotKey.endsWith("→") || hotKey.endsWith("←") || - hotKey.endsWith("↩") || hotKey.endsWith("⇥") || hotKey.indexOf("F") > -1) { + if (hotKey.indexOf("F") > -1) { hotKeys.forEach((item, index) => { - if (item === "↑") { - hotKeys[index] = "ArrowUp"; - } else if (item === "↓") { - hotKeys[index] = "ArrowDown"; - } else if (item === "←") { - hotKeys[index] = "ArrowLeft"; - } else if (item === "→") { - hotKeys[index] = "ArrowRight"; - } else if (item === "⇥") { - hotKeys[index] = "Tab"; - } else if (item === "↩") { - hotKeys[index] = "Enter"; - } else if (item === "F") { + if (item === "F") { // F1-F12 hotKeys[index] = "F" + hotKeys.splice(index + 1, 1); if (hotKeys[index + 1]) { @@ -46,14 +30,8 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { // 是否匹配 ⇧[] if (hotKey.startsWith("⇧") && hotKeys.length === 2) { - if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey) { - if (event.code.startsWith("Digit") || event.code.startsWith("Numpad")) { - if (hotKeys[1] === event.code.slice(-1) || event.key === hotKeys[1]) { - return true; - } - } else if (event.key === hotKeys[1]) { - return true; - } + if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey && hotKeys[1] === Constants.KEYCODELIST[event.keyCode]) { + return true; } return false; } @@ -64,16 +42,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { keyCode = hotKeys[3]; } - let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) || - event.code === keyCode || - event.key === keyCode; // 小键盘上的 /*-+. - if (Constants.KEYCODE[event.keyCode]) { - if (event.shiftKey) { - isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode; - } else { - isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode; - } - } + const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode]; // 是否匹配 ⌥[] / ⌥⌘[] if (isMatchKey && event.altKey && !event.shiftKey && (hotKeys.length === 3 ? (isCtrl(event) && hotKey.startsWith("⌥⌘")) : !isCtrl(event))) { @@ -99,16 +68,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { keyCode = hotKeys[3]; } - let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) || - event.code === keyCode || - event.key === keyCode; // 小键盘上的 /*-+. - if (Constants.KEYCODE[event.keyCode]) { - if (event.shiftKey) { - isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode; - } else { - isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode; - } - } + const isMatchKey = keyCode === Constants.KEYCODELIST[event.keyCode]; // 是否匹配 ⌃[] if (isMatchKey && hotKeys.length === 2 && event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { @@ -135,18 +95,7 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { // 是否匹配 ⇧⌘[] / ⌘[] const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧"); if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) { - const keyCode = (hasShift ? hotKeys[2] : hotKeys[1]); - let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) || - event.code === keyCode || event.key.toLowerCase() === keyCode.toLowerCase(); - // 更新 electron 后不需要判断 Mac,但 Mac 下中英文有区别,需使用 keyCode 辅助 - if (Constants.KEYCODE[event.keyCode]) { - if (event.shiftKey) { - isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode; - } else { - isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode; - } - } - return isMatchKey; + return (hasShift ? hotKeys[2] : hotKeys[1]) === Constants.KEYCODELIST[event.keyCode]; } return false; };