forked from liamg/darktile
/
hint.go
51 lines (38 loc) · 1.02 KB
/
hint.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
package buffer
import (
"fmt"
"strings"
"github.com/akavel/csi/hints"
)
func (buffer *Buffer) GetHintAtPosition(col uint16, viewRow uint16) *hints.Hint {
row := buffer.convertViewLineToRawLine(viewRow) - uint64(buffer.terminalState.scrollLinesFromBottom)
cell := buffer.GetRawCell(col, row)
if cell == nil || cell.Rune() == 0x00 {
return nil
}
candidate := ""
for i := int(col); i >= 0; i-- {
cell := buffer.GetRawCell(uint16(i), row)
if cell == nil {
break
}
if isRuneWordSelectionMarker(cell.Rune()) {
break
}
candidate = fmt.Sprintf("%c%s", cell.Rune(), candidate)
}
trimmed := strings.TrimLeft(candidate, " ")
sx := col - uint16(len(trimmed)-1)
for i := col + 1; i < buffer.terminalState.viewWidth; i++ {
cell := buffer.GetRawCell(i, row)
if cell == nil {
break
}
if isRuneWordSelectionMarker(cell.Rune()) {
break
}
candidate = fmt.Sprintf("%s%c", candidate, cell.Rune())
}
line := buffer.lines[row]
return hints.Get(strings.Trim(candidate, " "), line.String(), sx, viewRow)
}