From 94f553461167a76657b96a48d2bb52f649e99bbc Mon Sep 17 00:00:00 2001 From: Jonatan Heyman Date: Thu, 10 Apr 2025 20:04:44 +0200 Subject: [PATCH] Revamp key bindings This is a work in progress revamp of the key binding system. It implements a system, built on top of CodeMirror's key binding system, for defining key bindings. The system uses a dumb "KeyShortcut" -> "Command" mapping with a set of default keys (which will be different if Heynote's Emacs mode is used) that can be overridden by user key bindings. The key bindings are *displayed* in the Settings, and it's possible to set user defined key bindings in Heynote's config file, but it's not yet possible to define custom key bindings in the UI. Previously we Heynote on a bunch of default key bindings from CodeMirror (some of which was not "block aware"). This is no longer the case, and because of this, it's quite likely that there are key bindings that was previously working that is now missing (if so, these can easily be added later). --- electron/config.js | 11 + src/components/settings/KeyBindRow.vue | 85 ++++++++ src/components/settings/KeyboardBindings.vue | 126 +++++++++++ src/components/settings/Settings.vue | 59 +++-- src/components/settings/TabListItem.vue | 1 + src/editor/close-brackets.js | 12 + src/editor/commands.js | 122 +++++++++++ src/editor/copy-paste.js | 6 +- src/editor/editor.js | 31 +-- src/editor/emacs-mode.js | 37 ++++ src/editor/emacs.js | 119 ---------- src/editor/keymap.js | 217 +++++++++++++------ src/editor/setup.js | 9 +- src/stores/editor-cache.js | 4 +- tests/emacs-clipboard-keys.spec.js | 1 + 15 files changed, 615 insertions(+), 225 deletions(-) create mode 100644 src/components/settings/KeyBindRow.vue create mode 100644 src/components/settings/KeyboardBindings.vue create mode 100644 src/editor/close-brackets.js create mode 100644 src/editor/commands.js create mode 100644 src/editor/emacs-mode.js delete mode 100644 src/editor/emacs.js diff --git a/electron/config.js b/electron/config.js index f3ecd97..a306131 100644 --- a/electron/config.js +++ b/electron/config.js @@ -24,6 +24,16 @@ const schema = { properties: { "keymap": { "enum": ["default", "emacs"], default:"default" }, "emacsMetaKey": { "enum": [null, "alt", "meta"], default: null }, + "keyBindings": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "showLineNumberGutter": {type: "boolean", default:true}, "showFoldGutter": {type: "boolean", default:true}, "autoUpdate": {type: "boolean", default: true}, @@ -61,6 +71,7 @@ const defaults = { settings: { keymap: "default", emacsMetaKey: isMac ? "meta" : "alt", + keyBindings: {}, showLineNumberGutter: true, showFoldGutter: true, autoUpdate: true, diff --git a/src/components/settings/KeyBindRow.vue b/src/components/settings/KeyBindRow.vue new file mode 100644 index 0000000..64d8110 --- /dev/null +++ b/src/components/settings/KeyBindRow.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/components/settings/KeyboardBindings.vue b/src/components/settings/KeyboardBindings.vue new file mode 100644 index 0000000..a4a584e --- /dev/null +++ b/src/components/settings/KeyboardBindings.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/components/settings/Settings.vue b/src/components/settings/Settings.vue index f142b70..9e9e6aa 100644 --- a/src/components/settings/Settings.vue +++ b/src/components/settings/Settings.vue @@ -1,9 +1,11 @@