This commit is contained in:
Vanessa 2022-09-25 12:25:01 +08:00
parent a59014cf2d
commit deab11f9d0
4 changed files with 61 additions and 66 deletions

View file

@ -330,42 +330,29 @@ export const keymap = {
keymapStr += "→"; keymapStr += "→";
} else if (event.key === "Tab") { } else if (event.key === "Tab") {
keymapStr += "⇥"; keymapStr += "⇥";
} else if (event.code === "BracketLeft") {
keymapStr += "[";
} else if (event.code === "BracketRight") {
keymapStr += "]";
} else if (event.key === "Backspace") { } else if (event.key === "Backspace") {
keymapStr += "⌫"; keymapStr += "⌫";
} else if (event.key === "Delete") { } else if (event.key === "Delete") {
keymapStr += "⌦"; keymapStr += "⌦";
} else if (event.key === "Enter") { } else if (event.key === "Enter") {
keymapStr += "↩"; keymapStr += "↩";
} else if (event.altKey) { } else if (Constants.KEYCODE[event.keyCode]) {
const codeKey = event.code.substr(event.code.length - 1, 1).toUpperCase(); if (event.shiftKey) {
if (event.key === "Enter") { keymapStr += Constants.KEYCODE[event.keyCode][1];
keymapStr += "↩"; } else {
} else if (event.key.startsWith("F") && event.key.length > 1) { keymapStr += Constants.KEYCODE[event.keyCode][0];
keymapStr += event.key; }
} else if (event.code === "Period") { } else if (event.code.startsWith("Digit") || event.code.startsWith("Key") || event.code.startsWith("Numpad")) {
keymapStr += "."; const codeKey = event.code.substring(event.code.length - 1).toUpperCase();
} else if (codeKey !== "I" && codeKey !== "E" && codeKey !== "N" && codeKey !== "U") { if (!event.altKey ||
keymapStr += codeKey; (event.altKey && !["I", "E", "N", "U"].includes(codeKey)) // Mac 编辑器中 alt+I 等字符无法清空
} else if (event.which === 229) { ) {
setTimeout(() => { keymapStr += event.code.substring(event.code.length - 1).toUpperCase();
it.value = "";
});
} }
} else if (event.key === "》") {
keymapStr += ">";
} else if (event.key === "《") {
keymapStr += "<";
} else if (event.key === "—") {
keymapStr += "-";
} else { } else {
keymapStr += event.key === "Unidentified" ? "" : (event.key.length > 1 ? event.key : event.key.toUpperCase()); keymapStr += event.key === "Unidentified" ? "" : (event.key.length > 1 ? event.key : event.key.toUpperCase());
} }
} }
it.setAttribute("data-value", keymapStr); it.setAttribute("data-value", keymapStr);
// Mac 中文下会直接输入 // Mac 中文下会直接输入
setTimeout(() => { setTimeout(() => {

View file

@ -89,8 +89,21 @@ export abstract class Constants {
fr_FR: "20200923234011-ieuun1p", 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 = { public static readonly SIYUAN_KEYMAP: IKeymap = {
general: { general: {
syncNow: {default: "F9", custom: "F9"}, syncNow: {default: "F9", custom: "F9"},

View file

@ -86,12 +86,6 @@ export const updateHotkeyTip = (hotkey: string) => {
"⌦": "Delete", "⌦": "Delete",
"↩": "Enter", "↩": "Enter",
})); }));
const SHIFT_KEY_MAP = new Map(Object.entries({
";": ":",
"=": "+",
"-": "_",
".": ">",
}));
const keys = []; const keys = [];
@ -101,12 +95,8 @@ export const updateHotkeyTip = (hotkey: string) => {
// 不能去最后一个,需匹配 F2 // 不能去最后一个,需匹配 F2
const lastKey = hotkey.replace(/⌘|⇧|⌥/g, ""); const lastKey = hotkey.replace(/⌘|⇧|⌥/g, "");
if ("⌘⇧⌥".indexOf(lastKey) < 0) { if (lastKey) {
keys.push( keys.push(KEY_MAP.get(lastKey) || lastKey);
KEY_MAP.get(lastKey)
|| (hotkey.indexOf("⇧") > -1 && SHIFT_KEY_MAP.get(lastKey))
|| lastKey
);
} }
return keys.join("+"); return keys.join("+");

View file

@ -1,6 +1,7 @@
import {isCtrl} from "./compatibility"; import {isCtrl} from "./compatibility";
import {Constants} from "../../constants";
// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧Tab / [] // 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⌥⇧[] / ⌥⇧⌘[] / ⇧[] / []
export const matchHotKey = (hotKey: string, event: KeyboardEvent) => { export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
if (hotKey === "") { if (hotKey === "") {
return false; return false;
@ -43,9 +44,13 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
}); });
} }
// 是否匹配 ⇧Tab/↑ // 是否匹配 ⇧[]
if (hotKey.startsWith("⇧") && hotKeys.length === 2) { if (hotKey.startsWith("⇧") && hotKeys.length === 2 && !event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey) {
if (!event.ctrlKey && !isCtrl(event) && !event.altKey && event.shiftKey && event.key === hotKeys[1]) { 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 true;
} }
return false; return false;
@ -56,20 +61,26 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
if (hotKeys.length === 4) { if (hotKeys.length === 4) {
keyCode = hotKeys[3]; keyCode = hotKeys[3];
} }
const isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) ||
event.code === keyCode || let isMatchKey = (/^[0-9]$/.test(keyCode) ? (event.code === "Digit" + keyCode || event.code === "Numpad" + keyCode) : event.code === "Key" + keyCode) ||
(event.code === "Period" && keyCode === ".") || event.code === keyCode;
(event.code === "BracketLeft" && keyCode === "[") || (event.code === "BracketRight" && 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; 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; 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 true;
} }
return false; return false;
@ -77,24 +88,18 @@ export const matchHotKey = (hotKey: string, event: KeyboardEvent) => {
// 是否匹配 ⇧⌘[] / ⌘[] // 是否匹配 ⇧⌘[] / ⌘[]
const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧"); const hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧");
let key = (hasShift ? hotKeys[2] : hotKeys[1]); if (isCtrl(event) && !event.altKey && ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {
let keyCode; const keyCode = (hasShift ? hotKeys[2] : hotKeys[1]);
// 更新 electron 后不需要判断 Mac但 Mac 下中英文有区别,需使用 keyCode 辅助 let isMatchKey = event.key.toLowerCase() === keyCode.toLowerCase();
if (hasShift) { // 更新 electron 后不需要判断 Mac但 Mac 下中英文有区别,需使用 keyCode 辅助
if (key === "-") { if (Constants.KEYCODE[event.keyCode]) {
key = "_"; if (event.shiftKey) {
keyCode = 189; isMatchKey = Constants.KEYCODE[event.keyCode][1] === keyCode;
} else if (key === "=") { } else {
key = "+"; isMatchKey = Constants.KEYCODE[event.keyCode][0] === keyCode;
keyCode = 187; }
} else if (key === ".") {
key = ">";
keyCode = 190;
} }
} return isMatchKey;
if (isCtrl(event) && (event.key.toLowerCase() === key.toLowerCase() || event.keyCode === keyCode) && !event.altKey
&& ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {
return true;
} }
return false; return false;
}; };