From 9ed971cc90c9d65def3c52178578e43f29b68f9f Mon Sep 17 00:00:00 2001 From: Massimo Mund Date: Fri, 5 Sep 2025 07:56:51 +0200 Subject: Add keybindings for CTRL, ALT, SHIFT + UP, DOWN, RIGHT, LEFT, HOME, END, BACKSPACE, DELETE & more (#3996) * Added tests for `LightRenderer` * Added common SHIFT, ALT and ALT+SHIFT key sequences * Added common CTRL key sequences * Added common CTRL+ALT, CTRL+SHIFT, CTRL+ALT+SHIFT key sequences * Added proper xterm META modifier handling according to https://github.com/joejulian/xterm/blob/defc6dd5684a12dc8e56cb6973ef973e7a32caa3/input.c#L357-L375 * Fix `ctrl-backspace` and `ctrl-alt-backspace` * Fix broken tcell tests on windows by swallowing Resize events * Added tests for FullscreenRenderer * Removed own fork of tcell and updated tcell to 2.9.0 tcell 2.9.0 is needed for `Ctrl-Alt-*` and `Ctrl-Alt-Shift-*` shortcuts in Windows * Replace conditional checks with switch statements to improve readability * Replace long conditionals with constant slices to improve readability * Bind `ctrl-bspace` (`ctrl-h`) to `backward-delete-char` by default Since we now distinguish between Backspace and Ctrl-Backspace, Ctrl-Backspace should trigger the same action as Backspace by default. In that way nothing changes for the user but you can bind other actions to Ctrl-Backspace when desired. --- src/options.go | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 2 deletions(-) (limited to 'src/options.go') diff --git a/src/options.go b/src/options.go index e15d43d6..f8cb578f 100644 --- a/src/options.go +++ b/src/options.go @@ -974,8 +974,6 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve add(tui.Backspace) case "ctrl-space": add(tui.CtrlSpace) - case "ctrl-delete": - add(tui.CtrlDelete) case "ctrl-^", "ctrl-6": add(tui.CtrlCaret) case "ctrl-/", "ctrl-_": @@ -1022,6 +1020,10 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve list = append(list, evt) case "alt-bs", "alt-bspace", "alt-backspace": add(tui.AltBackspace) + case "ctrl-bs", "ctrl-bspace", "ctrl-backspace": + add(tui.CtrlBackspace) + case "ctrl-alt-bs", "ctrl-alt-bspace", "ctrl-alt-backspace": + add(tui.CtrlAltBackspace) case "alt-up": add(tui.AltUp) case "alt-down": @@ -1030,6 +1032,16 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve add(tui.AltLeft) case "alt-right": add(tui.AltRight) + case "alt-home": + add(tui.AltHome) + case "alt-end": + add(tui.AltEnd) + case "alt-delete": + add(tui.AltDelete) + case "alt-page-up": + add(tui.AltPageUp) + case "alt-page-down": + add(tui.AltPageDown) case "tab": add(tui.Tab) case "btab", "shift-tab": @@ -1056,6 +1068,88 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve add(tui.AltShiftLeft) case "alt-shift-right", "shift-alt-right": add(tui.AltShiftRight) + case "alt-shift-home", "shift-alt-home": + add(tui.AltShiftHome) + case "alt-shift-end", "shift-alt-end": + add(tui.AltShiftEnd) + case "alt-shift-delete", "shift-alt-delete": + add(tui.AltShiftDelete) + case "alt-shift-page-up", "shift-alt-page-up": + add(tui.AltShiftPageUp) + case "alt-shift-page-down", "shift-alt-page-down": + add(tui.AltShiftPageDown) + case "ctrl-up": + add(tui.CtrlUp) + case "ctrl-down": + add(tui.CtrlDown) + case "ctrl-right": + add(tui.CtrlRight) + case "ctrl-left": + add(tui.CtrlLeft) + case "ctrl-home": + add(tui.CtrlHome) + case "ctrl-end": + add(tui.CtrlEnd) + case "ctrl-delete": + add(tui.CtrlDelete) + case "ctrl-page-up": + add(tui.CtrlPageUp) + case "ctrl-page-down": + add(tui.CtrlPageDown) + case "ctrl-alt-up", "alt-ctrl-up": + add(tui.CtrlAltUp) + case "ctrl-alt-down", "alt-ctrl-down": + add(tui.CtrlAltDown) + case "ctrl-alt-right", "alt-ctrl-right": + add(tui.CtrlAltRight) + case "ctrl-alt-left", "alt-ctrl-left": + add(tui.CtrlAltLeft) + case "ctrl-alt-home", "alt-ctrl-home": + add(tui.CtrlAltHome) + case "ctrl-alt-end", "alt-ctrl-end": + add(tui.CtrlAltEnd) + case "ctrl-alt-delete", "alt-ctrl-delete": + add(tui.CtrlAltDelete) + case "ctrl-alt-page-up", "alt-ctrl-page-up": + add(tui.CtrlAltPageUp) + case "ctrl-alt-page-down", "alt-ctrl-page-down": + add(tui.CtrlAltPageDown) + case "ctrl-shift-up", "shift-ctrl-up": + add(tui.CtrlShiftUp) + case "ctrl-shift-down", "shift-ctrl-down": + add(tui.CtrlShiftDown) + case "ctrl-shift-right", "shift-ctrl-right": + add(tui.CtrlShiftRight) + case "ctrl-shift-left", "shift-ctrl-left": + add(tui.CtrlShiftLeft) + case "ctrl-shift-home", "shift-ctrl-home": + add(tui.CtrlShiftHome) + case "ctrl-shift-end", "shift-ctrl-end": + add(tui.CtrlShiftEnd) + case "ctrl-shift-delete", "shift-ctrl-delete": + add(tui.CtrlShiftDelete) + case "ctrl-shift-page-up", "shift-ctrl-page-up": + add(tui.CtrlShiftPageUp) + case "ctrl-shift-page-down", "shift-ctrl-page-down": + add(tui.CtrlShiftPageDown) + case "ctrl-alt-shift-up": + add(tui.CtrlAltShiftUp) + case "ctrl-alt-shift-down": + add(tui.CtrlAltShiftDown) + case "ctrl-alt-shift-right": + add(tui.CtrlAltShiftRight) + case "ctrl-alt-shift-left": + add(tui.CtrlAltShiftLeft) + case "ctrl-alt-shift-home": + add(tui.CtrlAltShiftHome) + case "ctrl-alt-shift-end": + add(tui.CtrlAltShiftEnd) + case "ctrl-alt-shift-delete": + add(tui.CtrlAltShiftDelete) + case "ctrl-alt-shift-page-up": + add(tui.CtrlAltShiftPageUp) + case "ctrl-alt-shift-page-down": + add(tui.CtrlAltShiftPageDown) case "shift-up": add(tui.ShiftUp) case "shift-down": @@ -1064,8 +1158,16 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve add(tui.ShiftLeft) case "shift-right": add(tui.ShiftRight) + case "shift-home": + add(tui.ShiftHome) + case "shift-end": + add(tui.ShiftEnd) case "shift-delete": add(tui.ShiftDelete) + case "shift-page-up": + add(tui.ShiftPageUp) + case "shift-page-down": + add(tui.ShiftPageDown) case "left-click": add(tui.LeftClick) case "right-click": -- cgit v1.2.3