diff options
Diffstat (limited to 'src/terminal.go')
-rw-r--r-- | src/terminal.go | 177 |
1 files changed, 91 insertions, 86 deletions
diff --git a/src/terminal.go b/src/terminal.go index 2bba9c21..00370b3b 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -109,8 +109,8 @@ type Terminal struct { sort bool toggleSort bool delimiter Delimiter - expect map[int]string - keymap map[int][]action + expect map[tui.Event]string + keymap map[tui.Event][]action pressed string printQuery bool history *History @@ -304,62 +304,68 @@ func toActions(types ...actionType) []action { return actions } -func defaultKeymap() map[int][]action { - keymap := make(map[int][]action) - keymap[tui.Invalid] = toActions(actInvalid) - keymap[tui.Resize] = toActions(actClearScreen) - keymap[tui.CtrlA] = toActions(actBeginningOfLine) - keymap[tui.CtrlB] = toActions(actBackwardChar) - keymap[tui.CtrlC] = toActions(actAbort) - keymap[tui.CtrlG] = toActions(actAbort) - keymap[tui.CtrlQ] = toActions(actAbort) - keymap[tui.ESC] = toActions(actAbort) - keymap[tui.CtrlD] = toActions(actDeleteCharEOF) - keymap[tui.CtrlE] = toActions(actEndOfLine) - keymap[tui.CtrlF] = toActions(actForwardChar) - keymap[tui.CtrlH] = toActions(actBackwardDeleteChar) - keymap[tui.BSpace] = toActions(actBackwardDeleteChar) - keymap[tui.Tab] = toActions(actToggleDown) - keymap[tui.BTab] = toActions(actToggleUp) - keymap[tui.CtrlJ] = toActions(actDown) - keymap[tui.CtrlK] = toActions(actUp) - keymap[tui.CtrlL] = toActions(actClearScreen) - keymap[tui.CtrlM] = toActions(actAccept) - keymap[tui.CtrlN] = toActions(actDown) - keymap[tui.CtrlP] = toActions(actUp) - keymap[tui.CtrlU] = toActions(actUnixLineDiscard) - keymap[tui.CtrlW] = toActions(actUnixWordRubout) - keymap[tui.CtrlY] = toActions(actYank) +func defaultKeymap() map[tui.Event][]action { + keymap := make(map[tui.Event][]action) + add := func(e tui.EventType, a actionType) { + keymap[e.AsEvent()] = toActions(a) + } + addEvent := func(e tui.Event, a actionType) { + keymap[e] = toActions(a) + } + + add(tui.Invalid, actInvalid) + add(tui.Resize, actClearScreen) + add(tui.CtrlA, actBeginningOfLine) + add(tui.CtrlB, actBackwardChar) + add(tui.CtrlC, actAbort) + add(tui.CtrlG, actAbort) + add(tui.CtrlQ, actAbort) + add(tui.ESC, actAbort) + add(tui.CtrlD, actDeleteCharEOF) + add(tui.CtrlE, actEndOfLine) + add(tui.CtrlF, actForwardChar) + add(tui.CtrlH, actBackwardDeleteChar) + add(tui.BSpace, actBackwardDeleteChar) + add(tui.Tab, actToggleDown) + add(tui.BTab, actToggleUp) + add(tui.CtrlJ, actDown) + add(tui.CtrlK, actUp) + add(tui.CtrlL, actClearScreen) + add(tui.CtrlM, actAccept) + add(tui.CtrlN, actDown) + add(tui.CtrlP, actUp) + add(tui.CtrlU, actUnixLineDiscard) + add(tui.CtrlW, actUnixWordRubout) + add(tui.CtrlY, actYank) if !util.IsWindows() { - keymap[tui.CtrlZ] = toActions(actSigStop) - } - - keymap[tui.AltB] = toActions(actBackwardWord) - keymap[tui.SLeft] = toActions(actBackwardWord) - keymap[tui.AltF] = toActions(actForwardWord) - keymap[tui.SRight] = toActions(actForwardWord) - keymap[tui.AltD] = toActions(actKillWord) - keymap[tui.AltBS] = toActions(actBackwardKillWord) - - keymap[tui.Up] = toActions(actUp) - keymap[tui.Down] = toActions(actDown) - keymap[tui.Left] = toActions(actBackwardChar) - keymap[tui.Right] = toActions(actForwardChar) - - keymap[tui.Home] = toActions(actBeginningOfLine) - keymap[tui.End] = toActions(actEndOfLine) - keymap[tui.Del] = toActions(actDeleteChar) - keymap[tui.PgUp] = toActions(actPageUp) - keymap[tui.PgDn] = toActions(actPageDown) - - keymap[tui.SUp] = toActions(actPreviewUp) - keymap[tui.SDown] = toActions(actPreviewDown) - - keymap[tui.Rune] = toActions(actRune) - keymap[tui.Mouse] = toActions(actMouse) - keymap[tui.DoubleClick] = toActions(actAccept) - keymap[tui.LeftClick] = toActions(actIgnore) - keymap[tui.RightClick] = toActions(actToggle) + add(tui.CtrlZ, actSigStop) + } + + addEvent(tui.AltKey('b'), actBackwardWord) + add(tui.SLeft, actBackwardWord) + addEvent(tui.AltKey('f'), actForwardWord) + add(tui.SRight, actForwardWord) + addEvent(tui.AltKey('d'), actKillWord) + add(tui.AltBS, actBackwardKillWord) + + add(tui.Up, actUp) + add(tui.Down, actDown) + add(tui.Left, actBackwardChar) + add(tui.Right, actForwardChar) + + add(tui.Home, actBeginningOfLine) + add(tui.End, actEndOfLine) + add(tui.Del, actDeleteChar) + add(tui.PgUp, actPageUp) + add(tui.PgDn, actPageDown) + + add(tui.SUp, actPreviewUp) + add(tui.SDown, actPreviewDown) + + add(tui.Mouse, actMouse) + add(tui.DoubleClick, actAccept) + add(tui.LeftClick, actIgnore) + add(tui.RightClick, actToggle) return keymap } @@ -1452,10 +1458,9 @@ func (t *Terminal) rubout(pattern string) { t.input = append(t.input[:t.cx], after...) } -func keyMatch(key int, event tui.Event) bool { - return event.Type == key || - event.Type == tui.Rune && int(event.Char) == key-tui.AltZ || - event.Type == tui.Mouse && key == tui.DoubleClick && event.MouseEvent.Double +func keyMatch(key tui.Event, event tui.Event) bool { + return event.Type == key.Type && event.Char == key.Char || + key.Type == tui.DoubleClick && event.Type == tui.Mouse && event.MouseEvent.Double } func quoteEntryCmd(entry string) string { @@ -2163,16 +2168,20 @@ func (t *Terminal) Loop() { } } - var doAction func(action, int) bool - doActions := func(actions []action, mapkey int) bool { + actionsFor := func(eventType tui.EventType) []action { + return t.keymap[eventType.AsEvent()] + } + + var doAction func(action) bool + doActions := func(actions []action) bool { for _, action := range actions { - if !doAction(action, mapkey) { + if !doAction(action) { return false } } return true } - doAction = func(a action, mapkey int) bool { + doAction = func(a action) bool { switch a.t { case actIgnore: case actExecute, actExecuteSilent: @@ -2326,14 +2335,14 @@ func (t *Terminal) Loop() { } case actToggleIn: if t.layout != layoutDefault { - return doAction(action{t: actToggleUp}, mapkey) + return doAction(action{t: actToggleUp}) } - return doAction(action{t: actToggleDown}, mapkey) + return doAction(action{t: actToggleDown}) case actToggleOut: if t.layout != layoutDefault { - return doAction(action{t: actToggleDown}, mapkey) + return doAction(action{t: actToggleDown}) } - return doAction(action{t: actToggleUp}, mapkey) + return doAction(action{t: actToggleUp}) case actToggleDown: if t.multi > 0 && t.merger.Length() > 0 && toggle() { t.vmove(-1, true) @@ -2490,7 +2499,7 @@ func (t *Terminal) Loop() { // Double-click if my >= min { if t.vset(t.offset+my-min) && t.cy < t.merger.Length() { - return doActions(t.keymap[tui.DoubleClick], tui.DoubleClick) + return doActions(actionsFor(tui.DoubleClick)) } } } else if me.Down { @@ -2504,9 +2513,9 @@ func (t *Terminal) Loop() { } req(reqList) if me.Left { - return doActions(t.keymap[tui.LeftClick], tui.LeftClick) + return doActions(actionsFor(tui.LeftClick)) } - return doActions(t.keymap[tui.RightClick], tui.RightClick) + return doActions(actionsFor(tui.RightClick)) } } } @@ -2528,33 +2537,29 @@ func (t *Terminal) Loop() { } return true } - mapkey := event.Type + if t.jumping == jumpDisabled { - actions := t.keymap[mapkey] - if mapkey == tui.Rune { - mapkey = int(event.Char) + int(tui.AltZ) - if act, prs := t.keymap[mapkey]; prs { - actions = act - } - } - if !doActions(actions, mapkey) { + actions := t.keymap[event.Comparable()] + if len(actions) == 0 && event.Type == tui.Rune { + doAction(action{t: actRune}) + } else if !doActions(actions) { continue } t.truncateQuery() queryChanged = string(previousInput) != string(t.input) changed = changed || queryChanged - if onChanges, prs := t.keymap[tui.Change]; queryChanged && prs { - if !doActions(onChanges, tui.Change) { + if onChanges, prs := t.keymap[tui.Change.AsEvent()]; queryChanged && prs { + if !doActions(onChanges) { continue } } - if onEOFs, prs := t.keymap[tui.BackwardEOF]; beof && prs { - if !doActions(onEOFs, tui.BackwardEOF) { + if onEOFs, prs := t.keymap[tui.BackwardEOF.AsEvent()]; beof && prs { + if !doActions(onEOFs) { continue } } } else { - if mapkey == tui.Rune { + if event.Type == tui.Rune { if idx := strings.IndexRune(t.jumpLabels, event.Char); idx >= 0 && idx < t.maxItems() && idx < t.merger.Length() { t.cy = idx + t.offset if t.jumping == jumpAcceptEnabled { |