summaryrefslogtreecommitdiffstats
path: root/src/tui/light.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-12-30 01:59:18 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-12-30 18:39:17 +0900
commit7f8e0dbc408eff786865d0e2d9e3c62ec3ed4776 (patch)
treedeeac2dc561a2ccd5bf444f4180abb43bff060be /src/tui/light.go
parent0de7ab18f64db7838c8ca06d08188f976cbfdbb4 (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.go43
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}
}