Skip to content

Commit f629083

Browse files
committed
cache all the derivations
1 parent 7db3656 commit f629083

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

autoload/css_color.vim

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -140,30 +140,24 @@ else
140140
endfunction
141141
endif
142142

143-
let [s:black, s:white] = s:is_gui ? ['#000000', '#ffffff'] : [0, 15]
144-
" picks suitable text color given a background color
145-
function! s:fg_for_bg(color)
146-
" expects a:color already lowercased
147-
let r = s:hex[a:color[0:1]]
148-
let g = s:hex[a:color[2:3]]
149-
let b = s:hex[a:color[4:5]]
150-
return r*30 + g*59 + b*11 > 12000 ? s:black : s:white
151-
endfunction
152-
153-
let s:pattern_color = {}
154-
let s:color_fg = {}
155-
let s:color_prefix = s:is_gui ? 'gui' : 'cterm'
156-
let s:syn_color_calc = s:is_gui ? '"#" . rgb_color' : 's:rgb2xterm(rgb_color)'
143+
let s:pattern_color = {}
144+
let s:color_fg = {}
145+
let s:color_bg = {}
146+
let [s:hi_cmd, s:black, s:white] = s:is_gui
147+
\ ? ['hi %s guibg=#%s guifg=%s', '#000000', '#ffffff']
148+
\ : ['hi %s ctermbg=%s ctermfg=%s', 0, 15]
157149
function! s:create_syn_match()
158150

159151
let pattern = submatch(0)
160152

161153
if has_key( b:has_color_syn_match, pattern ) | return | endif
162154
let b:has_color_syn_match[pattern] = 1
163155

164-
if has_key( s:pattern_color, pattern )
165-
let rgb_color = s:pattern_color[pattern]
166-
let syn_fg_color = s:color_fg[rgb_color]
156+
let rgb_color = get( s:pattern_color, pattern, '' )
157+
158+
if strlen(rgb_color)
159+
let syn_fg = s:color_fg[rgb_color]
160+
let syn_bg = s:color_bg[rgb_color]
167161
else
168162
let funcname = submatch(1)
169163
let hexcolor = submatch(5)
@@ -182,9 +176,20 @@ function! s:create_syn_match()
182176

183177
let s:pattern_color[pattern] = rgb_color
184178

185-
if ! has_key( s:color_fg, rgb_color )
186-
let syn_fg_color = s:fg_for_bg(rgb_color)
187-
let s:color_fg[rgb_color] = syn_fg_color
179+
" check GUI flag early here to avoid pure-overhead caching
180+
let syn_bg = s:is_gui ? rgb_color : get( s:color_bg, rgb_color, '' )
181+
if ! strlen(syn_bg)
182+
let syn_bg = s:rgb2xterm(rgb_color)
183+
let s:color_bg[rgb_color] = syn_bg
184+
endif
185+
186+
let syn_fg = get( s:color_fg, rgb_color, '' )
187+
if ! strlen(syn_fg)
188+
let r = s:hex[rgb_color[0:1]]
189+
let g = s:hex[rgb_color[2:3]]
190+
let b = s:hex[rgb_color[4:5]]
191+
let syn_fg = r*30 + g*59 + b*11 > 12000 ? s:black : s:white
192+
let s:color_fg[rgb_color] = syn_fg
188193
endif
189194
endif
190195

@@ -193,8 +198,7 @@ function! s:create_syn_match()
193198

194199
let group = 'cssColor' . rgb_color
195200
exe 'syn match' group '/'.escape(pattern, '/').'/ contained containedin=@cssColorableGroup'
196-
exe 'let syn_color =' s:syn_color_calc
197-
exe 'hi' group s:color_prefix.'bg='.syn_color s:color_prefix.'fg='.syn_fg_color
201+
exe printf(s:hi_cmd, group, syn_bg, syn_fg)
198202
return ''
199203
endfunction
200204

0 commit comments

Comments
 (0)