@@ -140,30 +140,24 @@ else
140
140
endfunction
141
141
endif
142
142
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 ]
157
149
function ! s: create_syn_match ()
158
150
159
151
let pattern = submatch (0 )
160
152
161
153
if has_key ( b: has_color_syn_match , pattern ) | return | endif
162
154
let b: has_color_syn_match [pattern] = 1
163
155
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]
167
161
else
168
162
let funcname = submatch (1 )
169
163
let hexcolor = submatch (5 )
@@ -182,9 +176,20 @@ function! s:create_syn_match()
182
176
183
177
let s: pattern_color [pattern] = rgb_color
184
178
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
188
193
endif
189
194
endif
190
195
@@ -193,8 +198,7 @@ function! s:create_syn_match()
193
198
194
199
let group = ' cssColor' . rgb_color
195
200
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)
198
202
return ' '
199
203
endfunction
200
204
0 commit comments