1
0

guicolorscheme.vim 8.1 KB

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