3838--- @overload fun ( conf ?: UserIndentConf , meta ?: MetaInfo ): IndentMod
3939local IndentMod = class (BaseMod , constructor )
4040
41- function IndentMod :renderLine (bufnr , lnum , blankLen )
42- local row_opts = {
43- virt_text_pos = " overlay" ,
44- hl_mode = " combine" ,
45- priority = self .conf .priority ,
46- }
47- local render_char_num , offset , shadow_char_num =
48- indentHelper .calc (blankLen , self .meta .leftcol , self .meta .shiftwidth )
49-
50- for i = 1 , render_char_num do
51- local char = self .conf .chars [(i - 1 + shadow_char_num ) % # self .conf .chars + 1 ]
52- local style = self .meta .hl_name_list [(i - 1 + shadow_char_num ) % # self .meta .hl_name_list + 1 ]
53- row_opts .virt_text = { { char , style } }
54- row_opts .virt_text_win_col = offset + (i - 1 ) * self .meta .shiftwidth
55- api .nvim_buf_set_extmark (bufnr , self .meta .ns_id , lnum , 0 , row_opts )
56- end
57- end
58-
5941function IndentMod :render (range )
6042 self :clear (range )
6143
@@ -75,6 +57,7 @@ function IndentMod:render(range)
7557 end
7658 end
7759
60+ -- calculate indent
7861 local retcode , rows_indent = indentHelper .get_rows_indent (Scope (range .bufnr , non_cached_start , non_cached_finish ), {
7962 use_treesitter = self .conf .use_treesitter ,
8063 virt_indent = true ,
@@ -85,11 +68,41 @@ function IndentMod:render(range)
8568 end
8669 return
8770 end
71+
72+ -- update cache
8873 for lnum , indent in pairs (rows_indent ) do
8974 self .meta .cache :set (range .bufnr , lnum , indent )
9075 end
76+
77+ -- calc render info
78+ local row_opts = {
79+ virt_text_pos = " overlay" ,
80+ hl_mode = " combine" ,
81+ priority = self .conf .priority ,
82+ }
83+ local char_num = # self .conf .chars
84+ local style_num = # self .meta .hl_name_list
85+ local render_info = {}
9186 for lnum = range .start , range .finish do
92- self :renderLine (range .bufnr , lnum , self .meta .cache :get (range .bufnr , lnum ))
87+ local blankLen = self .meta .cache :get (range .bufnr , lnum )
88+ local render_char_num , offset , shadow_char_num =
89+ indentHelper .calc (blankLen , self .meta .leftcol , self .meta .shiftwidth )
90+ for i = 1 , render_char_num do
91+ local char = self .conf .chars [(i - 1 + shadow_char_num ) % char_num + 1 ]
92+ local style = self .meta .hl_name_list [(i - 1 + shadow_char_num ) % style_num + 1 ]
93+ table.insert (render_info , {
94+ lnum = lnum ,
95+ virt_text_win_col = offset + self .meta .leftcol + (i - 1 ) * self .meta .shiftwidth ,
96+ virt_text = { { char , style } },
97+ })
98+ end
99+ end
100+
101+ -- render
102+ for _ , v in pairs (render_info ) do
103+ row_opts .virt_text = v .virt_text
104+ row_opts .virt_text_win_col = v .virt_text_win_col
105+ api .nvim_buf_set_extmark (range .bufnr , self .meta .ns_id , v .lnum , 0 , row_opts )
93106 end
94107end
95108
0 commit comments