55--- @field private todos OrgTodosHighlighter
66--- @field private foldtext OrgFoldtextHighlighter
77--- @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>
910local OrgHighlighter = {}
1011
1112function OrgHighlighter :new ()
1213 local data = {
1314 namespace = vim .api .nvim_create_namespace (' org_custom_highlighter' ),
1415 buffers = {},
16+ parsing = {},
1517 -- Use ephemeral for highlights. Added to config to allow toggling from tests.
1618 _ephemeral = true ,
1719 }
@@ -38,29 +40,57 @@ function OrgHighlighter:_setup()
3840 })
3941end
4042
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 )
4261 local is_org_buffer = vim .bo [bufnr ].filetype == ' org'
4362 if not is_org_buffer then
4463 return false
4564 end
46- local parsed_trees = {}
4765 if not self .buffers [bufnr ] then
4866 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 )
5068 self .buffers [bufnr ].language_tree :register_cbs ({
5169 on_detach = function (buf )
5270 self :_on_detach (buf )
5371 end ,
5472 })
5573 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
5781 end
58- self .buffers [bufnr ].tree = parsed_trees and parsed_trees [1 ]
5982end
6083
6184function 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 )
6292 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 )
6494 self .stars :on_line (bufnr , line )
6595 self .foldtext :on_line (bufnr , line )
6696 end
0 commit comments