+8
-7
data/core/doc/highlighter.lua
+8
-7
data/core/doc/highlighter.lua
···
10
function Highlighter:new(doc)
11
self.doc = doc
12
self.lines = {}
13
-
self.last_valid_line = 1
14
self.max_wanted_line = 0
15
16
-- init incremental syntax highlighting
17
core.add_thread(function()
18
while true do
19
-
if self.last_valid_line > self.max_wanted_line then
20
self.max_wanted_line = 0
21
coroutine.yield(1 / config.fps)
22
23
else
24
-
local max = math.min(self.last_valid_line + 40, self.max_wanted_line)
25
26
-
for i = self.last_valid_line, max do
27
local state = (i > 1) and self.lines[i - 1].state
28
local line = self.lines[i]
29
if not (line and line.init_state == state) then
···
31
end
32
end
33
34
-
self.last_valid_line = max + 1
35
core.redraw = true
36
coroutine.yield()
37
end
···
41
42
43
function Highlighter:invalidate(idx)
44
-
self.last_valid_line = idx
45
end
46
47
···
60
local prev = self.lines[idx - 1]
61
line = self:tokenize_line(idx, prev and prev.state)
62
self.lines[idx] = line
63
-
self.last_valid_line = math.min(self.last_valid_line, idx)
64
end
65
self.max_wanted_line = math.max(self.max_wanted_line, idx)
66
return line
···
10
function Highlighter:new(doc)
11
self.doc = doc
12
self.lines = {}
13
+
self.first_invalid_line = 1
14
self.max_wanted_line = 0
15
16
-- init incremental syntax highlighting
17
core.add_thread(function()
18
while true do
19
+
if self.first_invalid_line > self.max_wanted_line then
20
self.max_wanted_line = 0
21
coroutine.yield(1 / config.fps)
22
23
else
24
+
local max = math.min(self.first_invalid_line + 40, self.max_wanted_line)
25
26
+
for i = self.first_invalid_line, max do
27
local state = (i > 1) and self.lines[i - 1].state
28
local line = self.lines[i]
29
if not (line and line.init_state == state) then
···
31
end
32
end
33
34
+
self.first_invalid_line = max + 1
35
core.redraw = true
36
coroutine.yield()
37
end
···
41
42
43
function Highlighter:invalidate(idx)
44
+
self.first_invalid_line = idx
45
+
self.max_wanted_line = math.min(self.max_wanted_line, #self.doc.lines)
46
end
47
48
···
61
local prev = self.lines[idx - 1]
62
line = self:tokenize_line(idx, prev and prev.state)
63
self.lines[idx] = line
64
+
self.first_invalid_line = math.min(self.first_invalid_line, idx)
65
end
66
self.max_wanted_line = math.max(self.max_wanted_line, idx)
67
return line