highlighter: do not redefine the same groups several times

previously, it could happen that the same highlighting group was defined
several times, because it was available in several modes within
g:airline#theme[mode]. So the second one would always win.

Therefore, loop through all modes in reverse order and define the group
and remember what group has already been defined. If we happen to have
to re-define the same group, skip it. Since we are traversing the list
in reverse order, this should make sure the last definition wins.

This has the benefit of being more performant and hopefully helps with
e.g. #1779 and similar issues.
This commit is contained in:
Christian Brabandt 2018-11-07 14:25:40 +01:00
parent 18200bfad3
commit b7367c605a
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
1 changed files with 27 additions and 3 deletions

View File

@ -22,6 +22,18 @@ function! s:gui2cui(rgb, fallback)
return airline#msdos#round_msdos_colors(rgb) return airline#msdos#round_msdos_colors(rgb)
endfunction endfunction
function! s:group_not_done(list, name)
if index(a:list, a:name) == -1
call add(a:list, a:name)
return 1
else
if &vbs
echomsg printf("airline: group: %s already done, skipping", a:name)
endif
return 0
endif
endfu
function! s:get_syn(group, what) function! s:get_syn(group, what)
if !exists("g:airline_gui_mode") if !exists("g:airline_gui_mode")
let g:airline_gui_mode = airline#init#gui_mode() let g:airline_gui_mode = airline#init#gui_mode()
@ -223,7 +235,11 @@ function! airline#highlighter#highlight(modes, ...)
" draw the base mode, followed by any overrides " draw the base mode, followed by any overrides
let mapped = map(a:modes, 'v:val == a:modes[0] ? v:val : a:modes[0]."_".v:val') let mapped = map(a:modes, 'v:val == a:modes[0] ? v:val : a:modes[0]."_".v:val')
let suffix = a:modes[0] == 'inactive' ? '_inactive' : '' let suffix = a:modes[0] == 'inactive' ? '_inactive' : ''
for mode in mapped let airline_grouplist=[]
" mapped might be something like ['normal', 'normal_modified']
" if a group is in both modes available, only define the second
" that is how this was done previously overwrite the previous definition
for mode in reverse(mapped)
if exists('g:airline#themes#{g:airline_theme}#palette[mode]') if exists('g:airline#themes#{g:airline_theme}#palette[mode]')
let dict = g:airline#themes#{g:airline_theme}#palette[mode] let dict = g:airline#themes#{g:airline_theme}#palette[mode]
for kvp in items(dict) for kvp in items(dict)
@ -232,7 +248,9 @@ function! airline#highlighter#highlight(modes, ...)
if name is# 'airline_c' && !empty(bufnr) && suffix is# '_inactive' if name is# 'airline_c' && !empty(bufnr) && suffix is# '_inactive'
let name = 'airline_c'.bufnr let name = 'airline_c'.bufnr
endif endif
call airline#highlighter#exec(name.suffix, mode_colors) if s:group_not_done(airline_grouplist, name.suffix)
call airline#highlighter#exec(name.suffix, mode_colors)
endif
for accent in keys(s:accents) for accent in keys(s:accents)
if !has_key(p.accents, accent) if !has_key(p.accents, accent)
@ -250,10 +268,16 @@ function! airline#highlighter#highlight(modes, ...)
else else
call add(colors, get(p.accents[accent], 4, '')) call add(colors, get(p.accents[accent], 4, ''))
endif endif
call airline#highlighter#exec(name.suffix.'_'.accent, colors) if s:group_not_done(airline_grouplist, name.suffix.'_'.accent)
call airline#highlighter#exec(name.suffix.'_'.accent, colors)
endif
endfor endfor
endfor endfor
if empty(s:separators)
" nothing to be done
continue
endif
" TODO: optimize this " TODO: optimize this
for sep in items(s:separators) for sep in items(s:separators)
call <sid>exec_separator(dict, sep[1][0], sep[1][1], sep[1][2], suffix) call <sid>exec_separator(dict, sep[1][0], sep[1][1], sep[1][2], suffix)