-
Notifications
You must be signed in to change notification settings - Fork 76
/
autocomplete_mode.go
69 lines (60 loc) · 1.4 KB
/
autocomplete_mode.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
package main
import (
"github.com/nsf/termbox-go"
)
type autocomplete_mode struct {
stub_overlay_mode
godit *godit
origin cursor_location
proposals []ac_proposal
prefix_len int
current int
}
func init_autocomplete_mode(godit *godit) *autocomplete_mode {
view := godit.active.leaf
a := new(autocomplete_mode)
a.godit = godit
a.origin = view.cursor
a.proposals, a.prefix_len = local_ac(view)
a.current = -1
a.substitute_next()
return a
}
func (a *autocomplete_mode) substitute_next() {
view := a.godit.active.leaf
if a.current != -1 {
// undo previous substitution
view.undo()
a.godit.set_status("") // hide undo status message
}
a.current++
if a.current >= len(a.proposals) {
a.current = -1
a.godit.set_status("No further expansions found")
return
}
// create a new one
c := view.cursor
view.finalize_action_group()
if a.prefix_len != 0 {
c.move_one_word_backward()
wlen := a.origin.boffset - c.boffset
view.action_delete(c, wlen)
}
newword := clone_byte_slice(a.proposals[a.current].content)
view.action_insert(c, newword)
view.last_vcommand = vcommand_none
view.dirty = dirty_everything
c.boffset += len(newword)
view.move_cursor_to(c)
view.finalize_action_group()
}
func (a *autocomplete_mode) on_key(ev *termbox.Event) {
g := a.godit
if ev.Mod&termbox.ModAlt != 0 && ev.Ch == '/' {
a.substitute_next()
return
}
g.set_overlay_mode(nil)
g.on_key(ev)
}