-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathkeymap.go
90 lines (80 loc) · 2.36 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
package readline
import (
"context"
"github.com/nyaosorg/go-readline-ny/keys"
)
// Command is the interface for object bound to key-mapping
type Command interface {
String() string
Call(ctx context.Context, buffer *Buffer) Result
}
// GlobalKeyMap is the global keymap for users' customizing
var GlobalKeyMap = &KeyMap{
table: map[keys.Code]Command{
keys.AltB: CmdBackwardWord,
keys.AltF: CmdForwardWord,
keys.AltV: CmdYank,
keys.AltY: CmdYankWithQuote,
keys.Backspace: CmdBackwardDeleteChar,
keys.CtrlA: CmdBeginningOfLine,
keys.CtrlB: CmdBackwardChar,
keys.CtrlC: CmdInterrupt,
keys.CtrlD: CmdDeleteOrAbort,
keys.CtrlE: CmdEndOfLine,
keys.CtrlF: CmdForwardChar,
keys.CtrlH: CmdBackwardDeleteChar,
keys.CtrlK: CmdKillLine,
keys.CtrlL: CmdClearScreen,
keys.CtrlLeft: CmdBackwardWord,
keys.CtrlM: CmdAcceptLine,
keys.CtrlN: CmdNextHistory,
keys.CtrlP: CmdPreviousHistory,
keys.CtrlQ: CmdQuotedInsert,
keys.CtrlR: CmdISearchBackward,
keys.CtrlRight: CmdForwardWord,
keys.CtrlT: CmdSwapChar,
keys.CtrlU: CmdUnixLineDiscard,
keys.CtrlUnderbar: CmdUndo,
keys.CtrlV: CmdQuotedInsert,
keys.CtrlW: CmdUnixWordRubout,
keys.CtrlY: CmdYank,
keys.CtrlZ: CmdUndo,
keys.Delete: CmdDeleteChar,
keys.Down: CmdNextHistory,
keys.End: CmdEndOfLine,
keys.Escape: CmdKillWholeLine,
keys.Home: CmdBeginningOfLine,
keys.Left: CmdBackwardChar,
keys.Right: CmdForwardChar,
keys.Up: CmdPreviousHistory,
},
}
// KeyMap is the class for key-bindings
type KeyMap struct {
table map[keys.Code]Command
}
func (km *KeyMap) BindKey(key keys.Code, f Command) {
if km.table == nil {
km.table = map[keys.Code]Command{}
}
if f == nil {
delete(km.table, key)
} else {
km.table[key] = f
}
}
func (km *KeyMap) Lookup(key keys.Code) (Command, bool) {
if km.table == nil {
return nil, false
}
f, ok := km.table[key]
return f, ok
}
// AnonymousCommand is a type that defines an unnamed command.
type AnonymousCommand func(context.Context, *Buffer) Result
func (f AnonymousCommand) String() string {
return "anonymous"
}
func (f AnonymousCommand) Call(ctx context.Context, B *Buffer) Result {
return f(ctx, B)
}