diff --git a/internal/action/bindings.go b/internal/action/bindings.go index 0b940ebf..01ea7845 100644 --- a/internal/action/bindings.go +++ b/internal/action/bindings.go @@ -176,31 +176,18 @@ modSearch: // see if the key is in bindingKeys with the Ctrl prefix. k = string(unicode.ToUpper(rune(k[0]))) + k[1:] if code, ok := keyEvents["Ctrl"+k]; ok { - var r tcell.Key - // Special case for escape, for some reason tcell doesn't send it with the esc character - if code < 256 && code != 27 { - r = code - } - // It is, we're done. return KeyEvent{ code: code, mod: modifiers, - r: rune(r), }, true } } // See if we can find the key in bindingKeys if code, ok := keyEvents[k]; ok { - var r tcell.Key - // Special case for escape, for some reason tcell doesn't send it with the esc character - if code < 256 && code != 27 { - r = code - } return KeyEvent{ code: code, mod: modifiers, - r: rune(r), }, true } diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index 7b348b79..34808eca 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -469,11 +469,7 @@ func (h *BufPane) HandleEvent(event tcell.Event) { h.paste(e.Text()) h.Relocate() case *tcell.EventKey: - ke := KeyEvent{ - code: e.Key(), - mod: metaToAlt(e.Modifiers()), - r: e.Rune(), - } + ke := keyEvent(e) done := h.DoKeyEvent(ke) if !done && e.Key() == tcell.KeyRune { diff --git a/internal/action/events.go b/internal/action/events.go index 4addf1b5..9b6a0ee6 100644 --- a/internal/action/events.go +++ b/internal/action/events.go @@ -44,6 +44,17 @@ func metaToAlt(mod tcell.ModMask) tcell.ModMask { return mod } +func keyEvent(e *tcell.EventKey) KeyEvent { + ke := KeyEvent{ + code: e.Key(), + mod: metaToAlt(e.Modifiers()), + } + if e.Key() == tcell.KeyRune { + ke.r = e.Rune() + } + return ke +} + func (k KeyEvent) Name() string { if k.any { return "" @@ -68,7 +79,7 @@ func (k KeyEvent) Name() string { if k.code == tcell.KeyRune { s = string(k.r) } else { - s = fmt.Sprintf("Key[%d,%d]", k.code, int(k.r)) + s = fmt.Sprintf("Key[%d]", k.code) } } if len(m) != 0 { @@ -155,11 +166,7 @@ func (m MouseEvent) Name() string { func ConstructEvent(event tcell.Event) (Event, error) { switch e := event.(type) { case *tcell.EventKey: - return KeyEvent{ - code: e.Key(), - mod: metaToAlt(e.Modifiers()), - r: e.Rune(), - }, nil + return keyEvent(e), nil case *tcell.EventRaw: return RawEvent{ esc: e.EscSeq(), diff --git a/internal/action/infopane.go b/internal/action/infopane.go index d3f30fd4..93dd9453 100644 --- a/internal/action/infopane.go +++ b/internal/action/infopane.go @@ -86,11 +86,7 @@ func (h *InfoPane) HandleEvent(event tcell.Event) { case *tcell.EventResize: // TODO case *tcell.EventKey: - ke := KeyEvent{ - code: e.Key(), - mod: metaToAlt(e.Modifiers()), - r: e.Rune(), - } + ke := keyEvent(e) done := h.DoKeyEvent(ke) hasYN := h.HasYN diff --git a/internal/action/termpane.go b/internal/action/termpane.go index f440f0cd..46d14d91 100644 --- a/internal/action/termpane.go +++ b/internal/action/termpane.go @@ -125,11 +125,7 @@ func (t *TermPane) Unsplit() { // copy-paste func (t *TermPane) HandleEvent(event tcell.Event) { if e, ok := event.(*tcell.EventKey); ok { - ke := KeyEvent{ - code: e.Key(), - mod: metaToAlt(e.Modifiers()), - r: e.Rune(), - } + ke := keyEvent(e) action, more := TermBindings.NextEvent(ke, nil) if !more {