diff --git a/app/src/config/keymap.ts b/app/src/config/keymap.ts index 79b1ae00d..6c4afe9b8 100644 --- a/app/src/config/keymap.ts +++ b/app/src/config/keymap.ts @@ -330,42 +330,29 @@ export const keymap = { keymapStr += "→"; } else if (event.key === "Tab") { keymapStr += "⇥"; - } else if (event.code === "BracketLeft") { - keymapStr += "["; - } else if (event.code === "BracketRight") { - keymapStr += "]"; } else if (event.key === "Backspace") { keymapStr += "⌫"; } else if (event.key === "Delete") { keymapStr += "⌦"; } else if (event.key === "Enter") { keymapStr += "↩"; - } else if (event.altKey) { - const codeKey = event.code.substr(event.code.length - 1, 1).toUpperCase(); - if (event.key === "Enter") { - keymapStr += "↩"; - } else if (event.key.startsWith("F") && event.key.length > 1) { - keymapStr += event.key; - } else if (event.code === "Period") { - keymapStr += "."; - } else if (codeKey !== "I" && codeKey !== "E" && codeKey !== "N" && codeKey !== "U") { - keymapStr += codeKey; - } else if (event.which === 229) { - setTimeout(() => { - it.value = ""; - }); + } else if (Constants.KEYCODE[event.keyCode]) { + if (event.shiftKey) { + keymapStr += Constants.KEYCODE[event.keyCode][1]; + } else { + keymapStr += Constants.KEYCODE[event.keyCode][0]; + } + } else if (event.code.startsWith("Digit") || event.code.startsWith("Key") || event.code.startsWith("Numpad")) { + const codeKey = event.code.substring(event.code.length - 1).toUpperCase(); + if (!event.altKey || + (event.altKey && !["I", "E", "N", "U"].includes(codeKey)) // Mac 编辑器中 alt+I 等字符无法清空 + ) { + keymapStr += event.code.substring(event.code.length - 1).toUpperCase(); } - } else if (event.key === "》") { - keymapStr += ">"; - } else if (event.key === "《") { - keymapStr += "<"; - } else if (event.key === "—") { - keymapStr += "-"; } else { keymapStr += event.key === "Unidentified" ? "" : (event.key.length > 1 ? event.key : event.key.toUpperCase()); } } - it.setAttribute("data-value", keymapStr); // Mac 中文下会直接输入 setTimeout(() => { diff --git a/app/src/constants.ts b/app/src/constants.ts index 25a7a4cd6..7b32dcb50 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -89,8 +89,21 @@ export abstract class Constants { fr_FR: "20200923234011-ieuun1p", }; + public static readonly KEYCODE: { [key: string]: string[] } = { + "186": [";", ":"], + "187": ["=", "+"], + "188": [",", "<"], + "189": ["-", "_"], + "190": [".", ">"], + "191": ["/", "?"], + "192": ["`", "~"], + "219": ["[", "{"], + "220": ["\\", "|"], + "221": ["]", "}"], + "222": ["'", '"'], + }; // "⌘", "⇧", "⌥", "⌃" - // "⌘A", "⌘X", "⌘C", "⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", "⌘Home", "⌘End", "⇧↩", "↩", "PageUp", "PageDown", "⌫", "⌦" 不可自定义 + // "⌘A", "⌘X", "⌘C", "⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", "⌘Home", "⌘End", "⇧↩", "↩", "PageUp", "PageDown", "⌫", "⌦", "⌃I", "⌃E", "⌃N", "⌃U" 不可自定义 public static readonly SIYUAN_KEYMAP: IKeymap = { general: { syncNow: {default: "F9", custom: "F9"}, diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts index c992e506d..3b821184d 100644 --- a/app/src/protyle/util/compatibility.ts +++ b/app/src/protyle/util/compatibility.ts @@ -86,12 +86,6 @@ export const updateHotkeyTip = (hotkey: string) => { "⌦": "Delete", "↩": "Enter", })); - const SHIFT_KEY_MAP = new Map(Object.entries({ - ";": ":", - "=": "+", - "-": "_", - ".": ">", - })); const keys = []; @@ -101,12 +95,8 @@ export const updateHotkeyTip = (hotkey: string) => { // 不能去最后一个,需匹配 F2 const lastKey = hotkey.replace(/⌘|⇧|⌥/g, ""); - if ("⌘⇧⌥".indexOf(lastKey) < 0) { - keys.push( - KEY_MAP.get(lastKey) - || (hotkey.indexOf("⇧") > -1 && SHIFT_KEY_MAP.get(lastKey)) - || lastKey - ); + if (lastKey) { + keys.push(KEY_MAP.get(lastKey) || lastKey); } return keys.join("+"); diff --git a/app/src/protyle/util/hotKey.ts b/app/src/protyle/util/hotKey.ts index 1ba352dd7..074f09875 100644 --- a/app/src/protyle/util/hotKey.ts +++ b/app/src/protyle/util/hotKey.ts @@ -1,6 +1,7 @@ import {isCtrl} from "./compatibility"; +import {Constants} from "../../constants"; -// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧Tab / [] +// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧[] / [] export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { if (hotKey === "") { return false; @@ -43,9 +44,13 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { }); } - // 是否匹配 ⇧Tab/↑ - if (hotKey.startsWith("⇧") && hotKeys.length === 2) { - if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey && event.key === hotKeys[1]) { + // 是否匹配 ⇧[] + if (hotKey.startsWith("⇧") && hotKeys.length === 2 && !event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey) { + if (event.code.startsWith("Digit") || event.code.startsWith("Numpad")) { + if (hotKeys[1] === event.code.slice(-1)) { + return true; + } + } else if (event.key === hotKeys[1]) { return true; } return false; @@ -56,20 +61,26 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { if (hotKeys.length === 4) { keyCode = hotKeys[3]; } - const isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) || - event.code === keyCode || - (event.code === "Period" && keyCode === ".") || - (event.code === "BracketLeft" && keyCode === "[") || (event.code === "BracketRight" && keyCode === "]"); + + let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) || + event.code === keyCode; + if (Constants.KEYCODE[event.keyCode]) { + if (event.shiftKey) { + isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode; + } else { + isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode; + } + } // 是否匹配 ⌥[] / ⌥⌘[] - if ((hotKeys.length === 3 ? isCtrl(event) : !isCtrl(event)) && event.altKey && !event.shiftKey && isMatchKey) { + if (isMatchKey && (hotKeys.length === 3 ? isCtrl(event) : !isCtrl(event)) && event.altKey && !event.shiftKey) { return true; } // ⌥⇧⌘[] - if (hotKey.startsWith("⌥⇧⌘") && hotKeys.length === 4 && event.altKey && event.shiftKey && isCtrl(event) && isMatchKey) { + if (isMatchKey && hotKey.startsWith("⌥⇧⌘") && hotKeys.length === 4 && event.altKey && event.shiftKey && isCtrl(event)) { return true; } // ⌥⇧[] - if (hotKey.startsWith("⌥⇧") && hotKeys.length === 3 && event.altKey && event.shiftKey && !isCtrl(event) && isMatchKey) { + if (isMatchKey && hotKey.startsWith("⌥⇧") && hotKeys.length === 3 && event.altKey && event.shiftKey && !isCtrl(event)) { return true; } return false; @@ -77,24 +88,18 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { // 是否匹配 ⇧⌘[] / ⌘[] const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧"); - let key = (hasShift ? hotKeys[2] : hotKeys[1]); - let keyCode; - // 更新 electron 后不需要判断 Mac,但 Mac 下中英文有区别,需使用 keyCode 辅助 - if (hasShift) { - if (key === "-") { - key = "_"; - keyCode = 189; - } else if (key === "=") { - key = "+"; - keyCode = 187; - } else if (key === ".") { - key = ">"; - keyCode = 190; + if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) { + const keyCode = (hasShift ? hotKeys[2] : hotKeys[1]); + let isMatchKey = 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; + } } - } - if (isCtrl(event) && (event.key.toLowerCase() === key.toLowerCase() || event.keyCode === keyCode) && !event.altKey - && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) { - return true; + return isMatchKey; } return false; };