diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index dc7d82d34..7db43663c 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -265,7 +265,7 @@ "importDataTip": "Import the exported zip archive, overwriting the workspace/data/ folder by path", "includeChildDoc": "Include child documents", "text": "Text", - "lastUsed": "Apariencia usada recientemente", + "lastUsed": "Recently used appearance", "removedNotebook": "Removed notebook", "querySyntax": "Query Syntax", "rollback": "Rollback", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index ff38493dd..d0e438689 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -265,7 +265,7 @@ "importDataTip": "Importar el archivo zip exportado, sobrescribiendo la carpeta workspace/data/ por la ruta", "includeChildDoc": "Incluir los documentos de los niños", "text": "Texto", - "lastUsed": "Fuentes utilizadas apariencia", + "lastUsed": "Apariencia usada recientemente", "removedNotebook": "Cuaderno de notas eliminado", "querySyntax": "Sintaxis de consulta", "rollback": "Rollback", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 0a1828a3f..12e1a672c 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -265,7 +265,7 @@ "importDataTip": "将导出的 zip 压缩包导入,按路径覆盖 工作空间/data/ 文件夹", "includeChildDoc": "包含子文档", "text": "文本", - "lastUsed": "Recently used appearance", + "lastUsed": "最近使用的外观", "removedNotebook": "已删除的笔记本", "querySyntax": "查询语法", "rollback": "回滚", diff --git a/app/src/boot/globalShortcut.ts b/app/src/boot/globalShortcut.ts index eec419167..176399ed3 100644 --- a/app/src/boot/globalShortcut.ts +++ b/app/src/boot/globalShortcut.ts @@ -802,10 +802,29 @@ export const globalShortcut = (app: App) => { } // 面板的操作 - if (!isTabWindow && panelTreeKeydown(event)) { + if (!isTabWindow && panelTreeKeydown(app, event)) { return; } + let matchCommand = false; + app.plugins.find(item => { + item.commands.find(command => { + if (command.callback && + !command.fileTreeCallback && !command.editorCallback&& !command.dockCallback + && matchHotKey(command.customHotkey, event)) { + matchCommand = true; + command.callback(); + return true; + } + }); + if (matchCommand) { + return true; + } + }); + if (matchCommand) { + return true; + } + let searchKey = ""; if (matchHotKey(window.siyuan.config.keymap.general.replace.custom, event)) { searchKey = window.siyuan.config.keymap.general.replace.custom; @@ -1112,6 +1131,24 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => { return false; } const files = dockFile.data.file as Files; + + let matchCommand = false; + app.plugins.find(item => { + item.commands.find(command => { + if (command.fileTreeCallback && matchHotKey(command.customHotkey, event)) { + matchCommand = true; + command.fileTreeCallback(files); + return true; + } + }); + if (matchCommand) { + return true; + } + }); + if (matchCommand) { + return true; + } + if (matchHotKey(window.siyuan.config.keymap.general.selectOpen1.custom, event)) { event.preventDefault(); const element = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus") || @@ -1402,7 +1439,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => { } }; -const panelTreeKeydown = (event: KeyboardEvent) => { +const panelTreeKeydown = (app: App, event: KeyboardEvent) => { // 面板折叠展开操作 const target = event.target as HTMLElement; if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || @@ -1451,6 +1488,23 @@ const panelTreeKeydown = (event: KeyboardEvent) => { activePanelElement.classList.contains("sy__graph")) { return false; } + + let matchCommand = false; + app.plugins.find(item => { + item.commands.find(command => { + if (command.dockCallback && matchHotKey(command.customHotkey, event)) { + matchCommand = true; + command.dockCallback(activePanelElement as HTMLElement); + return true; + } + }); + if (matchCommand) { + return true; + } + }); + if (matchCommand) { + return true; + } const model = (getInstanceById(activePanelElement.getAttribute("data-id"), window.siyuan.layout.layout) as Tab)?.model; if (!model) { return false; diff --git a/app/src/boot/onGetConfig.ts b/app/src/boot/onGetConfig.ts index c5910a5d7..475ff57e2 100644 --- a/app/src/boot/onGetConfig.ts +++ b/app/src/boot/onGetConfig.ts @@ -85,6 +85,38 @@ const hasKeymap = (keymap: Record, key1: "general" | "edito return match; }; +const mergePluginHotkey = (app: App) => { + if (!window.siyuan.config.keymap.plugin) { + window.siyuan.config.keymap.plugin = {}; + } + app.plugins.forEach(plugin => { + plugin.commands.forEach(command => { + if (!window.siyuan.config.keymap.plugin[plugin.name]) { + command.customHotkey = command.hotkey; + window.siyuan.config.keymap.plugin[plugin.name] = { + [command.langKey]: { + default: command.hotkey, + custom: command.hotkey, + } + }; + return + } + if (!window.siyuan.config.keymap.plugin[plugin.name][command.langKey]) { + command.customHotkey = command.hotkey; + window.siyuan.config.keymap.plugin[plugin.name][command.langKey] = { + default: command.hotkey, + custom: command.hotkey, + } + return; + } + if (window.siyuan.config.keymap.plugin[plugin.name][command.langKey]) { + command.customHotkey = window.siyuan.config.keymap.plugin[plugin.name][command.langKey].custom || command.hotkey; + window.siyuan.config.keymap.plugin[plugin.name][command.langKey]["default"] = command.hotkey + } + }) + }) +} + export const onGetConfig = (isStart: boolean, app: App) => { const matchKeymap1 = matchKeymap(Constants.SIYUAN_KEYMAP.general, "general"); const matchKeymap2 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.general, "editor", "general"); @@ -99,6 +131,7 @@ export const onGetConfig = (isStart: boolean, app: App) => { const hasKeymap4 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading"); const hasKeymap5 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list"); const hasKeymap6 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table"); + mergePluginHotkey(app); if (!window.siyuan.config.readonly && (!matchKeymap1 || !matchKeymap2 || !matchKeymap3 || !matchKeymap4 || !matchKeymap5 || !matchKeymap6 || !hasKeymap1 || !hasKeymap2 || !hasKeymap3 || !hasKeymap4 || !hasKeymap5 || !hasKeymap6)) { diff --git a/app/src/config/index.ts b/app/src/config/index.ts index 66b549f68..cc69438c9 100644 --- a/app/src/config/index.ts +++ b/app/src/config/index.ts @@ -48,7 +48,7 @@ export const genItemPanel = (type: string, containerElement: Element, app: App) appearance.bindEvent(); break; case "keymap": - containerElement.innerHTML = keymap.genHTML(); + containerElement.innerHTML = keymap.genHTML(app); keymap.element = containerElement; keymap.bindEvent(); break; diff --git a/app/src/config/keymap.ts b/app/src/config/keymap.ts index c917c2fee..d30b3890a 100644 --- a/app/src/config/keymap.ts +++ b/app/src/config/keymap.ts @@ -8,6 +8,7 @@ import {getCurrentWindow} from "@electron/remote"; import {ipcRenderer} from "electron"; /// #endif import {confirmDialog} from "../dialog/confirmDialog"; +import {App} from "../index"; export const keymap = { element: undefined as Element, @@ -25,13 +26,55 @@ export const keymap = { ${keyValue} - + `; } }); return html; }, - genHTML() { + genHTML(app: App) { + let pluginHtml = '' + app.plugins.forEach(item => { + let commandHTML = '' + item.commands.forEach(command => { + const keyValue = updateHotkeyTip(command.customHotkey); + commandHTML += ``; + }); + if (commandHTML) { + pluginHtml += `
+
+ + + + ${item.name} +
+
+ ${commandHTML} +
+
` + } + }) + if (pluginHtml) { + pluginHtml = `
+
+ + + + ${window.siyuan.languages.plugin} +
+ ${pluginHtml} +
` + } return `