| 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 " }}} |