From 976dbec9ff80748a888c8b886a90ba76c34498e0 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Wed, 8 Apr 2026 22:03:50 +0200 Subject: [PATCH] Make edit keybindings for move-by-word and backspace-word configurable And make them platform dependent so that they are with ctrl on Windows and Linux, but alt on Mac. --- docs-master/Config.md | 9 +++++++++ pkg/config/user_config.go | 6 ++++++ pkg/gocui/edit.go | 12 +++++++++--- pkg/gocui/gui.go | 6 ++++++ pkg/gui/gui.go | 6 ++++++ schema-master/config.json | 15 +++++++++++++++ 6 files changed, 51 insertions(+), 3 deletions(-) diff --git a/docs-master/Config.md b/docs-master/Config.md index a0f531654..ebe2524ae 100644 --- a/docs-master/Config.md +++ b/docs-master/Config.md @@ -630,6 +630,15 @@ keybinding: nextMatch: "n" prevMatch: "N" startSearch: / + + # on Mac + moveWordLeft: + + # on Mac + moveWordRight: + + # on Mac + backspaceWord: optionMenu: optionMenu-alt1: '?' select: diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index 72c6bb742..c0b086d98 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -454,6 +454,9 @@ type KeybindingUniversalConfig struct { NextMatch string `yaml:"nextMatch"` PrevMatch string `yaml:"prevMatch"` StartSearch string `yaml:"startSearch"` + MoveWordLeft string `yaml:"moveWordLeft"` // on Mac + MoveWordRight string `yaml:"moveWordRight"` // on Mac + BackspaceWord string `yaml:"backspaceWord"` // on Mac OptionMenu string `yaml:"optionMenu"` OptionMenuAlt1 string `yaml:"optionMenu-alt1"` Select string `yaml:"select"` @@ -933,6 +936,9 @@ func GetDefaultConfigForPlatform(platform string) *UserConfig { NextMatch: "n", PrevMatch: "N", StartSearch: "/", + MoveWordLeft: platformKeyBinding(platform, map[string]string{"darwin": ""}, ""), + MoveWordRight: platformKeyBinding(platform, map[string]string{"darwin": ""}, ""), + BackspaceWord: platformKeyBinding(platform, map[string]string{"darwin": ""}, ""), OptionMenu: "", OptionMenuAlt1: "?", Select: "", diff --git a/pkg/gocui/edit.go b/pkg/gocui/edit.go index 32593957d..7180aba18 100644 --- a/pkg/gocui/edit.go +++ b/pkg/gocui/edit.go @@ -22,10 +22,16 @@ func (f EditorFunc) Edit(v *View, key Key) bool { // DefaultEditor is the default editor. var DefaultEditor Editor = EditorFunc(SimpleEditor) +var ( + moveWordLeftKeybinding = NewKey(KeyArrowLeft, "", ModCtrl) + moveWordRightKeybinding = NewKey(KeyArrowRight, "", ModCtrl) + backspaceWordKeybinding = NewKey(KeyBackspace, "", ModCtrl) +) + // SimpleEditor is used as the default gocui editor. func SimpleEditor(v *View, key Key) bool { switch { - case key.Equals(NewKey(KeyBackspace, "", ModAlt)), + case key.Equals(backspaceWordKeybinding), key.Equals(NewKeyStrMod("w", ModCtrl)): v.TextArea.BackSpaceWord() case key.Equals(NewKeyName(KeyBackspace)): @@ -38,13 +44,13 @@ func SimpleEditor(v *View, key Key) bool { case key.Equals(NewKeyName(KeyArrowUp)): v.TextArea.MoveCursorUp() case key.Equals(NewKeyStrMod("b", ModAlt)), - key.Equals(NewKey(KeyArrowLeft, "", ModAlt)): + key.Equals(moveWordLeftKeybinding): v.TextArea.MoveLeftWord() case key.Equals(NewKeyName(KeyArrowLeft)), key.Equals(NewKeyStrMod("b", ModCtrl)): v.TextArea.MoveCursorLeft() case key.Equals(NewKeyStrMod("f", ModAlt)), - key.Equals(NewKey(KeyArrowRight, "", ModAlt)): + key.Equals(moveWordRightKeybinding): v.TextArea.MoveRightWord() case key.Equals(NewKeyName(KeyArrowRight)), key.Equals(NewKeyStrMod("b", ModCtrl)): diff --git a/pkg/gocui/gui.go b/pkg/gocui/gui.go index 9aaca3e2a..eb3eb738c 100644 --- a/pkg/gocui/gui.go +++ b/pkg/gocui/gui.go @@ -1629,3 +1629,9 @@ func (g *Gui) Snapshot() string { return builder.String() } + +func (g *Gui) SetEditKeybindings(moveWordLeft, moveWordRight, backspaceWord Key) { + moveWordLeftKeybinding = moveWordLeft + moveWordRightKeybinding = moveWordRight + backspaceWordKeybinding = backspaceWord +} diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index cf024a728..7fb732d99 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -474,6 +474,12 @@ func (gui *Gui) onUserConfigLoaded() error { gui.g.NextSearchMatchKey = config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.NextMatch) gui.g.PrevSearchMatchKey = config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.PrevMatch) + gui.g.SetEditKeybindings( + config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.MoveWordLeft), + config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.MoveWordRight), + config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.BackspaceWord), + ) + gui.g.ShowListFooter = userConfig.Gui.ShowListFooter gui.g.Mouse = userConfig.Gui.MouseEvents diff --git a/schema-master/config.json b/schema-master/config.json index 757a23e27..5830772bb 100644 --- a/schema-master/config.json +++ b/schema-master/config.json @@ -1410,6 +1410,21 @@ "type": "string", "default": "/" }, + "moveWordLeft": { + "type": "string", + "description": "\u003ca-left\u003e on Mac", + "default": "\u003cc-left\u003e" + }, + "moveWordRight": { + "type": "string", + "description": "\u003ca-right\u003e on Mac", + "default": "\u003cc-right\u003e" + }, + "backspaceWord": { + "type": "string", + "description": "\u003ca-backspace\u003e on Mac", + "default": "\u003cc-backspace\u003e" + }, "optionMenu": { "type": "string", "default": "\u003cdisabled\u003e"