-
Notifications
You must be signed in to change notification settings - Fork 21
/
keymap.go
109 lines (96 loc) · 3.25 KB
/
keymap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package textinput
import (
"fmt"
tea "github.com/charmbracelet/bubbletea"
)
// NewDefaultKeyMap returns a KeyMap with sensible default key mappings that can
// also be used as a starting point for customization.
func NewDefaultKeyMap() *KeyMap {
return &KeyMap{
MoveBackward: []string{"left", "ctrl+b"},
MoveForward: []string{"right", "ctrl+f"},
JumpToBeginning: []string{"home", "ctrl+a"},
JumpToEnd: []string{"end", "ctrl+e"},
DeleteBeforeCursor: []string{"backspace"},
DeleteWordBeforeCursor: []string{"ctrl+w"},
DeleteUnderCursor: []string{"delete", "ctrl+d"},
DeleteAllAfterCursor: []string{"ctrl+k"},
DeleteAllBeforeCursor: []string{"ctrl+u"},
AutoComplete: []string{"tab"},
Paste: []string{"ctrl+v"},
Clear: []string{"esc"},
Reset: []string{},
Submit: []string{"enter"},
Abort: []string{"ctrl+c"},
}
}
var upsteamKeyMap = &KeyMap{
MoveBackward: []string{"left", "ctrl+b"},
MoveForward: []string{"right", "ctrl+f"},
JumpToBeginning: []string{"home", "ctrl+a"},
JumpToEnd: []string{"end", "ctrl+e"},
DeleteBeforeCursor: []string{"backspace"},
DeleteWordBeforeCursor: []string{"ctrl+w"},
DeleteUnderCursor: []string{"delete", "ctrl+d"},
DeleteAllAfterCursor: []string{"ctrl+k"},
DeleteAllBeforeCursor: []string{"ctrl+u"},
Paste: []string{"ctrl+v"},
}
// KeyMap defines the keys that trigger certain actions.
type KeyMap struct {
MoveBackward []string
MoveForward []string
JumpToBeginning []string
JumpToEnd []string
DeleteBeforeCursor []string
DeleteWordBeforeCursor []string
DeleteUnderCursor []string
DeleteAllAfterCursor []string
DeleteAllBeforeCursor []string
AutoComplete []string
Paste []string
Clear []string
Reset []string
Submit []string
Abort []string
}
func keyMatches(key tea.KeyMsg, mapping []string) bool {
for _, m := range mapping {
if m == key.String() {
return true
}
}
return false
}
func keyMatchesUpstreamKeyMap(key tea.KeyMsg) bool {
return keyMatches(key, allKeys(upsteamKeyMap))
}
// validateKeyMap returns true if the given key map contains at
// least the bare minimum set of key bindings for the functional
// prompt and false otherwise.
func validateKeyMap(km *KeyMap) error {
if len(km.Submit) == 0 {
return fmt.Errorf("no submit key")
}
if len(km.Abort) == 0 {
return fmt.Errorf("no abort key")
}
return nil
}
func allKeys(km *KeyMap) (keys []string) {
keys = append(keys, km.MoveBackward...)
keys = append(keys, km.MoveForward...)
keys = append(keys, km.JumpToBeginning...)
keys = append(keys, km.JumpToEnd...)
keys = append(keys, km.DeleteBeforeCursor...)
keys = append(keys, km.DeleteUnderCursor...)
keys = append(keys, km.DeleteAllAfterCursor...)
keys = append(keys, km.DeleteAllBeforeCursor...)
keys = append(keys, km.AutoComplete...)
keys = append(keys, km.Paste...)
keys = append(keys, km.Clear...)
keys = append(keys, km.Reset...)
keys = append(keys, km.Submit...)
keys = append(keys, km.Abort...)
return keys
}