Features by Gerhard
[shutils.git] / dotfiles / vim / .vim / plugin / guicolorscheme.vim
1 " guicolorscheme.vim: Convert GUI only color schems
2 "
3 " Maintainer: Aaron Griffin <aaron@archlinux.org>
4 " Last Modified: Mon Feb 26 22:52:34 UTC 2007
5 " Version: 1.2
6 " URL: http://www.vim.org/script.php?script_id=39
7 "
8 " Convert a GUI-only colorscheme to support 88 and 256 color terminals
9 " This should also work on the GUI, so using it 100% of the time, assuming
10 " you always have a non 8/16 color terminal should work fine
11
12 " conversion functions {{{
13 " canibalized from desert256.vim
14
15 function! s:greynum(x) "{{{
16 if &t_Co == 88
17 if a:x < 23
18 return 0
19 elseif a:x < 69
20 return 1
21 elseif a:x < 103
22 return 2
23 elseif a:x < 127
24 return 3
25 elseif a:x < 150
26 return 4
27 elseif a:x < 173
28 return 5
29 elseif a:x < 196
30 return 6
31 elseif a:x < 219
32 return 7
33 elseif a:x < 243
34 return 8
35 else
36 return 9
37 endif
38 else
39 if a:x < 14
40 return 0
41 else
42 let l:n = (a:x - 8) / 10
43 let l:m = (a:x - 8) % 10
44 if l:m < 5
45 return l:n
46 else
47 return l:n + 1
48 endif
49 endif
50 endif
51 endfunction "}}}
52 function! s:greylvl(n) "{{{
53 if &t_Co == 88
54 if a:n == 0
55 return 0
56 elseif a:n == 1
57 return 46
58 elseif a:n == 2
59 return 92
60 elseif a:n == 3
61 return 115
62 elseif a:n == 4
63 return 139
64 elseif a:n == 5
65 return 162
66 elseif a:n == 6
67 return 185
68 elseif a:n == 7
69 return 208
70 elseif a:n == 8
71 return 231
72 else
73 return 255
74 endif
75 else
76 if a:n == 0
77 return 0
78 else
79 return 8 + (a:n * 10)
80 endif
81 endif
82 endfunction "}}}
83 function! s:grey(n) "{{{
84 if &t_Co == 88
85 if a:n == 0
86 return 16
87 elseif a:n == 9
88 return 79
89 else
90 return 79 + a:n
91 endif
92 else
93 if a:n == 0
94 return 16
95 elseif a:n == 25
96 return 231
97 else
98 return 231 + a:n
99 endif
100 endif
101 endfunction "}}}
102
103 function! s:rgbnum(x) "{{{
104 if &t_Co == 88
105 if a:x < 69
106 return 0
107 elseif a:x < 172
108 return 1
109 elseif a:x < 230
110 return 2
111 else
112 return 3
113 endif
114 else
115 if a:x < 75
116 return 0
117 else
118 let l:n = (a:x - 55) / 40
119 let l:m = (a:x - 55) % 40
120 if l:m < 20
121 return l:n
122 else
123 return l:n + 1
124 endif
125 endif
126 endif
127 endfunction "}}}
128 function! s:rgblvl(n) "{{{
129 if &t_Co == 88
130 if a:n == 0
131 return 0
132 elseif a:n == 1
133 return 139
134 elseif a:n == 2
135 return 205
136 else
137 return 255
138 endif
139 else
140 if a:n == 0
141 return 0
142 else
143 return 55 + (a:n * 40)
144 endif
145 endif
146 endfunction "}}}
147 function! s:rgb(r, g, b) "{{{
148 if &t_Co == 88
149 return 16 + (a:r * 16) + (a:g * 4) + a:b
150 else
151 return 16 + (a:r * 36) + (a:g * 6) + a:b
152 endif
153 endfunction "}}}
154
155 function! s:color(r, g, b) "{{{
156 " get the closest grey
157 let l:gx = s:greynum(a:r)
158 let l:gy = s:greynum(a:g)
159 let l:gz = s:greynum(a:b)
160
161 " get the closest color
162 let l:x = s:rgbnum(a:r)
163 let l:y = s:rgbnum(a:g)
164 let l:z = s:rgbnum(a:b)
165
166 let l:level = (a:r * a:r) + (a:g * a:g) + (a:b * a:b)
167 if l:gx == l:gy && l:gy == l:gz
168 " there are two possibilities
169 let l:dgr = s:greylvl(l:gx)
170 let l:dgg = s:greylvl(l:gy)
171 let l:dgb = s:greylvl(l:gz)
172 let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) - l:level
173
174 let l:dr = s:rgblvl(l:gx)
175 let l:dg = s:rgblvl(l:gy)
176 let l:db = s:rgblvl(l:gz)
177 let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) - l:level
178
179 if l:dgrey < l:drgb
180 " use the grey
181 return s:grey(l:gx)
182 else
183 " use the color
184 return s:rgb(l:x, l:y, l:z)
185 endif
186 else
187 " only one possibility
188 return s:rgb(l:x, l:y, l:z)
189 endif
190 endfunction "}}}
191 function! s:cindex(rgb) "{{{
192 "convert RRGGBB to a terminal (numeric) index
193 let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0
194 let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0
195 let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0
196
197 return s:color(l:r, l:g, l:b)
198 endfunction "}}}
199
200 function! s:HL(group, fg, bg, attr) "{{{
201 "The main highlight (HL) function
202 exec "hi clear " . a:group
203 if a:fg != ""
204 exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . s:cindex(a:fg)
205 endif
206 if a:bg != ""
207 exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . s:cindex(a:bg)
208 endif
209 if a:attr != ""
210 exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr
211 endif
212 endfunction "}}}
213
214 "}}}
215
216 " Completion Helpers {{{
217 function! s:Colorscheme_Complete(A,L,P)
218 let l:files = split(globpath(&runtimepath, "colors/" . a:A . "*"), "\n")
219 let l:retlist = []
220 for file in l:files
221 let l:basename = substitute(file, ".*/", "", "")
222 let l:basename = substitute(l:basename, "\.vim", "", "")
223 call add(l:retlist, l:basename)
224 endfor
225 return l:retlist
226 endfunction
227
228 function! s:GetColorschemeFile(fname)
229 let l:files = split(globpath(&runtimepath, "colors/" . a:fname . ".vim"), "\n")
230 if len(l:files) == 0
231 echoerr "Colorscheme ".a:fname." not found"
232 return ""
233 else
234 return l:files[0]
235 endif
236 endfunction
237
238 command! -complete=customlist,s:Colorscheme_Complete -nargs=1 GuiColorScheme :call s:GuiColorScheme("<args>")
239 " }}}
240
241 function! s:GuiColorScheme(fname)
242 let l:file = s:GetColorschemeFile(a:fname)
243 if l:file == ""
244 return 1
245 endif
246
247 if has("gui_running")
248 exec "colorscheme " . l:file
249 return 0
250 endif
251
252 for line in readfile(l:file)
253 if line =~ '\s*hi'
254 let l:name = ""
255 let l:fg = ""
256 let l:bg = ""
257 let l:attr = ""
258
259 " get highlight name
260 let l:start = match(line, "hi")
261 let l:end = match(line, "[ \t]", l:start)
262 let l:start = l:end +1
263 let l:end = match(line, "[ \t]", l:start)
264 let l:name = strpart(line, l:start, l:end - l:start)
265
266 " strip foreground color
267 let l:start = match(line, "guifg=")
268 if l:start != -1
269 let l:start = l:start + 6 "strlen(guifg=)
270 let l:end = match(line, "[ \t]", l:start)
271 if l:end == -1
272 let l:fg = strpart(line, l:start)
273 else
274 let l:fg = strpart(line, l:start, l:end - l:start)
275 endif
276 if strpart(l:fg, 0, 1) == "#"
277 let l:fg = strpart(l:fg, 1)
278 endif
279 endif
280
281 " strip background color
282 let l:start = match(line, "guibg=")
283 if l:start != -1
284 let l:start = l:start + 6 "strlen(guibg=)
285 let l:end = match(line, "[ \t]", l:start)
286 if l:end == -1
287 let l:bg = strpart(line, l:start)
288 else
289 let l:bg = strpart(line, l:start, l:end - l:start)
290 endif
291 if strpart(l:bg, 0, 1) == "#"
292 let l:bg = strpart(l:bg, 1)
293 endif
294 endif
295
296 " strip attribute
297 let l:start = match(line, "gui=")
298 if l:start != -1
299 let l:start = l:start + 4 "strlen(gui=)
300 let l:end = match(line, "[ \t]", l:start)
301 if l:end == -1
302 let l:attr = strpart(line, l:start)
303 else
304 let l:attr = strpart(line, l:start, l:end - l:start)
305 endif
306 endif
307
308 call s:HL(l:name, l:fg, l:bg, l:attr)
309 endif
310 endfor
311 endfunction
312
313 " vim:ft=vim:fdl=0:fdm=marker:ts=4:sw=4