-
Notifications
You must be signed in to change notification settings - Fork 18
/
pagermode-go-to-line.go
90 lines (71 loc) · 1.94 KB
/
pagermode-go-to-line.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package m
import (
"strconv"
log "github.com/sirupsen/logrus"
"github.com/walles/moar/m/linenumbers"
"github.com/walles/moar/twin"
)
type PagerModeGotoLine struct {
pager *Pager
gotoLineString string
}
func (m *PagerModeGotoLine) drawFooter(_ string, _ string) {
p := m.pager
_, height := p.screen.Size()
pos := 0
for _, token := range "Go to line number: " + m.gotoLineString {
p.screen.SetCell(pos, height-1, twin.NewCell(token, twin.StyleDefault))
pos++
}
// Add a cursor
p.screen.SetCell(pos, height-1, twin.NewCell(' ', twin.StyleDefault.WithAttr(twin.AttrReverse)))
}
func (m *PagerModeGotoLine) onKey(key twin.KeyCode) {
p := m.pager
switch key {
case twin.KeyEnter:
newLineNumber, err := strconv.Atoi(m.gotoLineString)
if err == nil {
p.scrollPosition = NewScrollPositionFromLineNumber(
linenumbers.LineNumberFromOneBased(newLineNumber),
"onGotoLineKey",
)
}
p.mode = PagerModeViewing{pager: p}
case twin.KeyEscape:
p.mode = PagerModeViewing{pager: p}
case twin.KeyBackspace, twin.KeyDelete:
if len(m.gotoLineString) == 0 {
return
}
m.gotoLineString = removeLastChar(m.gotoLineString)
default:
log.Tracef("Unhandled goto key event %v, treating as a viewing key event", key)
p.mode = PagerModeViewing{pager: p}
p.mode.onKey(key)
}
}
func (m *PagerModeGotoLine) onRune(char rune) {
p := m.pager
if char == 'q' {
p.mode = PagerModeViewing{pager: p}
return
}
if char == 'g' {
p.scrollPosition = newScrollPosition("Pager scroll position")
p.handleScrolledUp()
p.mode = PagerModeViewing{pager: p}
return
}
newGotoLineString := m.gotoLineString + string(char)
newGotoLineNumber, err := strconv.Atoi(newGotoLineString)
if err != nil {
log.Debugf("Got non-number goto rune '%s'/0x%08x: %s", string(char), int32(char), err)
return
}
if newGotoLineNumber < 1 {
log.Debugf("Got non-positive goto line number: %d", newGotoLineNumber)
return
}
m.gotoLineString = newGotoLineString
}