diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2020-12-30 01:59:18 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2020-12-30 18:39:17 +0900 |
commit | 7f8e0dbc408eff786865d0e2d9e3c62ec3ed4776 (patch) | |
tree | deeac2dc561a2ccd5bf444f4180abb43bff060be /src/tui/light.go | |
parent | 0de7ab18f64db7838c8ca06d08188f976cbfdbb4 (diff) |
Extend support for alt key chords
"alt-" with any case-sensitive character is allowed
Diffstat (limited to 'src/tui/light.go')
-rw-r--r-- | src/tui/light.go | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/src/tui/light.go b/src/tui/light.go index 4f50d687..9c48b465 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -1,6 +1,7 @@ package tui import ( + "bytes" "fmt" "os" "regexp" @@ -230,7 +231,7 @@ func (r *LightRenderer) getBytesInternal(buffer []byte, nonblock bool) []byte { } retries := 0 - if c == ESC || nonblock { + if c == ESC.Int() || nonblock { retries = r.escDelay / escPollInterval } buffer = append(buffer, byte(c)) @@ -245,7 +246,7 @@ func (r *LightRenderer) getBytesInternal(buffer []byte, nonblock bool) []byte { continue } break - } else if c == ESC && pc != c { + } else if c == ESC.Int() && pc != c { retries = r.escDelay / escPollInterval } else { retries = 0 @@ -278,11 +279,11 @@ func (r *LightRenderer) GetChar() Event { }() switch r.buffer[0] { - case CtrlC: + case CtrlC.Byte(): return Event{CtrlC, 0, nil} - case CtrlG: + case CtrlG.Byte(): return Event{CtrlG, 0, nil} - case CtrlQ: + case CtrlQ.Byte(): return Event{CtrlQ, 0, nil} case 127: return Event{BSpace, 0, nil} @@ -296,7 +297,7 @@ func (r *LightRenderer) GetChar() Event { return Event{CtrlCaret, 0, nil} case 31: return Event{CtrlSlash, 0, nil} - case ESC: + case ESC.Byte(): ev := r.escSequence(&sz) // Second chance if ev.Type == Invalid { @@ -307,8 +308,8 @@ func (r *LightRenderer) GetChar() Event { } // CTRL-A ~ CTRL-Z - if r.buffer[0] <= CtrlZ { - return Event{int(r.buffer[0]), 0, nil} + if r.buffer[0] <= CtrlZ.Byte() { + return Event{EventType(r.buffer[0]), 0, nil} } char, rsz := utf8.DecodeRune(r.buffer) if char == utf8.RuneError { @@ -331,26 +332,16 @@ func (r *LightRenderer) escSequence(sz *int) Event { *sz = 2 if r.buffer[1] >= 1 && r.buffer[1] <= 'z'-'a'+1 { - return Event{int(CtrlAltA + r.buffer[1] - 1), 0, nil} + return CtrlAltKey(rune(r.buffer[1] + 'a' - 1)) } alt := false - if len(r.buffer) > 2 && r.buffer[1] == ESC { + if len(r.buffer) > 2 && r.buffer[1] == ESC.Byte() { r.buffer = r.buffer[1:] alt = true } switch r.buffer[1] { - case ESC: + case ESC.Byte(): return Event{ESC, 0, nil} - case ' ': - return Event{AltSpace, 0, nil} - case '/': - return Event{AltSlash, 0, nil} - case 'b': - return Event{AltB, 0, nil} - case 'd': - return Event{AltD, 0, nil} - case 'f': - return Event{AltF, 0, nil} case 127: return Event{AltBS, 0, nil} case '[', 'O': @@ -518,11 +509,11 @@ func (r *LightRenderer) escSequence(sz *int) Event { } // r.buffer[2] } // r.buffer[2] } // r.buffer[1] - if r.buffer[1] >= 'a' && r.buffer[1] <= 'z' { - return Event{AltA + int(r.buffer[1]) - 'a', 0, nil} - } - if r.buffer[1] >= '0' && r.buffer[1] <= '9' { - return Event{Alt0 + int(r.buffer[1]) - '0', 0, nil} + rest := bytes.NewBuffer(r.buffer[1:]) + c, size, err := rest.ReadRune() + if err == nil { + *sz = 1 + size + return AltKey(c) } return Event{Invalid, 0, nil} } |