diff --git a/src/public/javascripts/dialogs/options/keyboard_shortcuts.js b/src/public/javascripts/dialogs/options/keyboard_shortcuts.js index 5266eb5cc..b00a374a1 100644 --- a/src/public/javascripts/dialogs/options/keyboard_shortcuts.js +++ b/src/public/javascripts/dialogs/options/keyboard_shortcuts.js @@ -4,6 +4,8 @@ import utils from "../../services/utils.js"; const TPL = `

Keyboard shortcuts

+

Multiple shortcuts for the same action can be separated by comma.

+
diff --git a/src/public/javascripts/services/entrypoints.js b/src/public/javascripts/services/entrypoints.js index a05a4aaa9..3e421e247 100644 --- a/src/public/javascripts/services/entrypoints.js +++ b/src/public/javascripts/services/entrypoints.js @@ -31,31 +31,31 @@ function registerEntrypoints() { jQuery.hotkeys.options.filterContentEditable = false; jQuery.hotkeys.options.filterTextInputs = false; - keyboardActionService.setActionHandler("AddLinkToText", () => import(ADD_LINK).then(d => d.showDialog())); + keyboardActionService.setGlobalActionHandler("AddLinkToText", () => import(ADD_LINK).then(d => d.showDialog())); const showJumpToNoteDialog = () => import(JUMP_TO_NOTE).then(d => d.showDialog()); $("#jump-to-note-dialog-button").on('click', showJumpToNoteDialog); - keyboardActionService.setActionHandler("JumpToNote", showJumpToNoteDialog); + keyboardActionService.setGlobalActionHandler("JumpToNote", showJumpToNoteDialog); const showRecentChanges = () => import(RECENT_CHANGES).then(d => d.showDialog()); $("#recent-changes-button").on('click', showRecentChanges); - keyboardActionService.setActionHandler("ShowRecentChanges", showRecentChanges); + keyboardActionService.setGlobalActionHandler("ShowRecentChanges", showRecentChanges); $("#enter-protected-session-button").on('click', protectedSessionService.enterProtectedSession); $("#leave-protected-session-button").on('click', protectedSessionService.leaveProtectedSession); $("#toggle-search-button").on('click', searchNotesService.toggleSearch); - keyboardActionService.setActionHandler('SearchNotes', searchNotesService.toggleSearch); + keyboardActionService.setGlobalActionHandler('SearchNotes', searchNotesService.toggleSearch); const $noteTabContainer = $("#note-tab-container"); const showAttributesDialog = () => import(ATTRIBUTES).then(d => d.showDialog()); $noteTabContainer.on("click", ".show-attributes-button", showAttributesDialog); - keyboardActionService.setActionHandler("ShowAttributes", showAttributesDialog); + keyboardActionService.setGlobalActionHandler("ShowAttributes", showAttributesDialog); const showNoteInfoDialog = () => import(NOTE_INFO).then(d => d.showDialog()); $noteTabContainer.on("click", ".show-note-info-button", showNoteInfoDialog); - keyboardActionService.setActionHandler("ShowNoteInfo", showNoteInfoDialog); + keyboardActionService.setGlobalActionHandler("ShowNoteInfo", showNoteInfoDialog); const showNoteRevisionsDialog = function() { if ($(this).hasClass("disabled")) { @@ -66,7 +66,7 @@ function registerEntrypoints() { }; $noteTabContainer.on("click", ".show-note-revisions-button", showNoteRevisionsDialog); - keyboardActionService.setActionHandler("ShowNoteRevisions", showNoteRevisionsDialog); + keyboardActionService.setGlobalActionHandler("ShowNoteRevisions", showNoteRevisionsDialog); const showNoteSourceDialog = function() { if ($(this).hasClass("disabled")) { @@ -77,33 +77,33 @@ function registerEntrypoints() { }; $noteTabContainer.on("click", ".show-source-button", showNoteSourceDialog); - keyboardActionService.setActionHandler("ShowNoteSource", showNoteSourceDialog); + keyboardActionService.setGlobalActionHandler("ShowNoteSource", showNoteSourceDialog); const showLinkMapDialog = () => import(LINK_MAP).then(d => d.showDialog()); $noteTabContainer.on("click", ".show-link-map-button", showLinkMapDialog); - keyboardActionService.setActionHandler("ShowLinkMap", showLinkMapDialog); + keyboardActionService.setGlobalActionHandler("ShowLinkMap", showLinkMapDialog); const showOptionsDialog = () => import(OPTIONS).then(d => d.showDialog()); $("#options-button").on('click', showOptionsDialog); - keyboardActionService.setActionHandler("ShowOptions", showOptionsDialog); + keyboardActionService.setGlobalActionHandler("ShowOptions", showOptionsDialog); const showHelpDialog = () => import(HELP).then(d => d.showDialog()); $("#show-help-button").on('click', showHelpDialog); - keyboardActionService.setActionHandler("ShowHelp", showHelpDialog); + keyboardActionService.setGlobalActionHandler("ShowHelp", showHelpDialog); const showSqlConsoleDialog = () => import(SQL_CONSOLE).then(d => d.showDialog()); $("#open-sql-console-button").on('click', showSqlConsoleDialog); - keyboardActionService.setActionHandler("ShowSQLConsole", showSqlConsoleDialog); + keyboardActionService.setGlobalActionHandler("ShowSQLConsole", showSqlConsoleDialog); $("#show-about-dialog-button").on('click', () => import(ABOUT).then(d => d.showDialog())); if (utils.isElectron()) { $("#history-navigation").show(); $("#history-back-button").on('click', window.history.back); - keyboardActionService.setActionHandler("BackInNoteHistory", window.history.back); + keyboardActionService.setGlobalActionHandler("BackInNoteHistory", window.history.back); $("#history-forward-button").on('click', window.history.forward); - keyboardActionService.setActionHandler("ForwardInNoteHistory", window.history.forward); + keyboardActionService.setGlobalActionHandler("ForwardInNoteHistory", window.history.forward); } // hide (toggle) everything except for the note content for zen mode @@ -113,9 +113,9 @@ function registerEntrypoints() { }; $("#toggle-zen-mode-button").on('click', toggleZenMode); - keyboardActionService.setActionHandler("ToggleZenMode", toggleZenMode); + keyboardActionService.setGlobalActionHandler("ToggleZenMode", toggleZenMode); - keyboardActionService.setActionHandler("InsertDateTimeToText", () => { + keyboardActionService.setGlobalActionHandler("InsertDateTimeToText", () => { const date = new Date(); const dateString = utils.formatDateTime(date); @@ -123,7 +123,7 @@ function registerEntrypoints() { }); $("#reload-frontend-button").on('click', utils.reloadApp); - keyboardActionService.setActionHandler("ReloadFrontendApp", utils.reloadApp); + keyboardActionService.setGlobalActionHandler("ReloadFrontendApp", utils.reloadApp); $("#open-dev-tools-button").toggle(utils.isElectron()); @@ -135,7 +135,7 @@ function registerEntrypoints() { }; $("#open-dev-tools-button").on('click', openDevTools); - keyboardActionService.setActionHandler("OpenDevTools", openDevTools); + keyboardActionService.setGlobalActionHandler("OpenDevTools", openDevTools); } let findInPage; @@ -157,7 +157,7 @@ function registerEntrypoints() { caseSelectedColor: 'var(--main-border-color)' }); - keyboardActionService.setActionHandler("FindInText", () => { + keyboardActionService.setGlobalActionHandler("FindInText", () => { if (!glob.activeDialog || !glob.activeDialog.is(":visible")) { findInPage.openFindWindow(); } @@ -177,7 +177,7 @@ function registerEntrypoints() { $("#toggle-fullscreen-button").on('click', toggleFullscreen); - keyboardActionService.setActionHandler("ToggleFullscreen", toggleFullscreen); + keyboardActionService.setGlobalActionHandler("ToggleFullscreen", toggleFullscreen); } else { // outside of electron this is handled by the browser @@ -185,8 +185,8 @@ function registerEntrypoints() { } if (utils.isElectron()) { - keyboardActionService.setActionHandler("ZoomOut", zoomService.decreaseZoomFactor); - keyboardActionService.setActionHandler("ZoomIn", zoomService.increaseZoomFactor); + keyboardActionService.setGlobalActionHandler("ZoomOut", zoomService.decreaseZoomFactor); + keyboardActionService.setGlobalActionHandler("ZoomIn", zoomService.increaseZoomFactor); } $(document).on('click', "a[data-action='note-revision']", async event => { @@ -201,7 +201,7 @@ function registerEntrypoints() { return false; }); - keyboardActionService.setActionHandler("CloneNotesTo", () => import(CLONE_TO).then(d => { + keyboardActionService.setGlobalActionHandler("CloneNotesTo", () => import(CLONE_TO).then(d => { const activeNode = treeService.getActiveNode(); const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode); @@ -211,7 +211,7 @@ function registerEntrypoints() { d.showDialog(noteIds); })); - keyboardActionService.setActionHandler("MoveNotesTo", () => import(MOVE_TO).then(d => { + keyboardActionService.setGlobalActionHandler("MoveNotesTo", () => import(MOVE_TO).then(d => { const activeNode = treeService.getActiveNode(); const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode); @@ -219,7 +219,7 @@ function registerEntrypoints() { d.showDialog(selectedOrActiveNodes); })); - keyboardActionService.setActionHandler("CreateNoteIntoDayNote", async () => { + keyboardActionService.setGlobalActionHandler("CreateNoteIntoDayNote", async () => { const todayNote = await dateNoteService.getTodayNote();console.log(todayNote); const notePath = await treeService.getSomeNotePath(todayNote); @@ -233,14 +233,14 @@ function registerEntrypoints() { }); }); - keyboardActionService.setActionHandler("EditBranchPrefix", async () => { + keyboardActionService.setGlobalActionHandler("EditBranchPrefix", async () => { const node = treeService.getActiveNode(); const editBranchPrefixDialog = await import("../dialogs/branch_prefix.js"); editBranchPrefixDialog.showDialog(node); }); - keyboardActionService.setActionHandler("ToggleNoteHoisting", async () => { + keyboardActionService.setGlobalActionHandler("ToggleNoteHoisting", async () => { const node = treeService.getActiveNode(); hoistedNoteService.getHoistedNoteId().then(async hoistedNoteId => { @@ -257,7 +257,7 @@ function registerEntrypoints() { }); }); - keyboardActionService.setActionHandler("SearchInSubtree", () => { + keyboardActionService.setGlobalActionHandler("SearchInSubtree", () => { const node = treeService.getActiveNode(); searchNotesService.searchInSubtree(node.data.noteId); diff --git a/src/public/javascripts/services/keyboard_actions.js b/src/public/javascripts/services/keyboard_actions.js index 886e7b094..1fec0ee98 100644 --- a/src/public/javascripts/services/keyboard_actions.js +++ b/src/public/javascripts/services/keyboard_actions.js @@ -33,7 +33,7 @@ const keyboardActionsLoaded = server.get('keyboard-actions').then(actions => { } }); -function setActionHandler(actionName, handler) { +function setGlobalActionHandler(actionName, handler) { keyboardActionsLoaded.then(() => { const action = keyboardActionRepo[actionName]; @@ -51,6 +51,24 @@ function setActionHandler(actionName, handler) { }); } +function setElementActionHandler($el, actionName, handler) { + keyboardActionsLoaded.then(() => { + const action = keyboardActionRepo[actionName]; + + if (!action) { + throw new Error(`Cannot find keyboard action '${actionName}'`); + } + + // not setting action.handler since this is not global + + for (const shortcut of action.effectiveShortcuts) { + if (shortcut) { + utils.bindElShortcut($el, shortcut, handler); + } + } + }); +} + async function triggerAction(actionName) { const action = getAction(actionName); @@ -105,7 +123,8 @@ function updateDisplayedShortcuts($container) { $(() => updateDisplayedShortcuts($(document))); export default { - setActionHandler, + setGlobalActionHandler, + setElementActionHandler, triggerAction, getAction, updateDisplayedShortcuts diff --git a/src/public/javascripts/services/note_detail.js b/src/public/javascripts/services/note_detail.js index 343836e7d..7a65b982d 100644 --- a/src/public/javascripts/services/note_detail.js +++ b/src/public/javascripts/services/note_detail.js @@ -420,17 +420,17 @@ $(tabRow.el).on('contextmenu', '.note-tab', e => { }); }); -keyboardActionService.setActionHandler('OpenNewTab', () => { +keyboardActionService.setGlobalActionHandler('OpenNewTab', () => { openEmptyTab(); }); -keyboardActionService.setActionHandler('CloseActiveTab', () => { +keyboardActionService.setGlobalActionHandler('CloseActiveTab', () => { if (tabRow.activeTabEl) { tabRow.removeTab(tabRow.activeTabEl); } }); -keyboardActionService.setActionHandler('ActivateNextTab', () => { +keyboardActionService.setGlobalActionHandler('ActivateNextTab', () => { const nextTab = tabRow.nextTabEl; if (nextTab) { @@ -438,7 +438,7 @@ keyboardActionService.setActionHandler('ActivateNextTab', () => { } }); -keyboardActionService.setActionHandler('ActivatePreviousTab', () => { +keyboardActionService.setGlobalActionHandler('ActivatePreviousTab', () => { const prevTab = tabRow.previousTabEl; if (prevTab) { diff --git a/src/public/javascripts/services/note_detail_code.js b/src/public/javascripts/services/note_detail_code.js index f00048054..bea8a4e0f 100644 --- a/src/public/javascripts/services/note_detail_code.js +++ b/src/public/javascripts/services/note_detail_code.js @@ -3,7 +3,7 @@ import bundleService from "./bundle.js"; import toastService from "./toast.js"; import server from "./server.js"; import noteDetailService from "./note_detail.js"; -import utils from "./utils.js"; +import keyboardActionService from "./keyboard_actions.js"; class NoteDetailCode { @@ -17,7 +17,7 @@ class NoteDetailCode { this.$editorEl = this.$component.find('.note-detail-code-editor'); this.$executeScriptButton = ctx.$tabContent.find(".execute-script-button"); - utils.bindElShortcut(ctx.$tabContent, "ctrl+return", () => this.executeCurrentNote()); + keyboardActionService.setElementActionHandler(ctx.$tabContent, 'RunActiveNote', () => this.executeCurrentNote()); this.$executeScriptButton.on('click', () => this.executeCurrentNote()); } diff --git a/src/public/javascripts/services/tree.js b/src/public/javascripts/services/tree.js index c446f6793..58fbf2569 100644 --- a/src/public/javascripts/services/tree.js +++ b/src/public/javascripts/services/tree.js @@ -796,7 +796,7 @@ ws.subscribeToOutsideSyncMessages(async syncData => { } }); -keyboardActionService.setActionHandler('CreateNoteAfter', async () => { +keyboardActionService.setGlobalActionHandler('CreateNoteAfter', async () => { const node = getActiveNode(); const parentNoteId = node.data.parentNoteId; const isProtected = await treeUtils.getParentProtectedStatus(node); @@ -868,9 +868,9 @@ async function reloadNotes(noteIds, activateNotePath = null) { window.glob.createNoteInto = createNoteInto; -keyboardActionService.setActionHandler('CreateNoteInto', createNoteInto); +keyboardActionService.setGlobalActionHandler('CreateNoteInto', createNoteInto); -keyboardActionService.setActionHandler('ScrollToActiveNote', scrollToActiveNote); +keyboardActionService.setGlobalActionHandler('ScrollToActiveNote', scrollToActiveNote); $(window).bind('hashchange', async function() { if (isNotePathInAddress()) { @@ -908,7 +908,7 @@ async function duplicateNote(noteId, parentNoteId) { } -keyboardActionService.setActionHandler('CollapseTree', () => collapseTree()); // don't use shortened form since collapseTree() accepts argument +keyboardActionService.setGlobalActionHandler('CollapseTree', () => collapseTree()); // don't use shortened form since collapseTree() accepts argument $collapseTreeButton.on('click', () => collapseTree()); $createTopLevelNoteButton.on('click', createNewTopLevelNote); diff --git a/src/public/javascripts/services/utils.js b/src/public/javascripts/services/utils.js index f5f3aafbd..e52e27918 100644 --- a/src/public/javascripts/services/utils.js +++ b/src/public/javascripts/services/utils.js @@ -139,6 +139,7 @@ function bindElShortcut($el, keyboardShortcut, handler) { if (isDesktop()) { keyboardShortcut = keyboardShortcut .toLowerCase() + .replace("enter", "return") .replace("ctrl+alt", "alt+ctrl") .replace("meta+alt", "alt+meta"); // alt needs to be first diff --git a/src/services/keyboard_actions.js b/src/services/keyboard_actions.js index 8de4f1d13..77c62d41f 100644 --- a/src/services/keyboard_actions.js +++ b/src/services/keyboard_actions.js @@ -26,6 +26,139 @@ const DEFAULT_KEYBOARD_ACTIONS = [ defaultShortcuts: ["CommandOrControl+J"], description: 'Open "Jump to note" dialog' }, + { + actionName: "ScrollToActiveNote", + defaultShortcuts: ["CommandOrControl+."] + }, + { + actionName: "SearchNotes", + defaultShortcuts: ["CommandOrControl+S"] + }, + { + actionName: "SearchInSubtree", + defaultShortcuts: ["CommandOrControl+Shift+S"], + description: "Search for notes in the active note's subtree" + }, + { + actionName: "CollapseTree", + defaultShortcuts: ["Alt+C"] + }, + { + actionName: "CollapseSubtree", + defaultShortcuts: ["Alt+-"], + description: "Collapses subtree of current note" + }, + { + actionName: "FocusNote", + defaultShortcuts: ["Enter"] + }, + { + actionName: "ActivateParentNote", + defaultShortcuts: ["Backspace"], + description: "Activates parent note of currently active note" + }, + { + actionName: "SortChildNotes", + defaultShortcuts: ["Alt+S"], + description: "Sort child notes" + }, + + + { + separator: "Creating and moving notes" + }, + { + actionName: "CreateNoteAfter", + defaultShortcuts: ["CommandOrControl+O"] + }, + { + actionName: "CreateNoteInto", + defaultShortcuts: ["CommandOrControl+P"] + }, + { + actionName: "CreateNoteIntoDayNote", + defaultShortcuts: ["global:CommandOrControl+Alt+P"], + description: "Create and open subnote of a current day note" + }, + { + actionName: "DeleteNotes", + defaultShortcuts: ["Delete"], + description: "Delete note" + }, + { + actionName: "MoveNoteUp", + defaultShortcuts: ["CommandOrControl+Up"], + description: "Move note up" + }, + { + actionName: "MoveNoteDown", + defaultShortcuts: ["CommandOrControl+Down"], + description: "Move note down" + }, + { + actionName: "MoveNoteUpInHierarchy", + defaultShortcuts: ["CommandOrControl+Left"], + description: "Move note up in hierarchy" + }, + { + actionName: "MoveNoteDownInHierarchy", + defaultShortcuts: ["CommandOrControl+Right"], + description: "Move note down in hierarchy" + }, + { + actionName: "EditNoteTitle", + defaultShortcuts: ["Enter"], + description: "Edit active note title" + }, + { + actionName: "EditBranchPrefix", + defaultShortcuts: ["F2"], + description: "Show Edit branch prefix dialog" + }, + { + actionName: "CloneNotesTo", + defaultShortcuts: ["CommandOrControl+Shift+C"] + }, + { + actionName: "MoveNotesTo", + defaultShortcuts: ["CommandOrControl+Shift+C"] + }, + + { + separator: "Note clipboard" + }, + + + { + actionName: "CopyNotesToClipboard", + defaultShortcuts: ["CommandOrControl+C"], + description: "Copy selected notes to the clipboard" + }, + { + actionName: "PasteNotesFromClipboard", + defaultShortcuts: ["CommandOrControl+V"], + description: "Paste notes from the clipboard into active note" + }, + { + actionName: "CutNotesToClipboard", + defaultShortcuts: ["CommandOrControl+X"], + description: "Cut selected notes to the clipboard" + }, + { + actionName: "SelectAllNotesInParent", + defaultShortcuts: ["CommandOrControl+A"], + description: "Select all notes from the current note level" + }, + { + actionName: "AddNoteAboveToSelection", + defaultShortcuts: ["Shift+Up"], + description: "Add note above to the selection" + }, + { + actionName: "AddNoteBelowToSelection", + defaultShortcuts: ["Shift+Down"], + description: "Add note above to the selection" + }, { @@ -80,164 +213,51 @@ const DEFAULT_KEYBOARD_ACTIONS = [ actionName: "ShowRecentChanges", defaultShortcuts: [] }, + { + actionName: "ShowSQLConsole", + defaultShortcuts: ["Alt+O"] + }, { actionName: "ShowHelp", defaultShortcuts: ["F1"] }, + + + { + separator: "Text note operations" + }, + + { + actionName: "AddLinkToText", + defaultShortcuts: ["CommandOrControl+L"], + description: "Open dialog to add link to the text" + }, + { + actionName: "InsertDateTimeToText", + defaultShortcuts: ["Alt+T"] + }, + + { + separator: "Other" + }, + { actionName: "PrintActiveNote", defaultShortcuts: [] }, { - actionName: "CreateNoteAfter", - defaultShortcuts: ["CommandOrControl+O"] - }, - { - actionName: "CreateNoteInto", - defaultShortcuts: ["CommandOrControl+P"] - }, - { - actionName: "CreateNoteIntoDayNote", - defaultShortcuts: ["global:CommandOrControl+Alt+P"], - description: "Create and open subnote of a current day note" - }, - { - actionName: "ScrollToActiveNote", - defaultShortcuts: ["CommandOrControl+."] - }, - { - actionName: "CollapseTree", - defaultShortcuts: ["Alt+C"] - }, - { - actionName: "FocusNote", - defaultShortcuts: ["return"] - }, - { - actionName: "RunCurrentNote", - defaultShortcuts: ["CommandOrControl+return"] - }, - { - actionName: "DeleteNotes", - defaultShortcuts: ["Delete"], - description: "Delete note" - }, - { - actionName: "MoveNoteUp", - defaultShortcuts: ["CommandOrControl+Up"], - description: "Move note up" - }, - { - actionName: "MoveNoteDown", - defaultShortcuts: ["CommandOrControl+Down"], - description: "Move note down" - }, - { - actionName: "MoveNoteUpInHierarchy", - defaultShortcuts: ["CommandOrControl+Left"], - description: "Move note up in hierarchy" - }, - { - actionName: "MoveNoteDownInHierarchy", - defaultShortcuts: ["CommandOrControl+Right"], - description: "Move note down in hierarchy" - }, - { - actionName: "AddNoteAboveToSelection", - defaultShortcuts: ["Shift+Up"], - description: "Add note above to the selection" - }, - { - actionName: "AddNoteBelowToSelection", - defaultShortcuts: ["Shift+Down"], - description: "Add note above to the selection" - }, - { - actionName: "CopyNotesToClipboard", - defaultShortcuts: ["CommandOrControl+C"], - description: "Copy selected notes to the clipboard" - }, - { - actionName: "PasteNotesFromClipboard", - defaultShortcuts: ["CommandOrControl+V"], - description: "Paste notes from the clipboard into active note" - }, - { - actionName: "CutNotesToClipboard", - defaultShortcuts: ["CommandOrControl+X"], - description: "Cut selected notes to the clipboard" - }, - { - actionName: "EditBranchPrefix", - defaultShortcuts: ["F2"], - description: "Show Edit branch prefix dialog" - }, - { - actionName: "CollapseSubtree", - defaultShortcuts: ["Alt+-"], - description: "Collapses subtree of current note" - }, - { - actionName: "SortChildNotes", - defaultShortcuts: ["Alt+S"], - description: "Sort child notes" - }, - { - actionName: "ActivateParentNote", - defaultShortcuts: ["Backspace"], - description: "Activates parent note of currently active note" + actionName: "RunActiveNote", + defaultShortcuts: ["CommandOrControl+Enter"], + description: "Run active JavaScript (frontend/backend) code note" }, { actionName: "ToggleNoteHoisting", defaultShortcuts: ["Alt+H"], description: "Toggles note hoisting of active note" }, - { - actionName: "SearchInSubtree", - defaultShortcuts: ["CommandOrControl+Shift+S"], - description: "Search for notes in the active note's subtree" - }, - { - actionName: "EditNoteTitle", - defaultShortcuts: ["Return"], - description: "Edit active note title" - }, - { - actionName: "SelectAllNotesInParent", - defaultShortcuts: ["CommandOrControl+A"], - description: "Select all notes from the current note level" - }, - { - separator: "Text note operations" - }, - { - actionName: "AddLinkToText", - defaultShortcuts: ["CommandOrControl+L"], - description: "Open dialog to add link to the text" - }, - { - actionName: "CloneNotesTo", - defaultShortcuts: ["CommandOrControl+Shift+C"] - }, - { - actionName: "MoveNotesTo", - defaultShortcuts: ["CommandOrControl+Shift+C"] - }, - { - actionName: "SearchNotes", - defaultShortcuts: ["CommandOrControl+S"] - }, - { - actionName: "ShowSQLConsole", - defaultShortcuts: ["Alt+O"] - }, { actionName: "RunSQL", - defaultShortcuts: ["CommandOrControl+return"] - }, - { - actionName: "InsertDateTimeToText", - defaultShortcuts: ["Alt+T"] + defaultShortcuts: ["CommandOrControl+Enter"] }, { actionName: "ReloadFrontendApp",