]> git.r.bdr.sh - rbdr/dotfiles/blob - vim/autoload/Pl/Hi.vim
f6b3eea26eeff419b1e1921a6a31a3f8072e1884
[rbdr/dotfiles] / vim / autoload / Pl / Hi.vim
1 " cterm -> gui color dict {{{
2 let s:cterm2gui_dict = {
3 \ 16: 0x000000, 17: 0x00005f, 18: 0x000087, 19: 0x0000af, 20: 0x0000d7, 21: 0x0000ff,
4 \ 22: 0x005f00, 23: 0x005f5f, 24: 0x005f87, 25: 0x005faf, 26: 0x005fd7, 27: 0x005fff,
5 \ 28: 0x008700, 29: 0x00875f, 30: 0x008787, 31: 0x0087af, 32: 0x0087d7, 33: 0x0087ff,
6 \ 34: 0x00af00, 35: 0x00af5f, 36: 0x00af87, 37: 0x00afaf, 38: 0x00afd7, 39: 0x00afff,
7 \ 40: 0x00d700, 41: 0x00d75f, 42: 0x00d787, 43: 0x00d7af, 44: 0x00d7d7, 45: 0x00d7ff,
8 \ 46: 0x00ff00, 47: 0x00ff5f, 48: 0x00ff87, 49: 0x00ffaf, 50: 0x00ffd7, 51: 0x00ffff,
9 \ 52: 0x5f0000, 53: 0x5f005f, 54: 0x5f0087, 55: 0x5f00af, 56: 0x5f00d7, 57: 0x5f00ff,
10 \ 58: 0x5f5f00, 59: 0x5f5f5f, 60: 0x5f5f87, 61: 0x5f5faf, 62: 0x5f5fd7, 63: 0x5f5fff,
11 \ 64: 0x5f8700, 65: 0x5f875f, 66: 0x5f8787, 67: 0x5f87af, 68: 0x5f87d7, 69: 0x5f87ff,
12 \ 70: 0x5faf00, 71: 0x5faf5f, 72: 0x5faf87, 73: 0x5fafaf, 74: 0x5fafd7, 75: 0x5fafff,
13 \ 76: 0x5fd700, 77: 0x5fd75f, 78: 0x5fd787, 79: 0x5fd7af, 80: 0x5fd7d7, 81: 0x5fd7ff,
14 \ 82: 0x5fff00, 83: 0x5fff5f, 84: 0x5fff87, 85: 0x5fffaf, 86: 0x5fffd7, 87: 0x5fffff,
15 \ 88: 0x870000, 89: 0x87005f, 90: 0x870087, 91: 0x8700af, 92: 0x8700d7, 93: 0x8700ff,
16 \ 94: 0x875f00, 95: 0x875f5f, 96: 0x875f87, 97: 0x875faf, 98: 0x875fd7, 99: 0x875fff,
17 \ 100: 0x878700, 101: 0x87875f, 102: 0x878787, 103: 0x8787af, 104: 0x8787d7, 105: 0x8787ff,
18 \ 106: 0x87af00, 107: 0x87af5f, 108: 0x87af87, 109: 0x87afaf, 110: 0x87afd7, 111: 0x87afff,
19 \ 112: 0x87d700, 113: 0x87d75f, 114: 0x87d787, 115: 0x87d7af, 116: 0x87d7d7, 117: 0x87d7ff,
20 \ 118: 0x87ff00, 119: 0x87ff5f, 120: 0x87ff87, 121: 0x87ffaf, 122: 0x87ffd7, 123: 0x87ffff,
21 \ 124: 0xaf0000, 125: 0xaf005f, 126: 0xaf0087, 127: 0xaf00af, 128: 0xaf00d7, 129: 0xaf00ff,
22 \ 130: 0xaf5f00, 131: 0xaf5f5f, 132: 0xaf5f87, 133: 0xaf5faf, 134: 0xaf5fd7, 135: 0xaf5fff,
23 \ 136: 0xaf8700, 137: 0xaf875f, 138: 0xaf8787, 139: 0xaf87af, 140: 0xaf87d7, 141: 0xaf87ff,
24 \ 142: 0xafaf00, 143: 0xafaf5f, 144: 0xafaf87, 145: 0xafafaf, 146: 0xafafd7, 147: 0xafafff,
25 \ 148: 0xafd700, 149: 0xafd75f, 150: 0xafd787, 151: 0xafd7af, 152: 0xafd7d7, 153: 0xafd7ff,
26 \ 154: 0xafff00, 155: 0xafff5f, 156: 0xafff87, 157: 0xafffaf, 158: 0xafffd7, 159: 0xafffff,
27 \ 160: 0xd70000, 161: 0xd7005f, 162: 0xd70087, 163: 0xd700af, 164: 0xd700d7, 165: 0xd700ff,
28 \ 166: 0xd75f00, 167: 0xd75f5f, 168: 0xd75f87, 169: 0xd75faf, 170: 0xd75fd7, 171: 0xd75fff,
29 \ 172: 0xd78700, 173: 0xd7875f, 174: 0xd78787, 175: 0xd787af, 176: 0xd787d7, 177: 0xd787ff,
30 \ 178: 0xd7af00, 179: 0xd7af5f, 180: 0xd7af87, 181: 0xd7afaf, 182: 0xd7afd7, 183: 0xd7afff,
31 \ 184: 0xd7d700, 185: 0xd7d75f, 186: 0xd7d787, 187: 0xd7d7af, 188: 0xd7d7d7, 189: 0xd7d7ff,
32 \ 190: 0xd7ff00, 191: 0xd7ff5f, 192: 0xd7ff87, 193: 0xd7ffaf, 194: 0xd7ffd7, 195: 0xd7ffff,
33 \ 196: 0xff0000, 197: 0xff005f, 198: 0xff0087, 199: 0xff00af, 200: 0xff00d7, 201: 0xff00ff,
34 \ 202: 0xff5f00, 203: 0xff5f5f, 204: 0xff5f87, 205: 0xff5faf, 206: 0xff5fd7, 207: 0xff5fff,
35 \ 208: 0xff8700, 209: 0xff875f, 210: 0xff8787, 211: 0xff87af, 212: 0xff87d7, 213: 0xff87ff,
36 \ 214: 0xffaf00, 215: 0xffaf5f, 216: 0xffaf87, 217: 0xffafaf, 218: 0xffafd7, 219: 0xffafff,
37 \ 220: 0xffd700, 221: 0xffd75f, 222: 0xffd787, 223: 0xffd7af, 224: 0xffd7d7, 225: 0xffd7ff,
38 \ 226: 0xffff00, 227: 0xffff5f, 228: 0xffff87, 229: 0xffffaf, 230: 0xffffd7, 231: 0xffffff,
39 \ 232: 0x080808, 233: 0x121212, 234: 0x1c1c1c, 235: 0x262626, 236: 0x303030, 237: 0x3a3a3a,
40 \ 238: 0x444444, 239: 0x4e4e4e, 240: 0x585858, 241: 0x626262, 242: 0x6c6c6c, 243: 0x767676,
41 \ 244: 0x808080, 245: 0x8a8a8a, 246: 0x949494, 247: 0x9e9e9e, 248: 0xa8a8a8, 249: 0xb2b2b2,
42 \ 250: 0xbcbcbc, 251: 0xc6c6c6, 252: 0xd0d0d0, 253: 0xdadada, 254: 0xe4e4e4, 255: 0xeeeeee
43 \ }
44 " }}}
45 " Allocated color dict {{{
46 let s:allocated_colors = {
47 \ 'NONE': 'NONE',
48 \ }
49 " }}}
50 function! s:Cterm2GUI(cterm) " {{{
51 if toupper(a:cterm) == 'NONE'
52 return 'NONE'
53 endif
54
55 if ! has_key(s:cterm2gui_dict, a:cterm)
56 return 0xff0000
57 endif
58
59 return s:cterm2gui_dict[a:cterm]
60 endfunction " }}}
61 function! Pl#Hi#Segments(segments, mode_colors) " {{{
62 let mode_translate = {
63 \ 'normal': 'n',
64 \ 'noncurrent': 'N',
65 \ 'insert': 'i',
66 \ 'visual': 'v',
67 \ 'replace': 'r',
68 \ 'select': 's',
69 \ }
70
71 let attributes = ['bold', 'italic', 'underline']
72
73 let segments = a:segments
74 let mode_hi_dict = {}
75
76 " Mode dict
77 for [mode, colors] in items(a:mode_colors)
78 if has_key(mode_translate, mode)
79 let mode = mode_translate[mode]
80 endif
81
82 unlet! fg
83 let fg = s:allocated_colors[colors[0]]
84
85 let hi = {
86 \ 'cterm': [fg['cterm'], ''],
87 \ 'gui' : [fg['gui'], ''],
88 \ 'attr' : []
89 \ }
90
91 if exists('colors[1]')
92 if type(colors[1]) == type([])
93 " We don't have a BG color, but we have attributes
94 let hi.attr = colors[1]
95 else
96 " The second parameter is the background color
97 unlet! bg
98 let bg = s:allocated_colors[colors[1]]
99
100 let hi.cterm[1] = bg['cterm']
101 let hi.gui[1] = bg['gui']
102 endif
103 endif
104
105 if exists('colors[2]') && type(colors[2]) == type([])
106 " The third parameter is always an attribute list
107 let hi.attr = colors[2]
108 endif
109
110 let mode_hi_dict[mode] = {
111 \ 'ctermfg': (empty(hi['cterm'][0]) ? '' : (string(hi['cterm'][0]) == 'NONE' ? 'NONE' : hi['cterm'][0])),
112 \ 'ctermbg': (empty(hi['cterm'][1]) ? '' : (string(hi['cterm'][1]) == 'NONE' ? 'NONE' : hi['cterm'][1])),
113 \ 'guifg' : (empty(hi['gui'][0]) ? '' : (string(hi['gui'][0]) == 'NONE' ? 'NONE' : hi['gui'][0])),
114 \ 'guibg' : (empty(hi['gui'][1]) ? '' : (string(hi['gui'][1]) == 'NONE' ? 'NONE' : hi['gui'][1])),
115 \ 'attr' : (! len(hi['attr']) ? 'NONE' : join(hi['attr'], ','))
116 \ }
117 endfor
118
119 return [segments, mode_hi_dict]
120 endfunction " }}}
121 function! Pl#Hi#Allocate(colors) " {{{
122 for [key, color] in items(a:colors)
123 if type(color) == type(0)
124 " Only terminal color
125 let cterm = color
126 let gui = s:Cterm2GUI(color)
127 elseif type(color) == type([]) && len(color) == 2
128 " Terminal and GUI colors
129 let cterm = color[0]
130 let gui = color[1]
131 endif
132
133 let s:allocated_colors[key] = {
134 \ 'cterm': cterm,
135 \ 'gui': gui,
136 \ }
137
138 unlet! color
139 endfor
140 endfunction " }}}