Rainbow
[my-vim-dotfolder.git] / plugin / GuiColorScheme.vim
bloba938b5fe2539c31b39eb75f759192fbab13ff6c1
1 " guicolorscheme.vim: Convert GUI only color schems
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
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
12 " conversion functions {{{
13 " canibalized from desert256.vim
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 "}}}
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 "}}}
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)
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)
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
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
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
197     return s:color(l:r, l:g, l:b)
198 endfunction "}}}
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 "}}}
214 "}}}
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
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
238 command! -complete=customlist,s:Colorscheme_Complete -nargs=1 GuiColorScheme :call s:GuiColorScheme("<args>")
239 " }}}
241 function! s:GuiColorScheme(fname)
242     let l:file = s:GetColorschemeFile(a:fname)
243     if l:file == ""
244         return 1
245     endif
247     if has("gui_running")
248         exec "colorscheme " . l:file
249         return 0
250     endif
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 = ""
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)
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
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
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
308             call s:HL(l:name, l:fg, l:bg, l:attr)
309         endif
310     endfor
311 endfunction
313 " vim:ft=vim:fdl=0:fdm=marker:ts=4:sw=4