diff options
Diffstat (limited to 'vendor/github.com/jesseduffield/gocui/keybinding.go')
-rw-r--r-- | vendor/github.com/jesseduffield/gocui/keybinding.go | 326 |
1 files changed, 240 insertions, 86 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/keybinding.go b/vendor/github.com/jesseduffield/gocui/keybinding.go index 6e4040e10..00bdcd0bf 100644 --- a/vendor/github.com/jesseduffield/gocui/keybinding.go +++ b/vendor/github.com/jesseduffield/gocui/keybinding.go @@ -4,7 +4,18 @@ package gocui -import "github.com/jesseduffield/termbox-go" +import ( + "strings" + + "github.com/gdamore/tcell/v2" +) + +// Key represents special keys or keys combinations. +type Key tcell.Key + +// Modifier allows to define special keys combinations. They can be used +// in combination with Keys or Runes when a new keybinding is defined. +type Modifier tcell.ModMask // Keybidings are used to link a given key-press event with a handler. type keybinding struct { @@ -16,6 +27,71 @@ type keybinding struct { handler func(*Gui, *View) error } +// Parse takes the input string and extracts the keybinding. +// Returns a Key / rune, a Modifier and an error. +func Parse(input string) (interface{}, Modifier, error) { + if len(input) == 1 { + _, r, err := getKey(rune(input[0])) + if err != nil { + return nil, ModNone, err + } + return r, ModNone, nil + } + + var modifier Modifier + cleaned := make([]string, 0) + + tokens := strings.Split(input, "+") + for _, t := range tokens { + normalized := strings.Title(strings.ToLower(t)) + if t == "Alt" { + modifier = ModAlt + continue + } + cleaned = append(cleaned, normalized) + } + + key, exist := translate[strings.Join(cleaned, "")] + if !exist { + return nil, ModNone, ErrNoSuchKeybind + } + + return key, modifier, nil +} + +// ParseAll takes an array of strings and returns a map of all keybindings. +func ParseAll(input []string) (map[interface{}]Modifier, error) { + ret := make(map[interface{}]Modifier) + for _, i := range input { + k, m, err := Parse(i) + if err != nil { + return ret, err + } + ret[k] = m + } + return ret, nil +} + +// MustParse takes the input string and returns a Key / rune and a Modifier. +// It will panic if any error occured. +func MustParse(input string) (interface{}, Modifier) { + k, m, err := Parse(input) + if err != nil { + panic(err) + } + return k, m +} + +// MustParseAll takes an array of strings and returns a map of all keybindings. +// It will panic if any error occured. +func MustParseAll(input []string) map[interface{}]Modifier { + result, err := ParseAll(input) + if err != nil { + panic(err) + } + return result +} + // newKeybinding returns a new Keybinding object. func newKeybinding(viewname string, contexts []string, key Key, ch rune, mod Modifier, handler func(*Gui, *View) error) (kb *keybinding) { kb = &keybinding{ @@ -29,7 +105,7 @@ func newKeybinding(viewname string, contexts []string, key Key, ch rune, mod Mod return kb } -func eventMatchesKey(ev *termbox.Event, key interface{}) bool { +func eventMatchesKey(ev *GocuiEvent, key interface{}) bool { // assuming ModNone for now if Modifier(ev.Mod) != ModNone { return false @@ -72,99 +148,177 @@ func (kb *keybinding) matchView(v *View) bool { return false } -// Key represents special keys or keys combinations. -type Key termbox.Key +// translations for strings to keys +var translate = map[string]Key{ + "F1": KeyF1, + "F2": KeyF2, + "F3": KeyF3, + "F4": KeyF4, + "F5": KeyF5, + "F6": KeyF6, + "F7": KeyF7, + "F8": KeyF8, + "F9": KeyF9, + "F10": KeyF10, + "F11": KeyF11, + "F12": KeyF12, + "Insert": KeyInsert, + "Delete": KeyDelete, + "Home": KeyHome, + "End": KeyEnd, + "Pgup": KeyPgup, + "Pgdn": KeyPgdn, + "ArrowUp": KeyArrowUp, + "ArrowDown": KeyArrowDown, + "ArrowLeft": KeyArrowLeft, + "ArrowRight": KeyArrowRight, + "CtrlTilde": KeyCtrlTilde, + "Ctrl2": KeyCtrl2, + "CtrlSpace": KeyCtrlSpace, + "CtrlA": KeyCtrlA, + "CtrlB": KeyCtrlB, + "CtrlC": KeyCtrlC, + "CtrlD": KeyCtrlD, + "CtrlE": KeyCtrlE, + "CtrlF": KeyCtrlF, + "CtrlG": KeyCtrlG, + "Backspace": KeyBackspace, + "CtrlH": KeyCtrlH, + "Tab": KeyTab, + "CtrlI": KeyCtrlI, + "CtrlJ": KeyCtrlJ, + "CtrlK": KeyCtrlK, + "CtrlL": KeyCtrlL, + "Enter": KeyEnter, + "CtrlM": KeyCtrlM, + "CtrlN": KeyCtrlN, + "CtrlO": KeyCtrlO, + "CtrlP": KeyCtrlP, + "CtrlQ": KeyCtrlQ, + "CtrlR": KeyCtrlR, + "CtrlS": KeyCtrlS, + "CtrlT": KeyCtrlT, + "CtrlU": KeyCtrlU, + "CtrlV": KeyCtrlV, + "CtrlW": KeyCtrlW, + "CtrlX": KeyCtrlX, + "CtrlY": KeyCtrlY, + "CtrlZ": KeyCtrlZ, + "Esc": KeyEsc, + "CtrlLsqBracket": KeyCtrlLsqBracket, + "Ctrl3": KeyCtrl3, + "Ctrl4": KeyCtrl4, + "CtrlBackslash": KeyCtrlBackslash, + "Ctrl5": KeyCtrl5, + "CtrlRsqBracket": KeyCtrlRsqBracket, + "Ctrl6": KeyCtrl6, + "Ctrl7": KeyCtrl7, + "CtrlSlash": KeyCtrlSlash, + "CtrlUnderscore": KeyCtrlUnderscore, + "Space": KeySpace, + "Backspace2": KeyBackspace2, + "Ctrl8": KeyCtrl8, + "Mouseleft": MouseLeft, + "Mousemiddle": MouseMiddle, + "Mouseright": MouseRight, + "Mouserelease": MouseRelease, + "MousewheelUp": MouseWheelUp, + "MousewheelDown": MouseWheelDown, +} // Special keys. const ( - KeyF1 Key = Key(termbox.KeyF1) - KeyF2 = Key(termbox.KeyF2) - KeyF3 = Key(termbox.KeyF3) - KeyF4 = Key(termbox.KeyF4) - KeyF5 = Key(termbox.KeyF5) - KeyF6 = Key(termbox.KeyF6) - KeyF7 = Key(termbox.KeyF7) - KeyF8 = Key(termbox.KeyF8) - KeyF9 = Key(termbox.KeyF9) - KeyF10 = Key(termbox.KeyF10) - KeyF11 = Key(termbox.KeyF11) - KeyF12 = Key(termbox.KeyF12) - KeyInsert = Key(termbox.KeyInsert) - KeyDelete = Key(termbox.KeyDelete) - KeyHome = Key(termbox.KeyHome) - KeyEnd = Key(termbox.KeyEnd) - KeyPgup = Key(termbox.KeyPgup) - KeyPgdn = Key(termbox.KeyPgdn) - KeyArrowUp = Key(termbox.KeyArrowUp) - KeyArrowDown = Key(termbox.KeyArrowDown) - KeyArrowLeft = Key(termbox.KeyArrowLeft) - KeyArrowRight = Key(termbox.KeyArrowRight) - - MouseLeft = Key(termbox.MouseLeft) - MouseMiddle = Key(termbox.MouseMiddle) - MouseRight = Key(termbox.MouseRight) - MouseRelease = Key(termbox.MouseRelease) - MouseWheelUp = Key(termbox.MouseWheelUp) - MouseWheelDown = Key(termbox.MouseWheelDown) + KeyF1 Key = Key(tcell.KeyF1) + KeyF2 = Key(tcell.KeyF2) + KeyF3 = Key(tcell.KeyF3) + KeyF4 = Key(tcell.KeyF4) + KeyF5 = Key(tcell.KeyF5) + KeyF6 = Key(tcell.KeyF6) + KeyF7 = Key(tcell.KeyF7) + KeyF8 = Key(tcell.KeyF8) + KeyF9 = Key(tcell.KeyF9) + KeyF10 = Key(tcell.KeyF10) + KeyF11 = Key(tcell.KeyF11) + KeyF12 = Key(tcell.KeyF12) + KeyInsert = Key(tcell.KeyInsert) + KeyDelete = Key(tcell.KeyDelete) + KeyHome = Key(tcell.KeyHome) + KeyEnd = Key(tcell.KeyEnd) + KeyPgdn = Key(tcell.KeyPgDn) + KeyPgup = Key(tcell.KeyPgUp) + KeyArrowUp = Key(tcell.KeyUp) + KeyArrowDown = Key(tcell.KeyDown) + KeyArrowLeft = Key(tcell.KeyLeft) + KeyArrowRight = Key(tcell.KeyRight) ) // Keys combinations. const ( - KeyCtrlTilde Key = Key(termbox.KeyCtrlTilde) - KeyCtrl2 = Key(termbox.KeyCtrl2) - KeyCtrlSpace = Key(termbox.KeyCtrlSpace) - KeyCtrlA = Key(termbox.KeyCtrlA) - KeyCtrlB = Key(termbox.KeyCtrlB) - KeyCtrlC = Key(termbox.KeyCtrlC) - KeyCtrlD = Key(termbox.KeyCtrlD) - KeyCtrlE = Key(termbox.KeyCtrlE) - KeyCtrlF = Key(termbox.KeyCtrlF) - KeyCtrlG = Key(termbox.KeyCtrlG) - KeyBackspace = Key(termbox.KeyBackspace) - KeyCtrlH = Key(termbox.KeyCtrlH) - KeyTab = Key(termbox.KeyTab) - KeyCtrlI = Key(termbox.KeyCtrlI) - KeyCtrlJ = Key(termbox.KeyCtrlJ) - KeyCtrlK = Key(termbox.KeyCtrlK) - KeyCtrlL = Key(termbox.KeyCtrlL) - KeyEnter = Key(termbox.KeyEnter) - KeyCtrlM = Key(termbox.KeyCtrlM) - KeyCtrlN = Key(termbox.KeyCtrlN) - KeyCtrlO = Key(termbox.KeyCtrlO) - KeyCtrlP = Key(termbox.KeyCtrlP) - KeyCtrlQ = Key(termbox.KeyCtrlQ) - KeyCtrlR = Key(termbox.KeyCtrlR) - KeyCtrlS = Key(termbox.KeyCtrlS) - KeyCtrlT = Key(termbox.KeyCtrlT) - KeyCtrlU = Key(termbox.KeyCtrlU) - KeyCtrlV = Key(termbox.KeyCtrlV) - KeyCtrlW = Key(termbox.KeyCtrlW) - KeyCtrlX = Key(termbox.KeyCtrlX) - KeyCtrlY = Key(termbox.KeyCtrlY) - KeyCtrlZ = Key(termbox.KeyCtrlZ) - KeyEsc = Key(termbox.KeyEsc) - KeyCtrlLsqBracket = Key(termbox.KeyCtrlLsqBracket) - KeyCtrl3 = Key(termbox.KeyCtrl3) - KeyCtrl4 = Key(termbox.KeyCtrl4) - KeyCtrlBackslash = Key(termbox.KeyCtrlBackslash) - KeyCtrl5 = Key(termbox.KeyCtrl5) - KeyCtrlRsqBracket = Key(termbox.KeyCtrlRsqBracket) - KeyCtrl6 = Key(termbox.KeyCtrl6) - KeyCtrl7 = Key(termbox.KeyCtrl7) - KeyCtrlSlash = Key(termbox.KeyCtrlSlash) - KeyCtrlUnderscore = Key(termbox.KeyCtrlUnderscore) - KeySpace = Key(termbox.KeySpace) - KeyBackspace2 = Key(termbox.KeyBackspace2) - KeyCtrl8 = Key(termbox.KeyCtrl8) -) + KeyCtrlTilde = Key(tcell.KeyF64) // arbitrary assignment + KeyCtrlSpace = Key(tcell.KeyCtrlSpace) + KeyCtrlA = Key(tcell.KeyCtrlA) + KeyCtrlB = Key(tcell.KeyCtrlB) + KeyCtrlC = Key(tcell.KeyCtrlC) + KeyCtrlD = Key(tcell.KeyCtrlD) + KeyCtrlE = Key(tcell.KeyCtrlE) + KeyCtrlF = Key(tcell.KeyCtrlF) + KeyCtrlG = Key(tcell.KeyCtrlG) + KeyBackspace = Key(tcell.KeyBackspace) + KeyCtrlH = Key(tcell.KeyCtrlH) + KeyTab = Key(tcell.KeyTab) + KeyCtrlI = Key(tcell.KeyCtrlI) + KeyCtrlJ = Key(tcell.KeyCtrlJ) + KeyCtrlK = Key(tcell.KeyCtrlK) + KeyCtrlL = Key(tcell.KeyCtrlL) + KeyEnter = Key(tcell.KeyEnter) + KeyCtrlM = Key(tcell.KeyCtrlM) + KeyCtrlN = Key(tcell.KeyCtrlN) + KeyCtrlO = Key(tcell.KeyCtrlO) + KeyCtrlP = Key(tcell.KeyCtrlP) + KeyCtrlQ = Key(tcell.KeyCtrlQ) + KeyCtrlR = Key(tcell.KeyCtrlR) + KeyCtrlS = Key(tcell.KeyCtrlS) + KeyCtrlT = Key(tcell.KeyCtrlT) + KeyCtrlU = Key(tcell.KeyCtrlU) + KeyCtrlV = Key(tcell.KeyCtrlV) + KeyCtrlW = Key(tcell.KeyCtrlW) + KeyCtrlX = Key(tcell.KeyCtrlX) + KeyCtrlY = Key(tcell.KeyCtrlY) + KeyCtrlZ = Key(tcell.KeyCtrlZ) + KeyEsc = Key(tcell.KeyEscape) + KeyCtrlUnderscore = Key(tcell.KeyCtrlUnderscore) + KeySpace = Key(32) + KeyBackspace2 = Key(tcell.KeyBackspace2) + KeyCtrl8 = Key(tcell.KeyBackspace2) // same key as in termbox-go -// Modifier allows to define special keys combinations. They can be used -// in combination with Keys or Runes when a new keybinding is defined. -type Modifier termbox.Modifier + // The following assignments were used in termbox implementation. + // In tcell, these are not keys per se. But in gocui we have them + // mapped to the keys so we have to use placeholder keys. + + MouseLeft = Key(tcell.KeyF63) // arbitrary assignments + MouseRight = Key(tcell.KeyF62) + MouseMiddle = Key(tcell.KeyF61) + MouseRelease = Key(tcell.KeyF60) + MouseWheelUp = Key(tcell.KeyF59) + MouseWheelDown = Key(tcell.KeyF58) + MouseWheelLeft = Key(tcell.KeyF57) + MouseWheelRight = Key(tcell.KeyF56) + KeyCtrl2 = Key(tcell.KeyNUL) // termbox defines theses + KeyCtrl3 = Key(tcell.KeyEscape) + KeyCtrl4 = Key(tcell.KeyCtrlBackslash) + KeyCtrl5 = Key(tcell.KeyCtrlRightSq) + KeyCtrl6 = Key(tcell.KeyCtrlCarat) + KeyCtrl7 = Key(tcell.KeyCtrlUnderscore) + KeyCtrlSlash = Key(tcell.KeyCtrlUnderscore) + KeyCtrlRsqBracket = Key(tcell.KeyCtrlRightSq) + KeyCtrlBackslash = Key(tcell.KeyCtrlBackslash) + KeyCtrlLsqBracket = Key(tcell.KeyCtrlLeftSq) +) // Modifiers. const ( - ModNone Modifier = Modifier(0) - ModAlt = Modifier(termbox.ModAlt) - ModMotion = Modifier(termbox.ModMotion) + ModNone Modifier = Modifier(0) + ModAlt = Modifier(tcell.ModAlt) + // ModCtrl doesn't work with keyboard keys. Use CtrlKey in Key and ModNone. This is was for mouse clicks only (tcell.v1) + // ModCtrl = Modifier(tcell.ModCtrl) ) |