5
5
--- @field private todos OrgTodosHighlighter
6
6
--- @field private foldtext OrgFoldtextHighlighter
7
7
--- @field private _ephemeral boolean
8
- --- @field private buffers table<number , { language_tree : vim.treesitter.LanguageTree , tree : TSTree } >
8
+ --- @field private buffers table<number , { language_tree : vim.treesitter.LanguageTree | nil , tree : TSTree } >
9
+ --- @field private parsing table<number , boolean>
9
10
local OrgHighlighter = {}
10
11
11
12
function OrgHighlighter :new ()
12
13
local data = {
13
14
namespace = vim .api .nvim_create_namespace (' org_custom_highlighter' ),
14
15
buffers = {},
16
+ parsing = {},
15
17
-- Use ephemeral for highlights. Added to config to allow toggling from tests.
16
18
_ephemeral = true ,
17
19
}
@@ -38,29 +40,57 @@ function OrgHighlighter:_setup()
38
40
})
39
41
end
40
42
41
- function OrgHighlighter :_on_win (_ , _ , bufnr , topline , botline )
43
+ --- @param bufnr number
44
+ --- @param win number
45
+ --- @param range { start_line : number , end_line : number } | false
46
+ function OrgHighlighter :_parse_tree (bufnr , win , range )
47
+ self .parsing [win ] = self .parsing [win ]
48
+ or nil
49
+ == self .buffers [bufnr ].language_tree :parse (range , function (_ , parsed_trees )
50
+ self .buffers [bufnr ].tree = parsed_trees and parsed_trees [1 ]
51
+ if self .parsing [win ] then
52
+ self .parsing [win ] = false
53
+ if vim .api .nvim_win_is_valid (win ) then
54
+ vim .api .nvim__redraw ({ win = win , valid = false , flush = false })
55
+ end
56
+ end
57
+ end )
58
+ end
59
+
60
+ function OrgHighlighter :_on_win (_ , win , bufnr , topline , botline )
42
61
local is_org_buffer = vim .bo [bufnr ].filetype == ' org'
43
62
if not is_org_buffer then
44
63
return false
45
64
end
46
- local parsed_trees = {}
47
65
if not self .buffers [bufnr ] then
48
66
self .buffers [bufnr ] = { language_tree = vim .treesitter .get_parser (bufnr , ' org' ) }
49
- parsed_trees = self . buffers [ bufnr ]. language_tree : parse ( )
67
+ self : _parse_tree ( bufnr , win , false )
50
68
self .buffers [bufnr ].language_tree :register_cbs ({
51
69
on_detach = function (buf )
52
70
self :_on_detach (buf )
53
71
end ,
54
72
})
55
73
else
56
- parsed_trees = self .buffers [bufnr ].language_tree :parse ({ topline , botline + 1 })
74
+ self :_parse_tree (bufnr , win , { topline , botline + 1 })
75
+ if self .parsing [win ] then
76
+ for line = topline , botline do
77
+ self :_on_line_impl (bufnr , line , true )
78
+ end
79
+ return false
80
+ end
57
81
end
58
- self .buffers [bufnr ].tree = parsed_trees and parsed_trees [1 ]
59
82
end
60
83
61
84
function OrgHighlighter :_on_line (_ , _ , bufnr , line )
85
+ self :_on_line_impl (bufnr , line )
86
+ end
87
+
88
+ --- @param bufnr number
89
+ --- @param line number
90
+ --- @param use_cache ? boolean
91
+ function OrgHighlighter :_on_line_impl (bufnr , line , use_cache )
62
92
if self .buffers [bufnr ].tree then
63
- self .markup :on_line (bufnr , line , self .buffers [bufnr ].tree )
93
+ self .markup :on_line (bufnr , line , self .buffers [bufnr ].tree , use_cache )
64
94
self .stars :on_line (bufnr , line )
65
95
self .foldtext :on_line (bufnr , line )
66
96
end
0 commit comments