Add a forwardDeleteWord keybinding

Bound to alt-delete on Mac, and ctrl-delete on Windows and Linux.
This commit is contained in:
Stefan Haller 2026-04-08 22:21:59 +02:00
parent 976dbec9ff
commit bfdea2bb4f
7 changed files with 45 additions and 12 deletions

View file

@ -639,6 +639,9 @@ keybinding:
# <a-backspace> on Mac
backspaceWord: <c-backspace>
# <a-delete> on Mac
forwardDeleteWord: <c-delete>
optionMenu: <disabled>
optionMenu-alt1: '?'
select: <space>

View file

@ -454,9 +454,10 @@ type KeybindingUniversalConfig struct {
NextMatch string `yaml:"nextMatch"`
PrevMatch string `yaml:"prevMatch"`
StartSearch string `yaml:"startSearch"`
MoveWordLeft string `yaml:"moveWordLeft"` // <a-left> on Mac
MoveWordRight string `yaml:"moveWordRight"` // <a-right> on Mac
BackspaceWord string `yaml:"backspaceWord"` // <a-backspace> on Mac
MoveWordLeft string `yaml:"moveWordLeft"` // <a-left> on Mac
MoveWordRight string `yaml:"moveWordRight"` // <a-right> on Mac
BackspaceWord string `yaml:"backspaceWord"` // <a-backspace> on Mac
ForwardDeleteWord string `yaml:"forwardDeleteWord"` // <a-delete> on Mac
OptionMenu string `yaml:"optionMenu"`
OptionMenuAlt1 string `yaml:"optionMenu-alt1"`
Select string `yaml:"select"`
@ -939,6 +940,7 @@ func GetDefaultConfigForPlatform(platform string) *UserConfig {
MoveWordLeft: platformKeyBinding(platform, map[string]string{"darwin": "<a-left>"}, "<c-left>"),
MoveWordRight: platformKeyBinding(platform, map[string]string{"darwin": "<a-right>"}, "<c-right>"),
BackspaceWord: platformKeyBinding(platform, map[string]string{"darwin": "<a-backspace>"}, "<c-backspace>"),
ForwardDeleteWord: platformKeyBinding(platform, map[string]string{"darwin": "<a-delete>"}, "<c-delete>"),
OptionMenu: "<disabled>",
OptionMenuAlt1: "?",
Select: "<space>",

View file

@ -23,9 +23,10 @@ func (f EditorFunc) Edit(v *View, key Key) bool {
var DefaultEditor Editor = EditorFunc(SimpleEditor)
var (
moveWordLeftKeybinding = NewKey(KeyArrowLeft, "", ModCtrl)
moveWordRightKeybinding = NewKey(KeyArrowRight, "", ModCtrl)
backspaceWordKeybinding = NewKey(KeyBackspace, "", ModCtrl)
moveWordLeftKeybinding = NewKey(KeyArrowLeft, "", ModCtrl)
moveWordRightKeybinding = NewKey(KeyArrowRight, "", ModCtrl)
backspaceWordKeybinding = NewKey(KeyBackspace, "", ModCtrl)
forwardDeleteWordKeybinding = NewKey(KeyDelete, "", ModCtrl)
)
// SimpleEditor is used as the default gocui editor.
@ -34,6 +35,9 @@ func SimpleEditor(v *View, key Key) bool {
case key.Equals(backspaceWordKeybinding),
key.Equals(NewKeyStrMod("w", ModCtrl)):
v.TextArea.BackSpaceWord()
case key.Equals(forwardDeleteWordKeybinding),
key.Equals(NewKeyStrMod("d", ModAlt)):
v.TextArea.ForwardDeleteWord()
case key.Equals(NewKeyName(KeyBackspace)):
v.TextArea.BackSpaceChar()
case key.Equals(NewKeyStrMod("d", ModCtrl)),

View file

@ -1630,8 +1630,9 @@ func (g *Gui) Snapshot() string {
return builder.String()
}
func (g *Gui) SetEditKeybindings(moveWordLeft, moveWordRight, backspaceWord Key) {
func (g *Gui) SetEditKeybindings(moveWordLeft, moveWordRight, backspaceWord, forwardDeleteWord Key) {
moveWordLeftKeybinding = moveWordLeft
moveWordRightKeybinding = moveWordRight
backspaceWordKeybinding = backspaceWord
forwardDeleteWordKeybinding = forwardDeleteWord
}

View file

@ -340,13 +340,12 @@ func (self *TextArea) MoveLeftWord() {
self.cursor = self.newCursorForMoveLeftWord()
}
func (self *TextArea) MoveRightWord() {
func (self *TextArea) newCursorForMoveRightWord() int {
if self.atEnd() {
return
return self.cursor
}
if self.atLineEnd() {
self.cursor++
return
return self.cursor + 1
}
cellCursor := self.contentCursorToCellCursor(self.cursor)
@ -364,7 +363,11 @@ func (self *TextArea) MoveRightWord() {
}
}
self.cursor = self.cellCursorToContentCursor(cellCursor)
return self.cellCursorToContentCursor(cellCursor)
}
func (self *TextArea) MoveRightWord() {
self.cursor = self.newCursorForMoveRightWord()
}
func (self *TextArea) MoveCursorUp() {
@ -559,6 +562,20 @@ func (self *TextArea) BackSpaceWord() {
self.updateCells()
}
func (self *TextArea) ForwardDeleteWord() {
newCursor := self.newCursorForMoveRightWord()
if newCursor == self.cursor {
return
}
clipboard := self.content[self.cursor:newCursor]
if clipboard != "\n" {
self.clipboard = clipboard
}
self.content = self.content[:self.cursor] + self.content[newCursor:]
self.updateCells()
}
func (self *TextArea) Yank() {
self.TypeString(self.clipboard)
}

View file

@ -478,6 +478,7 @@ func (gui *Gui) onUserConfigLoaded() error {
config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.MoveWordLeft),
config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.MoveWordRight),
config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.BackspaceWord),
config.GetValidatedKeyBindingKey(userConfig.Keybinding.Universal.ForwardDeleteWord),
)
gui.g.ShowListFooter = userConfig.Gui.ShowListFooter

View file

@ -1425,6 +1425,11 @@
"description": "\u003ca-backspace\u003e on Mac",
"default": "\u003cc-backspace\u003e"
},
"forwardDeleteWord": {
"type": "string",
"description": "\u003ca-delete\u003e on Mac",
"default": "\u003cc-delete\u003e"
},
"optionMenu": {
"type": "string",
"default": "\u003cdisabled\u003e"