Skip to content

Commit 9ed971c

Browse files
authored
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.
1 parent 129cb23 commit 9ed971c

File tree

9 files changed

+1228
-117
lines changed

9 files changed

+1228
-117
lines changed

man/man1/fzf.1

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,12 +1473,22 @@ e.g.
14731473
.br
14741474
\fIalt\-right\fR
14751475
.br
1476-
\fIalt\-enter\fR
1476+
\fIalt\-home\fR
14771477
.br
1478-
\fIalt\-space\fR
1478+
\fIalt\-end\fR
14791479
.br
14801480
\fIalt\-backspace\fR (\fIalt\-bspace\fR \fIalt\-bs\fR)
14811481
.br
1482+
\fIalt\-delete\fR
1483+
.br
1484+
\fIalt\-page\-up\fR
1485+
.br
1486+
\fIalt\-page\-down\fR
1487+
.br
1488+
\fIalt\-enter\fR
1489+
.br
1490+
\fIalt\-space\fR
1491+
.br
14821492
\fItab\fR
14831493
.br
14841494
\fIshift\-tab\fR (\fIbtab\fR)
@@ -1505,6 +1515,26 @@ e.g.
15051515
.br
15061516
\fIpage\-down\fR (\fIpgdn\fR)
15071517
.br
1518+
\fIctrl\-up\fR
1519+
.br
1520+
\fIctrl\-down\fR
1521+
.br
1522+
\fIctrl\-left\fR
1523+
.br
1524+
\fIctrl\-right\fR
1525+
.br
1526+
\fIctrl\-home\fR
1527+
.br
1528+
\fIctrl\-end\fR
1529+
.br
1530+
\fIctrl\-backspace\fR (\fIctrl\-bspace\fR \fIctrl\-bs\fR)
1531+
.br
1532+
\fIctrl\-delete\fR
1533+
.br
1534+
\fIctrl\-page\-up\fR
1535+
.br
1536+
\fIctrl\-page\-down\fR
1537+
.br
15081538
\fIshift\-up\fR
15091539
.br
15101540
\fIshift\-down\fR
@@ -1513,8 +1543,16 @@ e.g.
15131543
.br
15141544
\fIshift\-right\fR
15151545
.br
1546+
\fIshift\-home\fR
1547+
.br
1548+
\fIshift\-end\fR
1549+
.br
15161550
\fIshift\-delete\fR
15171551
.br
1552+
\fIshift\-page\-up\fR
1553+
.br
1554+
\fIshift\-page\-down\fR
1555+
.br
15181556
\fIalt\-shift\-up\fR
15191557
.br
15201558
\fIalt\-shift\-down\fR
@@ -1523,6 +1561,72 @@ e.g.
15231561
.br
15241562
\fIalt\-shift\-right\fR
15251563
.br
1564+
\fIalt\-shift\-home\fR
1565+
.br
1566+
\fIalt\-shift\-end\fR
1567+
.br
1568+
\fIalt\-shift\-delete\fR
1569+
.br
1570+
\fIalt\-shift\-page\-up\fR
1571+
.br
1572+
\fIalt\-shift\-page\-down\fR
1573+
.br
1574+
\fIctrl\-alt\-up\fR
1575+
.br
1576+
\fIctrl\-alt\-down\fR
1577+
.br
1578+
\fIctrl\-alt\-left\fR
1579+
.br
1580+
\fIctrl\-alt\-right\fR
1581+
.br
1582+
\fIctrl\-alt\-home\fR
1583+
.br
1584+
\fIctrl\-alt\-end\fR
1585+
.br
1586+
\fIctrl\-alt\-backspace\fR (\fIctrl\-alt\-bspace\fR \fIctrl\-alt\-bs\fR)
1587+
.br
1588+
\fIctrl\-alt\-delete\fR
1589+
.br
1590+
\fIctrl\-alt\-page\-up\fR
1591+
.br
1592+
\fIctrl\-alt\-page\-down\fR
1593+
.br
1594+
\fIctrl\-shift\-up\fR
1595+
.br
1596+
\fIctrl\-shift\-down\fR
1597+
.br
1598+
\fIctrl\-shift\-left\fR
1599+
.br
1600+
\fIctrl\-shift\-right\fR
1601+
.br
1602+
\fIctrl\-shift\-home\fR
1603+
.br
1604+
\fIctrl\-shift\-end\fR
1605+
.br
1606+
\fIctrl\-shift\-delete\fR
1607+
.br
1608+
\fIctrl\-shift\-page\-up\fR
1609+
.br
1610+
\fIctrl\-shift\-page\-down\fR
1611+
.br
1612+
\fIctrl\-alt\-shift\-up\fR
1613+
.br
1614+
\fIctrl\-alt\-shift\-down\fR
1615+
.br
1616+
\fIctrl\-alt\-shift\-left\fR
1617+
.br
1618+
\fIctrl\-alt\-shift\-right\fR
1619+
.br
1620+
\fIctrl\-alt\-shift\-home\fR
1621+
.br
1622+
\fIctrl\-alt\-shift\-end\fR
1623+
.br
1624+
\fIctrl\-alt\-shift\-delete\fR
1625+
.br
1626+
\fIctrl\-alt\-shift\-page\-up\fR
1627+
.br
1628+
\fIctrl\-alt\-shift\-page\-down\fR
1629+
.br
15261630
\fIleft\-click\fR
15271631
.br
15281632
\fIright\-click\fR
@@ -1547,6 +1651,8 @@ e.g.
15471651
.br
15481652
or any single character
15491653

1654+
Note that some terminal emulators may not support \fIctrl-*\fR bindings.
1655+
15501656
.SS AVAILABLE EVENTS:
15511657
\fIstart\fR
15521658
.RS
@@ -1699,7 +1805,7 @@ A key or an event can be bound to one or more of the following actions.
16991805
\fBaccept\-non\-empty\fR (same as \fBaccept\fR except that it prevents fzf from exiting without selection)
17001806
\fBaccept\-or\-print\-query\fR (same as \fBaccept\fR except that it prints the query when there's no match)
17011807
\fBbackward\-char\fR \fIctrl\-b left\fR
1702-
\fBbackward\-delete\-char\fR \fIctrl\-h bspace\fR
1808+
\fBbackward\-delete\-char\fR \fIctrl\-h ctrl\-bspace bspace\fR
17031809
\fBbackward\-delete\-char/eof\fR (same as \fBbackward\-delete\-char\fR except aborts fzf if query is empty)
17041810
\fBbackward\-kill\-word\fR \fIalt\-bs\fR
17051811
\fBbackward\-word\fR \fIalt\-b shift\-left\fR

src/options.go

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -974,8 +974,6 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve
974974
add(tui.Backspace)
975975
case "ctrl-space":
976976
add(tui.CtrlSpace)
977-
case "ctrl-delete":
978-
add(tui.CtrlDelete)
979977
case "ctrl-^", "ctrl-6":
980978
add(tui.CtrlCaret)
981979
case "ctrl-/", "ctrl-_":
@@ -1022,6 +1020,10 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve
10221020
list = append(list, evt)
10231021
case "alt-bs", "alt-bspace", "alt-backspace":
10241022
add(tui.AltBackspace)
1023+
case "ctrl-bs", "ctrl-bspace", "ctrl-backspace":
1024+
add(tui.CtrlBackspace)
1025+
case "ctrl-alt-bs", "ctrl-alt-bspace", "ctrl-alt-backspace":
1026+
add(tui.CtrlAltBackspace)
10251027
case "alt-up":
10261028
add(tui.AltUp)
10271029
case "alt-down":
@@ -1030,6 +1032,16 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve
10301032
add(tui.AltLeft)
10311033
case "alt-right":
10321034
add(tui.AltRight)
1035+
case "alt-home":
1036+
add(tui.AltHome)
1037+
case "alt-end":
1038+
add(tui.AltEnd)
1039+
case "alt-delete":
1040+
add(tui.AltDelete)
1041+
case "alt-page-up":
1042+
add(tui.AltPageUp)
1043+
case "alt-page-down":
1044+
add(tui.AltPageDown)
10331045
case "tab":
10341046
add(tui.Tab)
10351047
case "btab", "shift-tab":
@@ -1056,6 +1068,88 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve
10561068
add(tui.AltShiftLeft)
10571069
case "alt-shift-right", "shift-alt-right":
10581070
add(tui.AltShiftRight)
1071+
case "alt-shift-home", "shift-alt-home":
1072+
add(tui.AltShiftHome)
1073+
case "alt-shift-end", "shift-alt-end":
1074+
add(tui.AltShiftEnd)
1075+
case "alt-shift-delete", "shift-alt-delete":
1076+
add(tui.AltShiftDelete)
1077+
case "alt-shift-page-up", "shift-alt-page-up":
1078+
add(tui.AltShiftPageUp)
1079+
case "alt-shift-page-down", "shift-alt-page-down":
1080+
add(tui.AltShiftPageDown)
1081+
case "ctrl-up":
1082+
add(tui.CtrlUp)
1083+
case "ctrl-down":
1084+
add(tui.CtrlDown)
1085+
case "ctrl-right":
1086+
add(tui.CtrlRight)
1087+
case "ctrl-left":
1088+
add(tui.CtrlLeft)
1089+
case "ctrl-home":
1090+
add(tui.CtrlHome)
1091+
case "ctrl-end":
1092+
add(tui.CtrlEnd)
1093+
case "ctrl-delete":
1094+
add(tui.CtrlDelete)
1095+
case "ctrl-page-up":
1096+
add(tui.CtrlPageUp)
1097+
case "ctrl-page-down":
1098+
add(tui.CtrlPageDown)
1099+
case "ctrl-alt-up", "alt-ctrl-up":
1100+
add(tui.CtrlAltUp)
1101+
case "ctrl-alt-down", "alt-ctrl-down":
1102+
add(tui.CtrlAltDown)
1103+
case "ctrl-alt-right", "alt-ctrl-right":
1104+
add(tui.CtrlAltRight)
1105+
case "ctrl-alt-left", "alt-ctrl-left":
1106+
add(tui.CtrlAltLeft)
1107+
case "ctrl-alt-home", "alt-ctrl-home":
1108+
add(tui.CtrlAltHome)
1109+
case "ctrl-alt-end", "alt-ctrl-end":
1110+
add(tui.CtrlAltEnd)
1111+
case "ctrl-alt-delete", "alt-ctrl-delete":
1112+
add(tui.CtrlAltDelete)
1113+
case "ctrl-alt-page-up", "alt-ctrl-page-up":
1114+
add(tui.CtrlAltPageUp)
1115+
case "ctrl-alt-page-down", "alt-ctrl-page-down":
1116+
add(tui.CtrlAltPageDown)
1117+
case "ctrl-shift-up", "shift-ctrl-up":
1118+
add(tui.CtrlShiftUp)
1119+
case "ctrl-shift-down", "shift-ctrl-down":
1120+
add(tui.CtrlShiftDown)
1121+
case "ctrl-shift-right", "shift-ctrl-right":
1122+
add(tui.CtrlShiftRight)
1123+
case "ctrl-shift-left", "shift-ctrl-left":
1124+
add(tui.CtrlShiftLeft)
1125+
case "ctrl-shift-home", "shift-ctrl-home":
1126+
add(tui.CtrlShiftHome)
1127+
case "ctrl-shift-end", "shift-ctrl-end":
1128+
add(tui.CtrlShiftEnd)
1129+
case "ctrl-shift-delete", "shift-ctrl-delete":
1130+
add(tui.CtrlShiftDelete)
1131+
case "ctrl-shift-page-up", "shift-ctrl-page-up":
1132+
add(tui.CtrlShiftPageUp)
1133+
case "ctrl-shift-page-down", "shift-ctrl-page-down":
1134+
add(tui.CtrlShiftPageDown)
1135+
case "ctrl-alt-shift-up":
1136+
add(tui.CtrlAltShiftUp)
1137+
case "ctrl-alt-shift-down":
1138+
add(tui.CtrlAltShiftDown)
1139+
case "ctrl-alt-shift-right":
1140+
add(tui.CtrlAltShiftRight)
1141+
case "ctrl-alt-shift-left":
1142+
add(tui.CtrlAltShiftLeft)
1143+
case "ctrl-alt-shift-home":
1144+
add(tui.CtrlAltShiftHome)
1145+
case "ctrl-alt-shift-end":
1146+
add(tui.CtrlAltShiftEnd)
1147+
case "ctrl-alt-shift-delete":
1148+
add(tui.CtrlAltShiftDelete)
1149+
case "ctrl-alt-shift-page-up":
1150+
add(tui.CtrlAltShiftPageUp)
1151+
case "ctrl-alt-shift-page-down":
1152+
add(tui.CtrlAltShiftPageDown)
10591153
case "shift-up":
10601154
add(tui.ShiftUp)
10611155
case "shift-down":
@@ -1064,8 +1158,16 @@ func parseKeyChords(str string, message string) (map[tui.Event]string, []tui.Eve
10641158
add(tui.ShiftLeft)
10651159
case "shift-right":
10661160
add(tui.ShiftRight)
1161+
case "shift-home":
1162+
add(tui.ShiftHome)
1163+
case "shift-end":
1164+
add(tui.ShiftEnd)
10671165
case "shift-delete":
10681166
add(tui.ShiftDelete)
1167+
case "shift-page-up":
1168+
add(tui.ShiftPageUp)
1169+
case "shift-page-down":
1170+
add(tui.ShiftPageDown)
10691171
case "left-click":
10701172
add(tui.LeftClick)
10711173
case "right-click":

src/terminal.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ func defaultKeymap() map[tui.Event][]*action {
782782
add(tui.CtrlF, actForwardChar)
783783
add(tui.CtrlH, actBackwardDeleteChar)
784784
add(tui.Backspace, actBackwardDeleteChar)
785+
add(tui.CtrlBackspace, actBackwardDeleteChar)
785786
add(tui.Tab, actToggleDown)
786787
add(tui.ShiftTab, actToggleUp)
787788
add(tui.CtrlJ, actDown)

0 commit comments

Comments
 (0)