diff --git a/app/src/config/keymap.ts b/app/src/config/keymap.ts index 3fb50e7bb..6356089b6 100644 --- a/app/src/config/keymap.ts +++ b/app/src/config/keymap.ts @@ -311,7 +311,7 @@ export const keymap = { } if (["⌘", "⇧", "⌥", "⌃"].includes(keymapStr.substr(keymapStr.length - 1, 1)) || - ["⌘A", "⌘X", "⌘C", "⌘V", "⇧⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌘⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", "⌘Home", "⌘End", "⇧↩", "↩", "PageUp", "PageDown", "⌫", "⌦"].includes(keymapStr)) { + ["⌘A", "⌘X", "⌘C", "⌘V", "⌘-", "⌘=", "⌘0", "⇧⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌘⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", "⌘Home", "⌘End", "⇧↩", "↩", "PageUp", "PageDown", "⌫", "⌦"].includes(keymapStr)) { showMessage(tip + "] " + window.siyuan.languages.invalid); return; } diff --git a/app/src/constants.ts b/app/src/constants.ts index d539d67f7..907e43286 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -113,7 +113,7 @@ export abstract class Constants { }; // 冲突不使用 "⌘S/Q" // "⌘", "⇧", "⌥", "⌃" - // "⌘A", "⌘X", "⌘C", "⌘V", "⇧⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌘⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", + // "⌘A", "⌘X", "⌘C", "⌘V", "⌘-", "⌘=", "⌘0", "⇧⌘V", "⌘/", "⇧↑", "⇧↓", "⇧→", "⇧←", "⇧⇥", "⇧⌘⇥", "⌃⇥", "⌘⇥", "⌃⌘⇥", "⇧⌘→", "⇧⌘←", // "⌘Home", "⌘End", "⇧↩", "↩", "PageUp", "PageDown", "⌫", "⌦" 不可自定义 public static readonly SIYUAN_KEYMAP: IKeymap = { general: { diff --git a/app/src/protyle/util/hotKey.ts b/app/src/protyle/util/hotKey.ts index c00b9a079..f48c1b778 100644 --- a/app/src/protyle/util/hotKey.ts +++ b/app/src/protyle/util/hotKey.ts @@ -92,6 +92,46 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { return false; } + // 是否匹配 ⌃[] / ⌃⌥[] / ⌃⇧[]/ ⌃⌥⇧[] + if (hotKey.startsWith("⌃")) { + let keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1]; + if (hotKeys.length === 4) { + 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; + } + } + // 是否匹配 ⌃[] + if (isMatchKey && hotKeys.length === 2 && + event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { + return true; + } + // ⌃⇧[] + if (isMatchKey && hotKey.startsWith("⌃⇧") && hotKeys.length === 3 && + event.ctrlKey && !event.altKey && event.shiftKey && !event.metaKey) { + return true; + } + // ⌃⌥[] + if (isMatchKey && hotKey.startsWith("⌃⌥") && hotKeys.length === 3 && + event.ctrlKey && event.altKey && !event.shiftKey && !event.metaKey) { + return true; + } + // ⌃⌥⇧[] + if (isMatchKey && hotKey.startsWith("⌃⌥⇧") && hotKeys.length === 4 && + event.ctrlKey && event.altKey && event.shiftKey && !event.metaKey) { + return true; + } + return false; + } + // 是否匹配 ⇧⌘[] / ⌘[] const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧"); if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {