dot/.vim/autoload/Colorizer.vim

2596 lines
78 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" Plugin: Highlight Colornames and Values
" Maintainer: Christian Brabandt <cb@256bit.org>
" URL: http://www.github.com/chrisbra/color_highlight
" Last Change: Thu, 15 Jan 2015 21:49:17 +0100
" Licence: Vim License (see :h License)
" Version: 0.11
" GetLatestVimScripts: 3963 11 :AutoInstall: Colorizer.vim
"
" This plugin was inspired by the css_color.vim plugin from Nikolaus Hofer.
" Changes made: - make terminal colors work more reliably and with all
" color terminals
" - performance improvements, coloring is almost instantenously
" - detect rgb colors like this: rgb(R,G,B)
" - detect hvl coloring: hvl(H,V,L)
" - fix small bugs
" - Color ANSI Term values and hide terminal escape sequences
" Init some variables "{{{1
let s:cpo_save = &cpo
set cpo&vim
" the 6 value iterations in the xterm color cube "{{{2
let s:valuerange6 = [ 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF ]
"" the 4 value iterations in the 88 color xterm cube "{{{2
let s:valuerange4 = [ 0x00, 0x8B, 0xCD, 0xFF ]
"
"" 16 basic colors "{{{2
let s:basic16 = [
\ [ 0x00, 0x00, 0x00 ],
\ [ 0xCD, 0x00, 0x00 ],
\ [ 0x00, 0xCD, 0x00 ],
\ [ 0xCD, 0xCD, 0x00 ],
\ [ 0x00, 0x00, 0xEE ],
\ [ 0xCD, 0x00, 0xCD ],
\ [ 0x00, 0xCD, 0xCD ],
\ [ 0xE5, 0xE5, 0xE5 ],
\ [ 0x7F, 0x7F, 0x7F ],
\ [ 0xFF, 0x00, 0x00 ],
\ [ 0x00, 0xFF, 0x00 ],
\ [ 0xFF, 0xFF, 0x00 ],
\ [ 0x5C, 0x5C, 0xFF ],
\ [ 0xFF, 0x00, 0xFF ],
\ [ 0x00, 0xFF, 0xFF ],
\ [ 0xFF, 0xFF, 0xFF ]
\ ]
" Cygwin / Window console / ConEmu has different color codes
if ($ComSpec =~# '^\%(command\.com\|cmd\.exe\)$' &&
\ !s:HasGui()) ||
\ (exists("$ConEmuPID") &&
\ $ConEmuANSI ==# "OFF") ||
\ ($TERM ==# 'cygwin' && &t_Co == 16) " Cygwin terminal
" command.com/ConEmu Color Cube (currently only supports 16 colors)
let s:basic16 = [
\ [ 0x00, 0x00, 0x00 ],
\ [ 0x00, 0x00, 0x80 ],
\ [ 0x00, 0x80, 0x00 ],
\ [ 0x00, 0x80, 0x80 ],
\ [ 0x80, 0x00, 0x00 ],
\ [ 0x80, 0x00, 0x80 ],
\ [ 0xFF, 0xFF, 0x00 ],
\ [ 0xFF, 0xFF, 0xFF ],
\ [ 0xC0, 0xC0, 0xC0 ],
\ [ 0x00, 0x00, 0xFF ],
\ [ 0x00, 0xFF, 0x00 ],
\ [ 0x00, 0xFF, 0xFF ],
\ [ 0xFF, 0x00, 0x00 ],
\ [ 0xFF, 0x00, 0xFF ],
\ [ 0xFF, 0xFF, 0x00 ],
\ [ 0xFF, 0xFF, 0xFF ]
\ ]
let &t_Co=16
endif
" xterm-8 colors "{{{2
let s:xterm_8colors = {
\ 'black': '#000000',
\ 'darkblue': '#00008B',
\ 'darkgreen': '#00CD00',
\ 'darkcyan': '#00CDCD',
\ 'darkred': '#CD0000',
\ 'darkmagenta': '#8B008B',
\ 'brown': '#CDCD00',
\ 'darkyellow': '#CDCD00',
\ 'lightgrey': '#E5E5E5',
\ 'lightgray': '#E5E5E5',
\ 'gray': '#E5E5E5',
\ 'grey': '#E5E5E5'
\ }
" xterm-16 colors "{{{2
let s:xterm_16colors = {
\ 'darkgrey': '#7F7F7F',
\ 'darkgray': '#7F7F7F',
\ 'blue': '#5C5CFF',
\ 'lightblue': '#5C5CFF',
\ 'green': '#00FF00',
\ 'lightgreen': '#00FF00',
\ 'cyan': '#00FFFF',
\ 'lightcyan': '#00FFFF',
\ 'red': '#FF0000',
\ 'lightred': '#FF0000',
\ 'magenta': '#FF00FF',
\ 'lightmagenta': '#FF00FF',
\ 'yellow': '#FFFF00',
\ 'lightyellow': '#FFFF00',
\ 'white': '#FFFFFF',
\ }
" add the items from the 8 color xterm variable to the 16 color xterm
call extend(s:xterm_16colors, s:xterm_8colors)
" W3C Colors "{{{2
let s:w3c_color_names = {
\ 'aliceblue': '#F0F8FF',
\ 'antiquewhite': '#FAEBD7',
\ 'aqua': '#00FFFF',
\ 'aquamarine': '#7FFFD4',
\ 'azure': '#F0FFFF',
\ 'beige': '#F5F5DC',
\ 'bisque': '#FFE4C4',
\ 'black': '#000000',
\ 'blanchedalmond': '#FFEBCD',
\ 'blue': '#0000FF',
\ 'blueviolet': '#8A2BE2',
\ 'brown': '#A52A2A',
\ 'burlywood': '#DEB887',
\ 'cadetblue': '#5F9EA0',
\ 'chartreuse': '#7FFF00',
\ 'chocolate': '#D2691E',
\ 'coral': '#FF7F50',
\ 'cornflowerblue': '#6495ED',
\ 'cornsilk': '#FFF8DC',
\ 'crimson': '#DC143C',
\ 'cyan': '#00FFFF',
\ 'darkblue': '#00008B',
\ 'darkcyan': '#008B8B',
\ 'darkgoldenrod': '#B8860B',
\ 'darkgray': '#A9A9A9',
\ 'darkgreen': '#006400',
\ 'darkkhaki': '#BDB76B',
\ 'darkmagenta': '#8B008B',
\ 'darkolivegreen': '#556B2F',
\ 'darkorange': '#FF8C00',
\ 'darkorchid': '#9932CC',
\ 'darkred': '#8B0000',
\ 'darksalmon': '#E9967A',
\ 'darkseagreen': '#8FBC8F',
\ 'darkslateblue': '#483D8B',
\ 'darkslategray': '#2F4F4F',
\ 'darkturquoise': '#00CED1',
\ 'darkviolet': '#9400D3',
\ 'deeppink': '#FF1493',
\ 'deepskyblue': '#00BFFF',
\ 'dimgray': '#696969',
\ 'dodgerblue': '#1E90FF',
\ 'firebrick': '#B22222',
\ 'floralwhite': '#FFFAF0',
\ 'forestgreen': '#228B22',
\ 'fuchsia': '#FF00FF',
\ 'gainsboro': '#DCDCDC',
\ 'ghostwhite': '#F8F8FF',
\ 'gold': '#FFD700',
\ 'goldenrod': '#DAA520',
\ 'gray': '#808080',
\ 'green': '#008000',
\ 'greenyellow': '#ADFF2F',
\ 'honeydew': '#F0FFF0',
\ 'hotpink': '#FF69B4',
\ 'indianred': '#CD5C5C',
\ 'indigo': '#4B0082',
\ 'ivory': '#FFFFF0',
\ 'khaki': '#F0E68C',
\ 'lavender': '#E6E6FA',
\ 'lavenderblush': '#FFF0F5',
\ 'lawngreen': '#7CFC00',
\ 'lemonchiffon': '#FFFACD',
\ 'lightblue': '#ADD8E6',
\ 'lightcoral': '#F08080',
\ 'lightcyan': '#E0FFFF',
\ 'lightgoldenrodyellow': '#FAFAD2',
\ 'lightgray': '#D3D3D3',
\ 'lightgreen': '#90EE90',
\ 'lightpink': '#FFB6C1',
\ 'lightsalmon': '#FFA07A',
\ 'lightseagreen': '#20B2AA',
\ 'lightskyblue': '#87CEFA',
\ 'lightslategray': '#778899',
\ 'lightsteelblue': '#B0C4DE',
\ 'lightyellow': '#FFFFE0',
\ 'lime': '#00FF00',
\ 'limegreen': '#32CD32',
\ 'linen': '#FAF0E6',
\ 'magenta': '#FF00FF',
\ 'maroon': '#800000',
\ 'mediumaquamarine': '#66CDAA',
\ 'mediumblue': '#0000CD',
\ 'mediumorchid': '#BA55D3',
\ 'mediumpurple': '#9370D8',
\ 'mediumseagreen': '#3CB371',
\ 'mediumslateblue': '#7B68EE',
\ 'mediumspringgreen': '#00FA9A',
\ 'mediumturquoise': '#48D1CC',
\ 'mediumvioletred': '#C71585',
\ 'midnightblue': '#191970',
\ 'mintcream': '#F5FFFA',
\ 'mistyrose': '#FFE4E1',
\ 'moccasin': '#FFE4B5',
\ 'navajowhite': '#FFDEAD',
\ 'navy': '#000080',
\ 'oldlace': '#FDF5E6',
\ 'olive': '#808000',
\ 'olivedrab': '#6B8E23',
\ 'orange': '#FFA500',
\ 'orangered': '#FF4500',
\ 'orchid': '#DA70D6',
\ 'palegoldenrod': '#EEE8AA',
\ 'palegreen': '#98FB98',
\ 'paleturquoise': '#AFEEEE',
\ 'palevioletred': '#D87093',
\ 'papayawhip': '#FFEFD5',
\ 'peachpuff': '#FFDAB9',
\ 'peru': '#CD853F',
\ 'pink': '#FFC0CB',
\ 'plum': '#DDA0DD',
\ 'powderblue': '#B0E0E6',
\ 'purple': '#800080',
\ 'red': '#FF0000',
\ 'rosybrown': '#BC8F8F',
\ 'royalblue': '#4169E1',
\ 'saddlebrown': '#8B4513',
\ 'salmon': '#FA8072',
\ 'sandybrown': '#F4A460',
\ 'seagreen': '#2E8B57',
\ 'seashell': '#FFF5EE',
\ 'sienna': '#A0522D',
\ 'silver': '#C0C0C0',
\ 'skyblue': '#87CEEB',
\ 'slateblue': '#6A5ACD',
\ 'slategray': '#708090',
\ 'snow': '#FFFAFA',
\ 'springgreen': '#00FF7F',
\ 'steelblue': '#4682B4',
\ 'tan': '#D2B48C',
\ 'teal': '#008080',
\ 'thistle': '#D8BFD8',
\ 'tomato': '#FF6347',
\ 'turquoise': '#40E0D0',
\ 'violet': '#EE82EE',
\ 'wheat': '#F5DEB3',
\ 'white': '#FFFFFF',
\ 'whitesmoke': '#F5F5F5',
\ 'yellow': '#FFFF00',
\ 'yellowgreen': '#9ACD32'
\ }
" X11 color names taken from "{{{2
" http://cvsweb.xfree86.org/cvsweb/*checkout*/xc/programs/rgb/rgb.txt?rev=1.2
let s:x11_color_names = {
\ 'snow': '#FFFAFA',
\ 'ghostwhite': '#F8F8FF',
\ 'whitesmoke': '#F5F5F5',
\ 'gainsboro': '#DCDCDC',
\ 'floralwhite': '#FFFAF0',
\ 'oldlace': '#FDF5E6',
\ 'linen': '#FAF0E6',
\ 'antiquewhite': '#FAEBD7',
\ 'papayawhip': '#FFEFD5',
\ 'blanchedalmond': '#FFEBCD',
\ 'bisque': '#FFE4C4',
\ 'peachpuff': '#FFDAB9',
\ 'navajowhite': '#FFDEAD',
\ 'moccasin': '#FFE4B5',
\ 'cornsilk': '#FFF8DC',
\ 'ivory': '#FFFFF0',
\ 'lemonchiffon': '#FFFACD',
\ 'seashell': '#FFF5EE',
\ 'honeydew': '#F0FFF0',
\ 'mintcream': '#F5FFFA',
\ 'azure': '#F0FFFF',
\ 'aliceblue': '#F0F8FF',
\ 'lavender': '#E6E6FA',
\ 'lavenderblush': '#FFF0F5',
\ 'mistyrose': '#FFE4E1',
\ 'white': '#FFFFFF',
\ 'black': '#000000',
\ 'darkslategray': '#2F4F4F',
\ 'darkslategrey': '#2F4F4F',
\ 'dimgray': '#696969',
\ 'dimgrey': '#696969',
\ 'slategray': '#708090',
\ 'slategrey': '#708090',
\ 'lightslategray': '#778899',
\ 'lightslategrey': '#778899',
\ 'gray': '#BEBEBE',
\ 'grey': '#BEBEBE',
\ 'lightgrey': '#D3D3D3',
\ 'lightgray': '#D3D3D3',
\ 'midnightblue': '#191970',
\ 'navy': '#000080',
\ 'navyblue': '#000080',
\ 'cornflowerblue': '#6495ED',
\ 'darkslateblue': '#483D8B',
\ 'slateblue': '#6A5ACD',
\ 'mediumslateblue': '#7B68EE',
\ 'lightslateblue': '#8470FF',
\ 'mediumblue': '#0000CD',
\ 'royalblue': '#4169E1',
\ 'blue': '#0000FF',
\ 'dodgerblue': '#1E90FF',
\ 'deepskyblue': '#00BFFF',
\ 'skyblue': '#87CEEB',
\ 'lightskyblue': '#87CEFA',
\ 'steelblue': '#4682B4',
\ 'lightsteelblue': '#B0C4DE',
\ 'lightblue': '#ADD8E6',
\ 'powderblue': '#B0E0E6',
\ 'paleturquoise': '#AFEEEE',
\ 'darkturquoise': '#00CED1',
\ 'mediumturquoise': '#48D1CC',
\ 'turquoise': '#40E0D0',
\ 'cyan': '#00FFFF',
\ 'lightcyan': '#E0FFFF',
\ 'cadetblue': '#5F9EA0',
\ 'mediumaquamarine': '#66CDAA',
\ 'aquamarine': '#7FFFD4',
\ 'darkgreen': '#006400',
\ 'darkolivegreen': '#556B2F',
\ 'darkseagreen': '#8FBC8F',
\ 'seagreen': '#2E8B57',
\ 'mediumseagreen': '#3CB371',
\ 'lightseagreen': '#20B2AA',
\ 'palegreen': '#98FB98',
\ 'springgreen': '#00FF7F',
\ 'lawngreen': '#7CFC00',
\ 'green': '#00FF00',
\ 'chartreuse': '#7FFF00',
\ 'mediumspringgreen': '#00FA9A',
\ 'greenyellow': '#ADFF2F',
\ 'limegreen': '#32CD32',
\ 'yellowgreen': '#9ACD32',
\ 'forestgreen': '#228B22',
\ 'olivedrab': '#6B8E23',
\ 'darkkhaki': '#BDB76B',
\ 'khaki': '#F0E68C',
\ 'palegoldenrod': '#EEE8AA',
\ 'lightgoldenrodyellow': '#FAFAD2',
\ 'lightyellow': '#FFFFE0',
\ 'yellow': '#FFFF00',
\ 'gold': '#FFD700',
\ 'lightgoldenrod': '#EEDD82',
\ 'goldenrod': '#DAA520',
\ 'darkgoldenrod': '#B8860B',
\ 'rosybrown': '#BC8F8F',
\ 'indianred': '#CD5C5C',
\ 'saddlebrown': '#8B4513',
\ 'sienna': '#A0522D',
\ 'peru': '#CD853F',
\ 'burlywood': '#DEB887',
\ 'beige': '#F5F5DC',
\ 'wheat': '#F5DEB3',
\ 'sandybrown': '#F4A460',
\ 'tan': '#D2B48C',
\ 'chocolate': '#D2691E',
\ 'firebrick': '#B22222',
\ 'brown': '#A52A2A',
\ 'darksalmon': '#E9967A',
\ 'salmon': '#FA8072',
\ 'lightsalmon': '#FFA07A',
\ 'orange': '#FFA500',
\ 'darkorange': '#FF8C00',
\ 'coral': '#FF7F50',
\ 'lightcoral': '#F08080',
\ 'tomato': '#FF6347',
\ 'orangered': '#FF4500',
\ 'red': '#FF0000',
\ 'hotpink': '#FF69B4',
\ 'deeppink': '#FF1493',
\ 'pink': '#FFC0CB',
\ 'lightpink': '#FFB6C1',
\ 'palevioletred': '#DB7093',
\ 'maroon': '#B03060',
\ 'mediumvioletred': '#C71585',
\ 'violetred': '#D02090',
\ 'magenta': '#FF00FF',
\ 'violet': '#EE82EE',
\ 'plum': '#DDA0DD',
\ 'orchid': '#DA70D6',
\ 'mediumorchid': '#BA55D3',
\ 'darkorchid': '#9932CC',
\ 'darkviolet': '#9400D3',
\ 'blueviolet': '#8A2BE2',
\ 'purple': '#A020F0',
\ 'mediumpurple': '#9370DB',
\ 'thistle': '#D8BFD8',
\ 'snow1': '#FFFAFA',
\ 'snow2': '#EEE9E9',
\ 'snow3': '#CDC9C9',
\ 'snow4': '#8B8989',
\ 'seashell1': '#FFF5EE',
\ 'seashell2': '#EEE5DE',
\ 'seashell3': '#CDC5BF',
\ 'seashell4': '#8B8682',
\ 'antiquewhite1': '#FFEFDB',
\ 'antiquewhite2': '#EEDFCC',
\ 'antiquewhite3': '#CDC0B0',
\ 'antiquewhite4': '#8B8378',
\ 'bisque1': '#FFE4C4',
\ 'bisque2': '#EED5B7',
\ 'bisque3': '#CDB79E',
\ 'bisque4': '#8B7D6B',
\ 'peachpuff1': '#FFDAB9',
\ 'peachpuff2': '#EECBAD',
\ 'peachpuff3': '#CDAF95',
\ 'peachpuff4': '#8B7765',
\ 'navajowhite1': '#FFDEAD',
\ 'navajowhite2': '#EECFA1',
\ 'navajowhite3': '#CDB38B',
\ 'navajowhite4': '#8B795E',
\ 'lemonchiffon1': '#FFFACD',
\ 'lemonchiffon2': '#EEE9BF',
\ 'lemonchiffon3': '#CDC9A5',
\ 'lemonchiffon4': '#8B8970',
\ 'cornsilk1': '#FFF8DC',
\ 'cornsilk2': '#EEE8CD',
\ 'cornsilk3': '#CDC8B1',
\ 'cornsilk4': '#8B8878',
\ 'ivory1': '#FFFFF0',
\ 'ivory2': '#EEEEE0',
\ 'ivory3': '#CDCDC1',
\ 'ivory4': '#8B8B83',
\ 'honeydew1': '#F0FFF0',
\ 'honeydew2': '#E0EEE0',
\ 'honeydew3': '#C1CDC1',
\ 'honeydew4': '#838B83',
\ 'lavenderblush1': '#FFF0F5',
\ 'lavenderblush2': '#EEE0E5',
\ 'lavenderblush3': '#CDC1C5',
\ 'lavenderblush4': '#8B8386',
\ 'mistyrose1': '#FFE4E1',
\ 'mistyrose2': '#EED5D2',
\ 'mistyrose3': '#CDB7B5',
\ 'mistyrose4': '#8B7D7B',
\ 'azure1': '#F0FFFF',
\ 'azure2': '#E0EEEE',
\ 'azure3': '#C1CDCD',
\ 'azure4': '#838B8B',
\ 'slateblue1': '#836FFF',
\ 'slateblue2': '#7A67EE',
\ 'slateblue3': '#6959CD',
\ 'slateblue4': '#473C8B',
\ 'royalblue1': '#4876FF',
\ 'royalblue2': '#436EEE',
\ 'royalblue3': '#3A5FCD',
\ 'royalblue4': '#27408B',
\ 'blue1': '#0000FF',
\ 'blue2': '#0000EE',
\ 'blue3': '#0000CD',
\ 'blue4': '#00008B',
\ 'dodgerblue1': '#1E90FF',
\ 'dodgerblue2': '#1C86EE',
\ 'dodgerblue3': '#1874CD',
\ 'dodgerblue4': '#104E8B',
\ 'steelblue1': '#63B8FF',
\ 'steelblue2': '#5CACEE',
\ 'steelblue3': '#4F94CD',
\ 'steelblue4': '#36648B',
\ 'deepskyblue1': '#00BFFF',
\ 'deepskyblue2': '#00B2EE',
\ 'deepskyblue3': '#009ACD',
\ 'deepskyblue4': '#00688B',
\ 'skyblue1': '#87CEFF',
\ 'skyblue2': '#7EC0EE',
\ 'skyblue3': '#6CA6CD',
\ 'skyblue4': '#4A708B',
\ 'lightskyblue1': '#B0E2FF',
\ 'lightskyblue2': '#A4D3EE',
\ 'lightskyblue3': '#8DB6CD',
\ 'lightskyblue4': '#607B8B',
\ 'slategray1': '#C6E2FF',
\ 'slategray2': '#B9D3EE',
\ 'slategray3': '#9FB6CD',
\ 'slategray4': '#6C7B8B',
\ 'lightsteelblue1': '#CAE1FF',
\ 'lightsteelblue2': '#BCD2EE',
\ 'lightsteelblue3': '#A2B5CD',
\ 'lightsteelblue4': '#6E7B8B',
\ 'lightblue1': '#BFEFFF',
\ 'lightblue2': '#B2DFEE',
\ 'lightblue3': '#9AC0CD',
\ 'lightblue4': '#68838B',
\ 'lightcyan1': '#E0FFFF',
\ 'lightcyan2': '#D1EEEE',
\ 'lightcyan3': '#B4CDCD',
\ 'lightcyan4': '#7A8B8B',
\ 'paleturquoise1': '#BBFFFF',
\ 'paleturquoise2': '#AEEEEE',
\ 'paleturquoise3': '#96CDCD',
\ 'paleturquoise4': '#668B8B',
\ 'cadetblue1': '#98F5FF',
\ 'cadetblue2': '#8EE5EE',
\ 'cadetblue3': '#7AC5CD',
\ 'cadetblue4': '#53868B',
\ 'turquoise1': '#00F5FF',
\ 'turquoise2': '#00E5EE',
\ 'turquoise3': '#00C5CD',
\ 'turquoise4': '#00868B',
\ 'cyan1': '#00FFFF',
\ 'cyan2': '#00EEEE',
\ 'cyan3': '#00CDCD',
\ 'cyan4': '#008B8B',
\ 'darkslategray1': '#97FFFF',
\ 'darkslategray2': '#8DEEEE',
\ 'darkslategray3': '#79CDCD',
\ 'darkslategray4': '#528B8B',
\ 'aquamarine1': '#7FFFD4',
\ 'aquamarine2': '#76EEC6',
\ 'aquamarine3': '#66CDAA',
\ 'aquamarine4': '#458B74',
\ 'darkseagreen1': '#C1FFC1',
\ 'darkseagreen2': '#B4EEB4',
\ 'darkseagreen3': '#9BCD9B',
\ 'darkseagreen4': '#698B69',
\ 'seagreen1': '#54FF9F',
\ 'seagreen2': '#4EEE94',
\ 'seagreen3': '#43CD80',
\ 'seagreen4': '#2E8B57',
\ 'palegreen1': '#9AFF9A',
\ 'palegreen2': '#90EE90',
\ 'palegreen3': '#7CCD7C',
\ 'palegreen4': '#548B54',
\ 'springgreen1': '#00FF7F',
\ 'springgreen2': '#00EE76',
\ 'springgreen3': '#00CD66',
\ 'springgreen4': '#008B45',
\ 'green1': '#00FF00',
\ 'green2': '#00EE00',
\ 'green3': '#00CD00',
\ 'green4': '#008B00',
\ 'chartreuse1': '#7FFF00',
\ 'chartreuse2': '#76EE00',
\ 'chartreuse3': '#66CD00',
\ 'chartreuse4': '#458B00',
\ 'olivedrab1': '#C0FF3E',
\ 'olivedrab2': '#B3EE3A',
\ 'olivedrab3': '#9ACD32',
\ 'olivedrab4': '#698B22',
\ 'darkolivegreen1': '#CAFF70',
\ 'darkolivegreen2': '#BCEE68',
\ 'darkolivegreen3': '#A2CD5A',
\ 'darkolivegreen4': '#6E8B3D',
\ 'khaki1': '#FFF68F',
\ 'khaki2': '#EEE685',
\ 'khaki3': '#CDC673',
\ 'khaki4': '#8B864E',
\ 'lightgoldenrod1': '#FFEC8B',
\ 'lightgoldenrod2': '#EEDC82',
\ 'lightgoldenrod3': '#CDBE70',
\ 'lightgoldenrod4': '#8B814C',
\ 'lightyellow1': '#FFFFE0',
\ 'lightyellow2': '#EEEED1',
\ 'lightyellow3': '#CDCDB4',
\ 'lightyellow4': '#8B8B7A',
\ 'yellow1': '#FFFF00',
\ 'yellow2': '#EEEE00',
\ 'yellow3': '#CDCD00',
\ 'yellow4': '#8B8B00',
\ 'gold1': '#FFD700',
\ 'gold2': '#EEC900',
\ 'gold3': '#CDAD00',
\ 'gold4': '#8B7500',
\ 'goldenrod1': '#FFC125',
\ 'goldenrod2': '#EEB422',
\ 'goldenrod3': '#CD9B1D',
\ 'goldenrod4': '#8B6914',
\ 'darkgoldenrod1': '#FFB90F',
\ 'darkgoldenrod2': '#EEAD0E',
\ 'darkgoldenrod3': '#CD950C',
\ 'darkgoldenrod4': '#8B6508',
\ 'rosybrown1': '#FFC1C1',
\ 'rosybrown2': '#EEB4B4',
\ 'rosybrown3': '#CD9B9B',
\ 'rosybrown4': '#8B6969',
\ 'indianred1': '#FF6A6A',
\ 'indianred2': '#EE6363',
\ 'indianred3': '#CD5555',
\ 'indianred4': '#8B3A3A',
\ 'sienna1': '#FF8247',
\ 'sienna2': '#EE7942',
\ 'sienna3': '#CD6839',
\ 'sienna4': '#8B4726',
\ 'burlywood1': '#FFD39B',
\ 'burlywood2': '#EEC591',
\ 'burlywood3': '#CDAA7D',
\ 'burlywood4': '#8B7355',
\ 'wheat1': '#FFE7BA',
\ 'wheat2': '#EED8AE',
\ 'wheat3': '#CDBA96',
\ 'wheat4': '#8B7E66',
\ 'tan1': '#FFA54F',
\ 'tan2': '#EE9A49',
\ 'tan3': '#CD853F',
\ 'tan4': '#8B5A2B',
\ 'chocolate1': '#FF7F24',
\ 'chocolate2': '#EE7621',
\ 'chocolate3': '#CD661D',
\ 'chocolate4': '#8B4513',
\ 'firebrick1': '#FF3030',
\ 'firebrick2': '#EE2C2C',
\ 'firebrick3': '#CD2626',
\ 'firebrick4': '#8B1A1A',
\ 'brown1': '#FF4040',
\ 'brown2': '#EE3B3B',
\ 'brown3': '#CD3333',
\ 'brown4': '#8B2323',
\ 'salmon1': '#FF8C69',
\ 'salmon2': '#EE8262',
\ 'salmon3': '#CD7054',
\ 'salmon4': '#8B4C39',
\ 'lightsalmon1': '#FFA07A',
\ 'lightsalmon2': '#EE9572',
\ 'lightsalmon3': '#CD8162',
\ 'lightsalmon4': '#8B5742',
\ 'orange1': '#FFA500',
\ 'orange2': '#EE9A00',
\ 'orange3': '#CD8500',
\ 'orange4': '#8B5A00',
\ 'darkorange1': '#FF7F00',
\ 'darkorange2': '#EE7600',
\ 'darkorange3': '#CD6600',
\ 'darkorange4': '#8B4500',
\ 'coral1': '#FF7256',
\ 'coral2': '#EE6A50',
\ 'coral3': '#CD5B45',
\ 'coral4': '#8B3E2F',
\ 'tomato1': '#FF6347',
\ 'tomato2': '#EE5C42',
\ 'tomato3': '#CD4F39',
\ 'tomato4': '#8B3626',
\ 'orangered1': '#FF4500',
\ 'orangered2': '#EE4000',
\ 'orangered3': '#CD3700',
\ 'orangered4': '#8B2500',
\ 'red1': '#FF0000',
\ 'red2': '#EE0000',
\ 'red3': '#CD0000',
\ 'red4': '#8B0000',
\ 'deeppink1': '#FF1493',
\ 'deeppink2': '#EE1289',
\ 'deeppink3': '#CD1076',
\ 'deeppink4': '#8B0A50',
\ 'hotpink1': '#FF6EB4',
\ 'hotpink2': '#EE6AA7',
\ 'hotpink3': '#CD6090',
\ 'hotpink4': '#8B3A62',
\ 'pink1': '#FFB5C5',
\ 'pink2': '#EEA9B8',
\ 'pink3': '#CD919E',
\ 'pink4': '#8B636C',
\ 'lightpink1': '#FFAEB9',
\ 'lightpink2': '#EEA2AD',
\ 'lightpink3': '#CD8C95',
\ 'lightpink4': '#8B5F65',
\ 'palevioletred1': '#FF82AB',
\ 'palevioletred2': '#EE799F',
\ 'palevioletred3': '#CD6889',
\ 'palevioletred4': '#8B475D',
\ 'maroon1': '#FF34B3',
\ 'maroon2': '#EE30A7',
\ 'maroon3': '#CD2990',
\ 'maroon4': '#8B1C62',
\ 'violetred1': '#FF3E96',
\ 'violetred2': '#EE3A8C',
\ 'violetred3': '#CD3278',
\ 'violetred4': '#8B2252',
\ 'magenta1': '#FF00FF',
\ 'magenta2': '#EE00EE',
\ 'magenta3': '#CD00CD',
\ 'magenta4': '#8B008B',
\ 'orchid1': '#FF83FA',
\ 'orchid2': '#EE7AE9',
\ 'orchid3': '#CD69C9',
\ 'orchid4': '#8B4789',
\ 'plum1': '#FFBBFF',
\ 'plum2': '#EEAEEE',
\ 'plum3': '#CD96CD',
\ 'plum4': '#8B668B',
\ 'mediumorchid1': '#E066FF',
\ 'mediumorchid2': '#D15FEE',
\ 'mediumorchid3': '#B452CD',
\ 'mediumorchid4': '#7A378B',
\ 'darkorchid1': '#BF3EFF',
\ 'darkorchid2': '#B23AEE',
\ 'darkorchid3': '#9A32CD',
\ 'darkorchid4': '#68228B',
\ 'purple1': '#9B30FF',
\ 'purple2': '#912CEE',
\ 'purple3': '#7D26CD',
\ 'purple4': '#551A8B',
\ 'mediumpurple1': '#AB82FF',
\ 'mediumpurple2': '#9F79EE',
\ 'mediumpurple3': '#8968CD',
\ 'mediumpurple4': '#5D478B',
\ 'thistle1': '#FFE1FF',
\ 'thistle2': '#EED2EE',
\ 'thistle3': '#CDB5CD',
\ 'thistle4': '#8B7B8B',
\ 'gray0': '#000000',
\ 'grey0': '#000000',
\ 'gray1': '#030303',
\ 'grey1': '#030303',
\ 'gray2': '#050505',
\ 'grey2': '#050505',
\ 'gray3': '#080808',
\ 'grey3': '#080808',
\ 'gray4': '#0A0A0A',
\ 'grey4': '#0A0A0A',
\ 'gray5': '#0D0D0D',
\ 'grey5': '#0D0D0D',
\ 'gray6': '#0F0F0F',
\ 'grey6': '#0F0F0F',
\ 'gray7': '#121212',
\ 'grey7': '#121212',
\ 'gray8': '#141414',
\ 'grey8': '#141414',
\ 'gray9': '#171717',
\ 'grey9': '#171717',
\ 'gray10': '#1A1A1A',
\ 'grey10': '#1A1A1A',
\ 'gray11': '#1C1C1C',
\ 'grey11': '#1C1C1C',
\ 'gray12': '#1F1F1F',
\ 'grey12': '#1F1F1F',
\ 'gray13': '#212121',
\ 'grey13': '#212121',
\ 'gray14': '#242424',
\ 'grey14': '#242424',
\ 'gray15': '#262626',
\ 'grey15': '#262626',
\ 'gray16': '#292929',
\ 'grey16': '#292929',
\ 'gray17': '#2B2B2B',
\ 'grey17': '#2B2B2B',
\ 'gray18': '#2E2E2E',
\ 'grey18': '#2E2E2E',
\ 'gray19': '#303030',
\ 'grey19': '#303030',
\ 'gray20': '#333333',
\ 'grey20': '#333333',
\ 'gray21': '#363636',
\ 'grey21': '#363636',
\ 'gray22': '#383838',
\ 'grey22': '#383838',
\ 'gray23': '#3B3B3B',
\ 'grey23': '#3B3B3B',
\ 'gray24': '#3D3D3D',
\ 'grey24': '#3D3D3D',
\ 'gray25': '#404040',
\ 'grey25': '#404040',
\ 'gray26': '#424242',
\ 'grey26': '#424242',
\ 'gray27': '#454545',
\ 'grey27': '#454545',
\ 'gray28': '#474747',
\ 'grey28': '#474747',
\ 'gray29': '#4A4A4A',
\ 'grey29': '#4A4A4A',
\ 'gray30': '#4D4D4D',
\ 'grey30': '#4D4D4D',
\ 'gray31': '#4F4F4F',
\ 'grey31': '#4F4F4F',
\ 'gray32': '#525252',
\ 'grey32': '#525252',
\ 'gray33': '#545454',
\ 'grey33': '#545454',
\ 'gray34': '#575757',
\ 'grey34': '#575757',
\ 'gray35': '#595959',
\ 'grey35': '#595959',
\ 'gray36': '#5C5C5C',
\ 'grey36': '#5C5C5C',
\ 'gray37': '#5E5E5E',
\ 'grey37': '#5E5E5E',
\ 'gray38': '#616161',
\ 'grey38': '#616161',
\ 'gray39': '#636363',
\ 'grey39': '#636363',
\ 'gray40': '#666666',
\ 'grey40': '#666666',
\ 'gray41': '#696969',
\ 'grey41': '#696969',
\ 'gray42': '#6B6B6B',
\ 'grey42': '#6B6B6B',
\ 'gray43': '#6E6E6E',
\ 'grey43': '#6E6E6E',
\ 'gray44': '#707070',
\ 'grey44': '#707070',
\ 'gray45': '#737373',
\ 'grey45': '#737373',
\ 'gray46': '#757575',
\ 'grey46': '#757575',
\ 'gray47': '#787878',
\ 'grey47': '#787878',
\ 'gray48': '#7A7A7A',
\ 'grey48': '#7A7A7A',
\ 'gray49': '#7D7D7D',
\ 'grey49': '#7D7D7D',
\ 'gray50': '#7F7F7F',
\ 'grey50': '#7F7F7F',
\ 'gray51': '#828282',
\ 'grey51': '#828282',
\ 'gray52': '#858585',
\ 'grey52': '#858585',
\ 'gray53': '#878787',
\ 'grey53': '#878787',
\ 'gray54': '#8A8A8A',
\ 'grey54': '#8A8A8A',
\ 'gray55': '#8C8C8C',
\ 'grey55': '#8C8C8C',
\ 'gray56': '#8F8F8F',
\ 'grey56': '#8F8F8F',
\ 'gray57': '#919191',
\ 'grey57': '#919191',
\ 'gray58': '#949494',
\ 'grey58': '#949494',
\ 'gray59': '#969696',
\ 'grey59': '#969696',
\ 'gray60': '#999999',
\ 'grey60': '#999999',
\ 'gray61': '#9C9C9C',
\ 'grey61': '#9C9C9C',
\ 'gray62': '#9E9E9E',
\ 'grey62': '#9E9E9E',
\ 'gray63': '#A1A1A1',
\ 'grey63': '#A1A1A1',
\ 'gray64': '#A3A3A3',
\ 'grey64': '#A3A3A3',
\ 'gray65': '#A6A6A6',
\ 'grey65': '#A6A6A6',
\ 'gray66': '#A8A8A8',
\ 'grey66': '#A8A8A8',
\ 'gray67': '#ABABAB',
\ 'grey67': '#ABABAB',
\ 'gray68': '#ADADAD',
\ 'grey68': '#ADADAD',
\ 'gray69': '#B0B0B0',
\ 'grey69': '#B0B0B0',
\ 'gray70': '#B3B3B3',
\ 'grey70': '#B3B3B3',
\ 'gray71': '#B5B5B5',
\ 'grey71': '#B5B5B5',
\ 'gray72': '#B8B8B8',
\ 'grey72': '#B8B8B8',
\ 'gray73': '#BABABA',
\ 'grey73': '#BABABA',
\ 'gray74': '#BDBDBD',
\ 'grey74': '#BDBDBD',
\ 'gray75': '#BFBFBF',
\ 'grey75': '#BFBFBF',
\ 'gray76': '#C2C2C2',
\ 'grey76': '#C2C2C2',
\ 'gray77': '#C4C4C4',
\ 'grey77': '#C4C4C4',
\ 'gray78': '#C7C7C7',
\ 'grey78': '#C7C7C7',
\ 'gray79': '#C9C9C9',
\ 'grey79': '#C9C9C9',
\ 'gray80': '#CCCCCC',
\ 'grey80': '#CCCCCC',
\ 'gray81': '#CFCFCF',
\ 'grey81': '#CFCFCF',
\ 'gray82': '#D1D1D1',
\ 'grey82': '#D1D1D1',
\ 'gray83': '#D4D4D4',
\ 'grey83': '#D4D4D4',
\ 'gray84': '#D6D6D6',
\ 'grey84': '#D6D6D6',
\ 'gray85': '#D9D9D9',
\ 'grey85': '#D9D9D9',
\ 'gray86': '#DBDBDB',
\ 'grey86': '#DBDBDB',
\ 'gray87': '#DEDEDE',
\ 'grey87': '#DEDEDE',
\ 'gray88': '#E0E0E0',
\ 'grey88': '#E0E0E0',
\ 'gray89': '#E3E3E3',
\ 'grey89': '#E3E3E3',
\ 'gray90': '#E5E5E5',
\ 'grey90': '#E5E5E5',
\ 'gray91': '#E8E8E8',
\ 'grey91': '#E8E8E8',
\ 'gray92': '#EBEBEB',
\ 'grey92': '#EBEBEB',
\ 'gray93': '#EDEDED',
\ 'grey93': '#EDEDED',
\ 'gray94': '#F0F0F0',
\ 'grey94': '#F0F0F0',
\ 'gray95': '#F2F2F2',
\ 'grey95': '#F2F2F2',
\ 'gray96': '#F5F5F5',
\ 'grey96': '#F5F5F5',
\ 'gray97': '#F7F7F7',
\ 'grey97': '#F7F7F7',
\ 'gray98': '#FAFAFA',
\ 'grey98': '#FAFAFA',
\ 'gray99': '#FCFCFC',
\ 'grey99': '#FCFCFC',
\ 'gray100': '#FFFFFF',
\ 'grey100': '#FFFFFF',
\ 'darkgrey': '#A9A9A9',
\ 'darkgray': '#A9A9A9',
\ 'darkblue': '#00008B',
\ 'darkcyan': '#008B8B',
\ 'darkmagenta': '#8B008B',
\ 'darkred': '#8B0000',
\ 'lightgreen': '#90EE90'
\ }
" Functions, to highlight certain types {{{1
function! s:ColorRGBValues(val) "{{{2
let s:position = getpos('.')
if <sid>IsInComment()
" skip coloring comments
return
endif
" strip parantheses and split on comma
let rgb = s:StripParentheses(a:val)
if empty(rgb)
call s:Warn("Error in expression". a:val. "! Please report as bug.")
return
endif
for i in range(3)
if rgb[i][-1:-1] == '%'
let val = matchstr(rgb[i], '\d\+')
if (val + 0 > 100)
let rgb[1] = 100
endif
let rgb[i] = float2nr((val + 0.0)*255/100)
else
if rgb[i] + 0 > 255
let rgb[i] = 255
endif
endif
endfor
if len(rgb) == 4
let rgb = s:ApplyAlphaValue(rgb)
endif
let clr = printf("%02X%02X%02X", rgb[0],rgb[1],rgb[2])
call s:SetMatcher(a:val, {'bg': clr})
endfunction
function! s:ColorHSLValues(val) "{{{2
let s:position = getpos('.')
if <sid>IsInComment()
" skip coloring comments
return
endif
" strip parantheses and split on comma
let hsl = s:StripParentheses(a:val)
if empty(hsl)
call s:Warn("Error in expression". a:val. "! Please report as bug.")
return
endif
let str = s:PrepareHSLArgs(hsl)
call s:SetMatcher(a:val, {'bg': str})
return
endfu
function! s:PreviewColorName(color) "{{{2
let s:position = getpos('.')
let name=tolower(a:color)
let clr = s:colors[name]
" Skip color-name, e.g. white-space property
call s:SetMatcher('-\@<!\<'.name.'\>\c-\@!', {'bg': clr[1:]})
endfu
function! s:PreviewColorHex(match) "{{{2
let s:position = getpos('.')
if <sid>IsInComment()
" skip coloring comments
return
endif
let color = (a:match[0] == '#' ? a:match[1:] : a:match)
let pattern = color
if len(color) == 3
let color = substitute(color, '.', '&&', 'g')
endif
if &t_Co == 8 && !s:HasGui()
" The first 12 color names, can be displayed by 8 color terminals
let list = values(s:xterm_8colors)
let idx = match(list, a:match)
if idx == -1
" Color can't be displayed by 8 color terminal
return
else
let color = list[idx]
endif
endif
if len(split(pattern, '\zs')) == 8
" apply alpha value
let l = split(pattern, '..\zs')
call map(l, 'printf("%2d", "0x".v:val)')
let l[3] = string(str2float(l[3])/255) " normalize to 0-1
let l = s:ApplyAlphaValue(l)
let color = printf("%02X%02X%02X", l[0], l[1], l[2])
endif
call s:SetMatcher(s:hex_pattern[0]. pattern. s:hex_pattern[2], {'bg': color})
endfunction
function! s:PreviewColorTerm(pre, text, post) "{{{2
" a:pre: Ansi-Sequences determining the highlighting
" a:text: Text to color
" a:post: Ansi-Sequences resetting the coloring (might be empty)
let s:position = getpos('.')
let color = s:Ansi2Color(a:pre)
let clr_Dict = {}
if &t_Co == 8 && !s:HasGui()
" The first 12 color names, can be displayed by 8 color terminals
let i = 0
for clr in color
let list = values(s:xterm_8colors)
let idx = match(list, clr)
if idx == -1
" Color can't be displayed by 8 color terminal
let color[i] = NONE
else
let color[i] = list[idx]
endif
let i+=1
endfor
endif
let clr_Dict.fg = color[0]
let clr_Dict.bg = color[1]
let pre = escape(a:pre, '[]')
let post = escape(a:post, '[]')
let txt = escape(a:text, '\^$.*~[]')
" limit the pattern to the belonging line (should make syntax matching
" faster!)
let pattern = '\%(\%'.line('.').'l\)\%('. pre. '\)\@<='.txt. '\('.post.'\)\@='
" needs matchaddpos
let clr_Dict.pos = [[ line('.'), col('.'), strlen(a:pre. a:text. a:post)]]
call s:SetMatcher(pattern, clr_Dict)
endfunction
function! s:PreviewColorNroff(match) "{{{2
let s:position = getpos('.')
let clr_Dict = {}
let color = []
if a:match[0] == '_'
let special = 'underline'
else
let special = 'bold'
endif
let synid=synIDtrans(synID(line('.'), col('.'), 1))
if synid == 0
let synid = hlID('Normal')
endif
let color=[synIDattr(synid, 'fg'), synIDattr(synid, 'bg')]
if color == [0, 0] || color == ['', '']
let color = [synIDattr(hlID('Normal'), 'fg'), synIDattr(hlID('Normal'), 'bg')]
endif
let clr_Dict.fg = color[0]
let clr_Dict.bg = color[1]
let clr_Dict.special=special
" limit the pattern to the belonging line (should make syntax matching
" faster!)
let pattern = '\%(\%'.line('.').'l\)'.a:match
" needs matchaddpos
let clr_Dict.pos = [[ line('.'), col('.'), 3]]
call s:SetMatcher(pattern, clr_Dict)
endfunction
function! s:PreviewTaskWarriorColors(submatch) "{{{2
" a:submatch is something like 'black on rgb141'
" this highlighting should overrule e.g. colorname highlighting
let s:position = getpos('.')
let s:default_match_priority += 1
let color = ['', 'NONE', 'NONE']
let color_Dict = {}
" The submatch is everything after the first equalsign!
let tpat = '\(inverse\|underline\|bright\|bold\)\?\%(\s*\)\(\S\{3,}\)'.
\ '\?\%(\s*\)\?\%(on\s\+'.
\ '\%(inverse\|underline\|bright\|bold\)\?\%(\s*\)\(\S\{3,}\)\)\?'
let colormatch = matchlist(a:submatch, tpat)
try
if !empty(colormatch) && !empty(colormatch[0])
let i=-1
for m in colormatch[1:3]
let i+=1
if i == 0
if (!empty(colormatch[1]))
let color_Dict.special=colormatch[1]
else
continue
endif
endif
if match(keys(s:colors), '\<'.m.'\>') > -1
if i == 1
let color_Dict.fg = s:colors[m][1:] " skip the # sign
elseif i == 2
let color_Dict.bg = s:colors[m][1:] " skip the # sign
endif
continue
elseif match(m, '^rgb...') > -1
let color[i] = m[3] * 36 + m[4] * 6 + m[5] + 16 " (start at index 16)
if color[i] > 231
" invalid color
return
endif
elseif match(m, '^color') > -1
let color[i] = matchstr(m, '\d\+')+0
if color[i] > 231
" invalid color
return
endif
elseif match(m, '^gray') > -1
let color[i] = matchstr(m, '\d\+') + 232
if color[i] > 231
" invalid color
return
endif
endif
if i == 1
let color_Dict.ctermfg = color[i]
elseif i == 2
let color_Dict.ctermbg = color[i]
endif
endfor
let cname = get(color_Dict, 'fg', 'NONE')
if cname ==# 'NONE' && get(color_Dict, 'ctermfg')
let cname = s:Term2RGB(color_Dict.ctermfg)
endif
call s:SetMatcher('=\s*\zs\<'.a:submatch.'\>$', color_Dict)
endif
finally
let s:default_match_priority -= 1
let s:stop = 1
endtry
endfunction
function! s:PreviewVimColors(submatch) "{{{2
" a:submatch is something like 'black on rgb141'
" this highlighting should overrule e.g. colorname highlighting
let s:position = getpos('.')
let s:default_match_priority += 1
if !exists("s:x11_color_pattern")
let s:x11_color_pattern = s:GetColorPattern(keys(s:x11_color_names))
endif
let color_Dict = {}
let pat1 = '\%(\(cterm[fb]g\)\s*=\s*\)\@<=\<\(\d\+\)\>'
let pat2 = '\%(\(gui[fb]g\)\s*=\s*\)\@<=#\(\x\{6}\)\>'
let pat3 = '\%#=1\%(\(gui[fb]g\)\s*=\s*\)\@<=\('.s:x11_color_pattern.'\)'
let cterm = matchlist(a:submatch, pat1)
let gui = matchlist(a:submatch, pat2)
if (!empty(gui) && (gui[2] ==# 'bg' ||
\ gui[2] ==# 'fg' ||
\ gui[2] ==# 'foreground' ||
\ gui[2] ==# 'background'))
let gui=[]
endif
if empty(gui)
let gui = matchlist(a:submatch, pat3)
if !empty(gui)
let gui[2] = s:x11_color_names[tolower(gui[2])]
endif
endif
try
if !empty(cterm)
let color_Dict.ctermbg = cterm[2]
elseif !empty(gui)
let color_Dict.bg = gui[2]
endif
if empty(gui) && empty(cterm)
return
endif
call s:SetMatcher('\<'.a:submatch.'\>', color_Dict)
finally
let s:default_match_priority -= 1
endtry
endfunction
function! s:PreviewVimHighlightDump(match) "{{{2
" highlights dumps of :hi
" e.g
"SpecialKey xxx term=bold cterm=bold ctermfg=124 guifg=Cyan
let s:position = getpos('.')
let s:default_match_priority += 1
let dict = {}
try
let match = split(a:match, '\_s\+')
if a:match =~# 'cleared'
" ipaddr xxx cleared
return
elseif a:match =~# 'links to'
" try to find a non-cleared group
let c1 = <sid>SynID(match[0])
let group = match[0]
if empty(c1)
let group = match[-1]
endif
call s:SetMatch('Color_'.group, '^'.s:GetPatternLiteral(a:match), {})
else
let dict.name = 'Color_'.match[0]
call remove(match, 0, 1)
let dict = s:DictFromList(dict, match)
call s:SetMatcher(s:GetPatternLiteral(a:match), dict)
endif
finally
let s:default_match_priority -= 1
" other highlighting functions shouldn't run anymore
let s:stop = 1
endtry
endfunction
function! s:PreviewVimHighlight(match) "{{{2
" like colorhighlight plugin,
" colorizer highlight statements in .vim files
let s:position = getpos('.')
let tmatch = a:match
let def = []
let dict = {}
try
if a:match =~ '^\s*hi\%[ghlight]\s\+clear'
" highlight clear lines, don't colorize!
return
endif
" Special case:
" HtmlHiLink foo bar -> links foo to bar
" hi! def link foo bar -> links foo to bar
let match = matchlist(tmatch, '\C\%(\%[Html\]HiLink\|hi\%[ghlight]!\?\s*\%(def\%[ault]\s*\)\?link\)\s\+\(\w\+\)\s\+\(\w\+\)')
" Hopefully tmatch[1] has already been defined ;(
if len(match)
call s:SetMatch('Color_'.match[1], '^\V'.escape(a:match, '\\'), {})
return
endif
let tmatch = substitute(tmatch, '^\c\s*hi\%[ghlight]!\?\(\s*def\%[ault]\)\?', '', '')
let match = map(split(tmatch), 'substitute(v:val, ''^\s\+\|\s\+$'', "", "g")')
if len(match) < 2
return
else
let dict.name = 'Color_'.get(match, 0)
let dict = s:DictFromList(dict, match)
call s:SetMatcher(s:GetPatternLiteral(a:match), dict)
endif
endtry
endfunction
function! s:IsInComment() "{{{1
return s:skip_comments &&
\ synIDattr(synIDtrans(synID(line('.'), col('.'),1)), 'name') == "Comment"
endfu
function! s:DictFromList(dict, list) "{{{1
let dict = copy(a:dict)
let match = filter(a:list, 'v:val =~# ''=''')
for item in match
let [t1, t2] = split(item, '=')
let dict[t1] = t2
endfor
return dict
endfunction
function! s:GetPatternLiteral(pat) "{{{1
return '\V'. substitute(escape(a:pat, '\\'), "\n", '\\n', 'g')
endfu
function! s:Term2RGB(index) "{{{1
" Return index in colortable in RRGGBB form
return join(map(copy(s:colortable[a:index]), 'printf("%02X", v:val)'),'')
endfu
function! s:Reltime(...) "{{{1
return exists("a:1") ? reltime(a:1) : reltime()
endfu
function! s:PrintColorStatistics() "{{{1
if get(g:, 'colorizer_debug', 0)
echohl Title
echom printf("Colorstatistics at: %s", strftime("%H:%M"))
echom printf("Duration: %s", reltimestr(s:relstop))
for name in sort(keys(extend(s:color_patterns, s:color_patterns_special)))
let value = get(extend(s:color_patterns, s:color_patterns_special), name)
echom printf("%15s: %ss", name, (value[-1] == [] ? ' 0.000000' : reltimestr(value[-1])))
endfor
echohl Normal
endif
endfu
function! s:ColorInit(...) "{{{1
let s:force_hl = !empty(a:1)
let s:term_true_color = (exists('+tgc') && &tgc)
let s:stop = 0
" default matchadd priority
let s:default_match_priority = -2
" pattern/function dict
" Needed for s:ColorMatchingLines(), disabled, as this is too slow.
"let s:pat_func = {'#\x\{3,6\}': function('<sid>PreviewColorHex'),
" \ 'rgba\=(\s*\%(\d\+%\?\D*\)\{3,4})':
" \ function('<sid>ColorRGBValues'),
" \ 'hsla\=(\s*\%(\d\+%\?\D*\)\{3,4})':
" \ function('s:ColorHSLValues')}
" Cache old values
if !exists("s:old_tCo")
let s:old_tCo = &t_Co
endif
if !exists("s:swap_fg_bg")
let s:swap_fg_bg = 0
endif
if !exists("s:round")
let s:round = 0
endif
" Enable Autocommands
if exists("g:colorizer_auto_color")
call Colorizer#AutoCmds(g:colorizer_auto_color)
endif
" Debugging
let s:debug = get(g:, 'colorizer_debug', 0)
" Don't highlight comment?
let s:skip_comments = get(g:, 'colorizer_skip_comments', 0)
" foreground / background contrast
let s:predefined_fgcolors = {}
let s:predefined_fgcolors['dark'] = ['444444', '222222', '000000']
let s:predefined_fgcolors['light'] = ['bbbbbb', 'dddddd', 'ffffff']
if !exists('g:colorizer_fgcontrast')
" Default to black / white
let g:colorizer_fgcontrast = len(s:predefined_fgcolors['dark']) - 1
elseif g:colorizer_fgcontrast >= len(s:predefined_fgcolors['dark'])
call s:Warn("g:colorizer_fgcontrast value invalid, using default")
let g:colorizer_fgcontrast = len(s:predefined_fgcolors['dark']) - 1
endif
if !exists("s:old_fgcontrast")
" if the value was changed since last time,
" be sure to clear the old highlighting.
let s:old_fgcontrast = g:colorizer_fgcontrast
endif
if exists("g:colorizer_swap_fgbg")
if s:swap_fg_bg != g:colorizer_swap_fgbg
let s:force_hl = 1
endif
let s:swap_fg_bg = g:colorizer_swap_fgbg
endif
if exists("g:colorizer_colornames")
if exists("s:color_names") &&
\ s:color_names != g:colorizer_colornames
let s:force_hl = 1
endif
let s:color_names = g:colorizer_colornames
else
let s:color_names = 1
endif
let s:color_syntax = get(g:, 'colorizer_syntax', 0)
if get(g:, 'colorizer_only_unfolded', 0) && exists(":foldd") == 1
let s:color_unfolded = 'foldd '
else
let s:color_unfolded = ''
endif
if hlID('Color_Error') == 0
hi default link Color_Error Error
endif
if !s:force_hl && s:old_fgcontrast != g:colorizer_fgcontrast
\ && s:swap_fg_bg == 0
" Doesn't work with swapping fg bg colors
let s:force_hl = 1
let s:old_fgcontrast = g:colorizer_fgcontrast
endif
" User manually changed the &t_Co option, so reset it
if s:old_tCo != &t_Co
unlet! s:colortable
endif
if !exists("s:init_css") || !exists("s:colortable") ||
\ empty(s:colortable)
" Only calculate the colortable when running
if &t_Co == 8
let s:colortable = map(range(0,7), 's:Xterm2rgb16(v:val)')
elseif &t_Co == 16
let s:colortable = map(range(0,15), 's:Xterm2rgb16(v:val)')
elseif &t_Co == 88
let s:colortable = map(range(0,87), 's:Xterm2rgb88(v:val)')
" terminal with 256 colors or gVim
elseif &t_Co == 256 || empty(&t_Co)
let s:colortable = map(range(0,255), 's:Xterm2rgb256(v:val)')
endif
if s:debug && exists("s:colortable")
let g:colortable = s:colortable
endif
let s:init_css = 1
elseif s:force_hl
call Colorizer#ColorOff()
endif
let s:conceal = [&l:cole, &l:cocu]
let s:hex_pattern = get(g:, 'colorizer_hex_pattern',
\ ['#', '\%(\x\{3}\|\x\{6}\|\x\{8\}\)', '\%(\>\|[-_]\)\@='])
if s:HasGui() || &t_Co >= 8 || s:HasColorPattern()
" The list of available match() patterns
let w:match_list = s:GetMatchList()
" If the syntax highlighting got reset, force recreating it
if ((empty(w:match_list) || !hlexists(w:match_list[0].group) ||
\ (empty(<sid>SynID(w:match_list[0].group)) && !s:force_hl)))
let s:force_hl = 1
endif
if &t_Co > 16 || s:HasGui()
let s:colors = (exists("g:colorizer_x11_names") ?
\ s:x11_color_names : s:w3c_color_names)
elseif &t_Co == 16
" should work with 16 colors terminals
let s:colors = s:xterm_16colors
else
let s:colors = s:xterm_8colors
endif
if exists("g:colorizer_custom_colors")
call extend(s:colors, g:colorizer_custom_colors, 'force')
endif
let s:colornamepattern = s:GetColorPattern(keys(s:colors))
"call map(w:match_list, 'v:val.pattern')
else
throw "nocolor"
endif
" Dictionary, containing all information on what to color
" Key: Name
" Value: List, containing 1) Pattern to find color
" 2) func ref to call on the match of 1
" 3) Name of variable, to enable or this enty
" 4) condition, that must be fullfilled, before
" using this entry
" ´ 5) reltime for dumping statistics
let s:color_patterns = {
\ 'rgb': ['rgb(\s*\%(\d\+%\?[^)]*\)\{3})',
\ function("s:ColorRGBValues"), 'colorizer_rgb', 1, [] ],
\ 'rgba': ['rgba(\s*\%(\d\+%\?\D*\)\{3}\%(\%(0\?\%(.\d\+\)\?\)\|1\))',
\ function("s:ColorRGBValues"), 'colorizer_rgba', 1, [] ],
\ 'hsla': ['hsla\=(\s*\%(\d\+%\?\D*\)\{3}\%(\%(0\?\%(.\d\+\)\?\)\|1\)\=)',
\ function("s:ColorHSLValues"), 'colorizer_hsla', 1, [] ],
\ 'vimcolors': ['\%(gui[fb]g\|cterm[fb]g\)\s*=\s*\<\%(\d\+\|#\x\{6}\|\w\+\)\>',
\ function("s:PreviewVimColors"), 'colorizer_vimcolors', '&ft ==# "vim"', [] ],
\ 'vimhighlight': ['^\s*\%(\%[Html]HiLink\s\+\w\+\s\+\w\+\)\|'.
\ '\(^\s*hi\%[ghlight]!\?\s\+\(clear\)\@!\S\+.*\)',
\ function("s:PreviewVimHighlight"), 'colorizer_vimhighlight', '&ft ==# "vim"', [] ],
\ 'taskwarrior': ['^color[^=]*=\zs.\+$',
\ function("s:PreviewTaskWarriorColors"), 'colorizer_taskwarrior', 'expand("%:e") ==# "theme"', [] ],
\ 'hex': [join(s:hex_pattern, ''), function("s:PreviewColorHex"), 'colorizer_hex', 1, [] ],
\ 'vimhighl_dump': ['^\v\w+\s+xxx%((\s+(term|cterm%([bf]g)?|gui%(%([bf]g|sp))?'.
\ ')\=[#0-9A-Za-z_,]+)+)?%(\_\s+links to \w+)?%( cleared)@!',
\ function("s:PreviewVimHighlightDump"), 'colorizer_vimhighl_dump', 'empty(&ft)', [] ]
\ }
" term_conceal: patterns to hide, currently: $ and the color patterns 
let s:color_patterns_special = {
\ 'term': ['\%(\%x1b\[0m\)\?\(\%(\%x1b\[\d\+\%([:;]\d\+\)*m\)\+\)\([^\e]*\)\(\%x1b\%(\[0m\|\[K\)\)\=',
\ function("s:PreviewColorTerm"), 'colorizer_term', [] ],
\ 'term_nroff': ['\%(\(.\)\%u8\1\)\|\%(_\%u8.\)', function("s:PreviewColorNroff"), 'colorizer_nroff', [] ],
\ 'term_conceal': [ ['\%(\(\%(\%x1b\[0m\)\?\%x1b\[\d\+\%([;:]\d\+\)*\a\)\|\%x1b\[K$\)',
\ '\%d13', '\%(\%x1b\[K\)', '\%(\%x1b\]\d\+;\d\+;\)', '\%(\%x1b\\\)',
\ '\%x1b(B\%x1b\[m', '\%x1b\[m\%x0f', '_\%u8.\@=', '\(.\)\%u8\%(\1\)\@='],
\ '',
\ 'colorizer_term_conceal', [] ]
\ }
if exists("s:colornamepattern") && s:color_names
let s:color_patterns["colornames"] = [ s:colornamepattern,
\ function("s:PreviewColorName"), 'colorizer_colornames', 1, [] ]
endif
endfu
function! s:AddOffset(list) "{{{1
return a:list
let result=[]
for val in a:list
let val = ('0X'.val) + 0
if val < get(g:, 'colorizer_min_offset', 0)
let val = get(g:, 'colorizer_add_offset', 0)
endif
call add(result, val)
endfor
return result
endfu
function! s:SwapColors(list) "{{{1
if empty(a:list[0]) && empty(a:list[1])
return a:list
elseif s:swap_fg_bg > 0
return [a:list[1]] + ['NONE']
elseif s:swap_fg_bg == -1
return [a:list[1], a:list[0]]
else
return a:list
endif
endfu
function! s:FGforBG(bg) "{{{1
" takes a 6hex color code and returns a matching color that is visible
let fgc = g:colorizer_fgcontrast
if fgc == -1
return a:bg
endif
if a:bg ==# 'NONE'
return (&bg==#'dark' ? s:predefined_fgcolors['dark'][fgc] : s:predefined_fgcolors['light'][fgc])
endif
let r = '0x'.a:bg[0:1]+0
let g = '0x'.a:bg[2:3]+0
let b = '0x'.a:bg[4:5]+0
if r*30 + g*59 + b*11 > 12000
return s:predefined_fgcolors['dark'][fgc]
else
return s:predefined_fgcolors['light'][fgc]
end
endfunction
function! s:DidColor(clr, pat) "{{{1
let idx = index(w:match_list, a:pat)
if idx > -1
let attr = <sid>SynID(a:clr)
if (!empty(attr) && get(w:match_list, idx) ==# a:pat)
return 1
endif
endif
return 0
endfu
function! s:DoHlGroup(group, Dict) "{{{1
if !s:force_hl
let syn = <sid>SynID(a:group)
if !empty(syn)
" highlighting already exists
return
endif
endif
if empty(a:Dict)
" try to link the given highlight group
call s:Exe("hi link ". a:group. " ". matchstr(a:group, 'Color_\zs.*'))
return
endif
let hi = printf('hi %s ', a:group)
let fg = get(a:Dict, 'fg', '')
let bg = get(a:Dict, 'bg', '')
let [fg, bg] = s:SwapColors([fg, bg])
let [fg, bg] = s:AddOffset([fg, bg])
if !empty(fg) && fg[0] !=# '#' && fg !=# 'NONE'
let fg='#'.fg
endif
if !empty(bg) && bg[0] !=# '#' && bg !=# 'NONE'
let bg='#'.bg
endif
if !empty(fg)
let hi .= printf('guifg=%s', fg)
endif
if has_key(a:Dict, "gui")
let hi.=printf(" gui=%s ", a:Dict['gui'])
endif
if has_key(a:Dict, "guifg")
let hi.=printf(" guifg=%s ", a:Dict['guifg'])
endif
if !empty(bg)
let hi .= printf(' guibg=%s', bg)
endif
let hi .= printf('%s', !empty(get(a:Dict, 'special', '')) ?
\ (' gui='. a:Dict.special) : '')
if !s:HasGui()
let fg = get(a:Dict, 'ctermfg', '')
let bg = get(a:Dict, 'ctermbg', '')
let [fg, bg] = s:SwapColors([fg, bg])
if !empty(bg) || bg == 0
let hi.= printf(' ctermbg=%s', bg)
endif
if !empty(fg) || fg == 0
let hi.= printf(' ctermfg=%s', fg)
endif
let hi .= printf('%s', !empty(get(a:Dict, 'special','')) ?
\ (' cterm='. a:Dict.special) : '')
if has_key(a:Dict, "term")
let hi.=printf(" term=%s ", a:Dict['term'])
endif
if has_key(a:Dict, "cterm")
let hi.=printf(" cterm=%s ", a:Dict['cterm'])
endif
endif
call s:Exe(hi)
endfunction
function! s:Exe(stmt) "{{{1
"Don't error out for invalid colors
try
exe a:stmt
catch
" Only report errors, when debugging info is turned on
if s:debug
call s:Warn("Invalid statement: ".a:stmt)
endif
endtry
endfu
function! s:SynID(group, ...) "{{{1
let property = exists("a:1") ? a:1 : 'fg'
let c1 = synIDattr(synIDtrans(hlID(a:group)), property)
" since when can c1 be negative? Is this a vim bug?
" it used to be empty on errors or non-existing properties...
if empty(c1) || c1 < 0
return ''
else
return c1
endif
endfu
function! s:GenerateColors(dict) "{{{1
let result=copy(a:dict)
if !has_key(result, 'bg') && has_key(result, 'ctermbg')
let result.bg = s:Term2RGB(result.ctermbg)
elseif !has_key(result, 'bg') && has_key(result, 'guibg')
let result.bg = result.guibg
endif
if !has_key(result, 'fg') && has_key(result, 'ctermfg')
let result.fg = s:Term2RGB(result.ctermfg)
elseif !has_key(result, 'fg') && has_key(result, 'guifg')
let result.fg = result.guifg
endif
if !has_key(result, 'fg') &&
\ has_key(result, 'bg')
let result.fg = toupper(s:FGforBG(result.bg))
endif
if !has("gui_running")
" need to make sure, we have ctermfg/ctermbg values
if !has_key(result, 'ctermfg') &&
\ has_key(result, 'fg')
let result.ctermfg = (s:term_true_color ? result.fg : s:Rgb2xterm(result.fg))
endif
if !has_key(result, 'ctermbg') &&
\ has_key(result, 'bg')
let result.ctermbg = (s:term_true_color ? result.bg : s:Rgb2xterm(result.bg))
endif
endif
for key in keys(result)
if empty(result[key])
let result[key] = 0
endif
endfor
return result
endfunction
function! s:SetMatcher(pattern, Dict) "{{{1
let param = s:GenerateColors(a:Dict)
let clr = get(param, 'name', '')
if empty(clr)
let clr = 'Color_'. get(param, 'fg'). '_'. get(param, 'bg').
\ (!empty(get(param, 'special', '')) ?
\ ('_'. get(param, 'special')) : '')
endif
call s:SetMatch(clr, a:pattern, param)
endfunction
function! s:SetMatch(group, pattern, param_dict) "{{{1
call s:DoHlGroup(a:group, a:param_dict)
if has_key(a:param_dict, 'pos')
call matchaddpos(a:group, a:param_dict.pos, s:default_match_priority)
" do not add the pattern to the matchlist
"call add(w:match_list, a:pattern)
return
endif
if s:DidColor(a:group, a:pattern)
return
endif
" let 'hls' overrule our syntax highlighting
call matchadd(a:group, a:pattern, s:default_match_priority)
call add(w:match_list, a:pattern)
endfunction
function! s:Xterm2rgb16(color) "{{{1
" 16 basic colors
let r=0
let g=0
let b=0
let r = s:basic16[a:color][0]
let g = s:basic16[a:color][1]
let b = s:basic16[a:color][2]
return [ r, g, b ]
endfunction
function! s:Xterm2rgb88(color) "{{{1
" 16 basic colors
let r=0
let g=0
let b=0
if a:color < 16
return s:Xterm2rgb16(a:color)
" 4x4x4 color cube
elseif a:color >= 16 && a:color < 80
let color=a:color-16
let r = s:valuerange4[(color/16)%4]
let g = s:valuerange4[(color/4)%4]
let b = s:valuerange4[color%4]
" gray tone
elseif a:color >= 80 && a:color <= 87
let color = (a:color-80) + 0.0
let r = 46.36363636 + color * 23.18181818 +
\ (color > 0.0 ? 23.18181818 : 0.0) + 0.0
let r = float2nr(r)
let g = r
let b = r
endif
let rgb=[r,g,b]
return rgb
endfunction
function! s:Xterm2rgb256(color) "{{{1
" 16 basic colors
let r=0
let g=0
let b=0
if a:color < 16
return s:Xterm2rgb16(a:color)
" color cube color
elseif a:color >= 16 && a:color < 232
let color=a:color-16
let r = s:valuerange6[(color/36)%6]
let g = s:valuerange6[(color/6)%6]
let b = s:valuerange6[color%6]
" gray tone
elseif a:color >= 232 && a:color <= 255
let r = 8 + (a:color-232) * 0x0a
let g = r
let b = r
endif
let rgb=[r,g,b]
return rgb
endfunction
function! s:RoundColor(...) "{{{1
let result = []
let minlist = []
let min = 1000
let list = (&t_Co == 256 ? s:valuerange6 : s:valuerange4)
if &t_Co > 16
for item in a:000
for val in list
let t = abs(val - item)
if (min > t)
let min = t
let r = val
endif
endfor
call add(result, r)
call add(minlist, min)
let min = 1000
endfor
endif
if &t_Co <= 16
let result = [ a:1, a:2, a:3 ]
let minlist = [ 255, 255, 255 ]
endif
" Check with the values from the 16 color xterm, if the difference
" is lower
let result = s:Check16ColorTerm(result, minlist)
return result
endfunction
function! s:Check16ColorTerm(rgblist, minlist) "{{{1
" We only check those values for 256 color terminals here:
" [205,0,0] [0,205,0] [205,205,0] [205,0,205]
" [0,205,205] [0,0,238] [92,92,255]
" The other values are already included in the s:colortable list
let min = a:minlist[0] + a:minlist[1] + a:minlist[2]
if &t_Co == 256
for value in [[205,0,0], [0,205,0], [205,205,0], [205,0,205],
\ [0,205,205], [0,0,238], [92,92,255]]
" euclidian distance would be needed,
" but this works good enough and is faster.
let t = abs(value[0] - a:rgblist[0]) +
\ abs(value[1] - a:rgblist[1]) +
\ abs(value[2] - a:rgblist[2])
if min > t
return value
endif
endfor
elseif &t_Co == 88
for value in [[0,0,238], [229,229,229], [127,127,127], [92,92,255]]
let t = abs(value[0] - a:rgblist[0]) +
\ abs(value[1] - a:rgblist[1]) +
\ abs(value[2] - a:rgblist[2])
if min > t
return value
endif
endfor
else " 16 color terminal
" Check for values from 16 color terminal
let best = []
let min = 100000
let list = (&t_Co == 16 ? s:basic16 : s:basic16[:7])
for value in list
let t = abs(value[0] - a:rgblist[0]) +
\ abs(value[1] - a:rgblist[1]) +
\ abs(value[2] - a:rgblist[2])
if min > t
let min = t
let best = value
endif
endfor
return best
endif
return a:rgblist
endfunction
function! s:Ansi2Color(chars) "{{{1
" chars look like this
" 
if !exists("s:term2ansi")
let s:term2ansi = {}
" Color values taken from
" https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
let s:term2ansi.std = { 30: printf("%.2X%.2X%.2X", 0, 0, 0),
\ 31: printf("%.2X%.2X%.2X", 205, 0, 0),
\ 32: printf("%.2X%.2X%.2X", 0, 205, 0),
\ 33: printf("%.2X%.2X%.2X", 205, 205, 0),
\ 34: printf("%.2X%.2X%.2X", 0, 0, 238),
\ 35: printf("%.2X%.2X%.2X", 205, 0, 205),
\ 36: printf("%.2X%.2X%.2X", 0, 205, 205),
\ 37: printf("%.2X%.2X%.2X", 229, 229, 229)
\ }
let s:term2ansi.bold = { 30: printf("%.2X%.2X%.2X", 127, 127, 127),
\ 31: printf("%.2X%.2X%.2X", 255, 0, 0),
\ 32: printf("%.2X%.2X%.2X", 0, 255, 0),
\ 33: printf("%.2X%.2X%.2X", 255, 255, 0),
\ 34: printf("%.2X%.2X%.2X", 92, 92, 255),
\ 35: printf("%.2X%.2X%.2X", 255, 0, 255),
\ 36: printf("%.2X%.2X%.2X", 0, 255, 255),
\ 37: printf("%.2X%.2X%.2X", 255, 255, 255)
\ }
endif
let fground = ""
let bground = ""
let check = [0,0] " check fground and bground color
if a:chars =~ '48;5;\d\+'
let check[0] = 0
elseif a:chars=~ '.*3[0-7]\(;1\)\?[m;]'
let check[0] = 1
elseif a:chars =~ '.*38\([:;]\)2\1'
let check[0] = 2 " Uses True Color Support
endif
if a:chars =~ '48;5;\d\+'
let check[1] = 3
elseif a:chars =~ '.*48\([:;]\)2\1'
let check[1] = 2
elseif a:chars=~ '.*4[0-7]\(;1\)\?[m;]'
let check[1] = 1
endif
if check[0] == 2
" Check for TrueColor Support
" Esc[38;2;<red>;<green>;<blue>
" 38: background color
" 48: foregournd color
" delimiter could be either : or ;
" skip leading ESC [ and trailing m char
let pat = split(a:chars[2:-2], '[:;]')
if pat[0] == 38 " background color
let fground = printf("%.2X%.2X%.2X", pat[2], pat[3], pat[4])
elseif a:pat[1] == 48 " foreground color
let bground = printf("%.2X%.2X%.2X", pat[2], pat[3], pat[4])
endif
elseif check[1] == 3
let nr = matchstr(a:chars, '\%x1b\[48;5;\zs\d\+\zem')
let bground = s:Term2RGB(nr)
else
for val in ["std", "bold"]
for key in keys(s:term2ansi[val])
let bright = (val == "std" ? "" : ";1")
if check[0] " Check for a match of the foreground color
if a:chars =~ ".*".key.bright."[m;]"
let fground = s:term2ansi[val][key]
endif
endif
if check[1] "Check for background color
if a:chars =~ ".*".(key+10).bright."[m;]"
let bground = s:term2ansi[val][key]
endif
endif
if !empty(bground) && !empty(fground)
break
endif
endfor
if !empty(fground) && !empty(bground)
break
endif
endfor
endif
return [(empty(fground) ? 'NONE' : fground), (empty(bground) ? "NONE" : bground)]
endfunction
function! s:TermConceal(pattern) "{{{1
" Conceals a list of patterns
if exists("b:Colorizer_did_syntax")
return
endif
let s:position = getpos('.')
" concealing
for pat in a:pattern
exe "syn match ColorTermESC /". pat. "/ conceal containedin=ALL"
endfor
setl cocu=nv cole=2
let b:Colorizer_did_syntax=1
endfu
function! s:GetColorPattern(list) "{{{1
"let list = map(copy(a:list), ' ''\%(-\@<!\<'' . v:val . ''\>-\@!\)'' ')
"let list = map(copy(a:list), ' ''\%(-\@<!\<'' . v:val . ''\>-\@!\)'' ')
let list = copy(a:list)
" Force the old re engine. It should be faster without backtracking.
return '\%#=1\%(\<\('.join(copy(a:list), '\|').'\)\>\)'
endfunction
function! s:GetMatchList() "{{{1
" this is window-local!
return filter(getmatches(), 'v:val.group =~ ''^\(Color_\w\+\)\|NONE''')
endfunction
function! s:CheckTimeout(pattern, force) "{{{1
" Abort, if pattern is not found within 100 ms and force
" is not set
return (!empty(a:force) || search(a:pattern, 'cnw', '', 100))
endfunction
function! s:SaveRestoreOptions(save, dict, list) "{{{1
if a:save
return s:SaveOptions(a:list)
else
for [key, value] in items(a:dict)
if key !~ '@'
call setbufvar('', '&'. key, value)
else
call call('setreg', [key[1]] + value)
endif
unlet value
endfor
endif
endfun
function! s:SaveOptions(list) "{{{1
let save = {}
for item in a:list
if item !~ '^@'
exe "let save.". item. " = &l:". item
else
let save[item] = []
call add(save[item], getreg(item[1]))
call add(save[item], getregtype(item))
endif
if item == 'ma' && !&l:ma
setl ma
elseif item == 'ro' && &l:ro
setl noro
elseif item == 'lz' && &l:lz
setl lz
elseif item == 'ed' && &g:ed
setl noed
elseif item == 'gd' && &g:gd
setl nogd
endif
endfor
return save
endfunction
function! s:StripParentheses(val) "{{{1
return split(matchstr(a:val, '^\(hsl\|rgb\)a\?\s*(\zs[^)]*\ze)'), '\s*,\s*')
endfunction
function! s:ApplyAlphaValue(rgb) "{{{1
" Add Alpha Value to RGB values
" takes a list of [ rr, gg, bb, aa] values
" alpha can be 0-1
let bg = <sid>SynID('Normal', 'bg')
if empty(bg)
return a:rgb[0:3]
else
if (bg =~? '\d\{1,3}') && bg < 256
" Xterm color code
" (add dummy in front of it, will be split later)
let bg = '#'.join(s:colortable[bg])
endif
let rgb = []
let bg_ = split(bg[1:], '..\zs')
let alpha = str2float(a:rgb[3])
if alpha > 1
let alpha = 1 + 0.0
elseif alpha < 0
let alpha = 0 + 0.0
endif
let i = 0
for value in a:rgb[0:2]
let value += 0 " convert to nr
let value = float2nr(ceil(value * alpha) + ceil((bg_[i]+0)*(1-alpha)))
if value > 255
let value = 255
elseif value < 0
let value = 0
endif
call add(rgb, value)
let i+=1
unlet value " reset type of value
endfor
return rgb
endif
endfunction
function! s:HSL2RGB(h, s, l, ...) "{{{1
let s = a:s + 0.0
let l = a:l + 0.0
if l <= 0.5
let m2 = l * (s + 1)
else
let m2 = l + s - l * s
endif
let m1 = l * 2 - m2
let r = float2nr(s:Hue2RGB(m1, m2, a:h + 120))
let g = float2nr(s:Hue2RGB(m1, m2, a:h))
let b = float2nr(s:Hue2RGB(m1, m2, a:h - 120))
if a:0
let rgb = s:ApplyAlphaValue([r, g, b, a:1])
endif
return printf("%02X%02X%02X", r, g, b)
endfunction
function! s:Hue2RGB(m1, m2, h) "{{{1
let h = (a:h + 0.0)/360
if h < 0
let h = h + 1
elseif h > 1
let h = h - 1
endif
if h * 6 < 1
let res = a:m1 + (a:m2 - a:m1) * h * 6
elseif h * 2 < 1
let res = a:m2
elseif h * 3 < 2
let res = a:m1 + (a:m2 - a:m1) * (2.0/3.0 - h) * 6
else
let res = a:m1
endif
return round(res * 255)
endfunction
function! s:Rgb2xterm(color) "{{{1
" selects the nearest xterm color for a rgb value like #FF0000
" hard code values for 000000 and FFFFFF, they will be called many times
" so make this fast
if a:color ==# 'NONE'
return 'NONE'
endif
if len(a:color) <= 3
" a:color is already a terminal color
return a:color
endif
if !exists("s:colortable")
call s:ColorInit('')
endif
let color = (a:color[0] == '#' ? a:color[1:] : a:color)
if ( color == '000000')
return 0
elseif (color == 'FFFFFF')
return 15
else
let r = '0x'.color[0:1]+0
let g = '0x'.color[2:3]+0
let b = '0x'.color[4:5]+0
" Try exact match first
let i = index(s:colortable, [r, g, b])
if i > -1
return i
endif
" Grey scale ?
if ( r == g && r == b )
if &t_Co == 256
" 0 and 15 have already been take care of
if r < 5
return 0 " black
elseif r > 244
return 15 " white
endif
" grey cube starts at index 232
return 232+(r-5)/10
elseif &t_Co == 88
if r < 23
return 0 " black
elseif r < 69
return 80
elseif r > 250
return 15 " white
else
" should be good enough
return 80 + (r-69)/23
endif
endif
endif
" Round to the next step in the xterm color cube
" euclidian distance would be needed,
" but this works good enough and is faster.
let round = s:RoundColor(r, g, b)
" Return closest match or -1 if not found
return index(s:colortable, round)
endif
endfunction
function! s:Warn(msg) "{{{1
let msg = 'Colorizer: '. a:msg
echohl WarningMsg
echomsg msg
echohl None
let v:errmsg = msg
endfu
function! s:LoadSyntax(file) "{{{1
unlet! b:current_syntax
exe "sil! ru! syntax/".a:file. ".vim"
endfu
function! s:HasGui() "{{{1
return has("gui_running") || (exists("+tgc") && &tgc)
endfu
function! s:HasColorPattern() "{{{1
let _pos = winsaveview()
try
if !exists("s:colornamepattern")
let s:colornamepattern = s:GetColorPattern(keys(s:colors))
endif
let pattern = values(s:color_patterns) + [s:colornamepattern]
call cursor(1,1)
for pat in pattern
if s:CheckTimeout(pat, '')
return 1
endif
endfor
return 0
finally
call winrestview(_pos)
endtry
endfunction
function! s:PrepareHSLArgs(list) "{{{1
let hsl=a:list
let hsl[0] = (matchstr(hsl[0], '\d\+') + 360)%360
let hsl[1] = (matchstr(hsl[1], '\d\+') + 0.0)/100
let hsl[2] = (matchstr(hsl[2], '\d\+') + 0.0)/100
if len(hsl) == 4
return s:HSL2RGB(hsl[0], hsl[1], hsl[2], hsl[3])
endif
return s:HSL2RGB(hsl[0], hsl[1], hsl[2])
endfu
function! s:SyntaxMatcher(enable) "{{{1
if !a:enable
return
endif
let did_clean = {}
"
let list=s:GetMatchList()
if len(list) > 1000
" This will probably slow
call s:Warn("Colorizer many colors detected, syntax highlighting will probably slow down Vim considerably!")
endif
if &ft =~? 'css'
" cssColor defines some color names like yellow or red and overrules
" our colors
sil! syn clear cssColor
endif
for hi in list
if !get(did_clean, hi.group, 0)
let did_clean[hi.group] = 1
exe "sil! syn clear" hi.group
endif
if a:enable
if has_key(hi, 'pattern')
exe "syn match" hi.group "excludenl /". escape(hi.pattern, '/'). "/ display containedin=ALL"
else
" matchaddpos()
let line=hi.pos1[0]
let pos =hi.pos1[1]-1
let len =hi.pos1[1]+hi.pos1[2]-2
exe printf('syn match %s excludenl /\%%%dl\%%>%dc\&.*\%%<%dc/ display containedin=ALL', hi.group, line, pos, len)
endif
" We have syntax highlighting, can clear the matching
" ignore errors (just in case)
sil! call matchdelete(hi.id)
endif
endfor
endfu
function! Colorizer#ColorToggle() "{{{1
if !exists("w:match_list") || empty(w:match_list)
call Colorizer#DoColor(0, 1, line('$'))
else
call Colorizer#ColorOff()
endif
endfu
function! Colorizer#ColorOff() "{{{1
for _match in s:GetMatchList()
sil! call matchdelete(_match.id)
endfor
call Colorizer#LocalFTAutoCmds(0)
if exists("s:conceal")
let [&l:cole, &l:cocu] = s:conceal
if !empty(hlID('ColorTermESC'))
syn clear ColorTermESC
endif
endif
unlet! b:Colorizer_did_syntax w:match_list s:conceal
endfu
function! Colorizer#DoColor(force, line1, line2, ...) "{{{1
" initialize plugin
try
if v:version < 800
call s:Warn("Colorizer needs Vim 8.0")
return
endif
call s:ColorInit(a:force)
if exists("a:1") && !empty(a:1)
let s:color_syntax = ( a:1 =~# '^\%(syntax\|nomatch\)$' )
endif
catch /nocolor/
" nothing to do
call s:Warn("Your terminal doesn't support colors or no colors".
\ 'found in the current buffer!')
return
endtry
let error = ""
let _a = winsaveview()
let save = s:SaveRestoreOptions(1, {},
\ ['mod', 'ro', 'ma', 'lz', 'ed', 'gd', '@/'])
let s:relstart = s:Reltime()
" highlight Hex Codes:
"
" The :%s command is a lot faster than this:
":g/#\x\{3,6}\>/call s:ColorMatchingLines(line('.'))
" Should color #FF0000
" #F0F
" #FFF
"
if &t_Co > 16 || s:HasGui()
" Also support something like
" CSS rgb(255,0,0)
" rgba(255,0,0,1)
" rgba(255,0,0,0.8)
" rgba(255,0,0,0.2)
" rgb(10%,0,100%)
" hsl(0,100%,50%) -> hsl2rgb conversion RED
" hsla(120,100%,50%,1) Lime
" hsl(120,100%,25%) Darkgreen
" hsl(120, 100%, 75%) lightgreen
" hsl(120, 75%, 75%) pastelgreen
" highlight rgb(X,X,X) values
for Pat in values(s:color_patterns)
let start = s:Reltime()
if !get(g:, Pat[2], 1) || (get(g:, Pat[2]. '_disable', 0) > 0)
let Pat[4] = s:Reltime(start)
" Coloring disabled
continue
endif
" 4th element in pattern is condition, that must be fullfilled,
" before we continue
if !empty(Pat[3]) && !eval(Pat[3])
let Pat[4] = s:Reltime(start)
continue
endif
" Check, the pattern isn't too costly...
if s:CheckTimeout(Pat[0], a:force) && !s:IsInComment()
let cmd = printf(':sil keeppatterns %d,%d%ss/%s/\=call(Pat[1], [submatch(0)])/egin',
\ a:line1, a:line2, s:color_unfolded, Pat[0])
try
if Pat[2] ==# 'colorizer_vimhighlight' && !empty(bufname(''))
" try to load the corresponding syntax file so the syntax
" groups will be defined
let s:extension = fnamemodify(expand('%'), ':t:r')
let s:old_syntax = exists("b:current_syntax") ? b:current_syntax : ''
call s:LoadSyntax(s:extension)
endif
exe cmd
let Pat[4] = s:Reltime(start)
if s:stop
break
endif
catch
" some error occured, stop when finished (and don't setup auto
" comands
let error.=" Colorize: ". string(Pat)
break
finally
if exists("s:extension")
call s:LoadSyntax(&ft)
unlet! s:extension
endif
endtry
endif
endfor
else
call s:Warn('Color configuration seems wrong, skipping colorization! Check t_Co setting!')
endif
for Pat in [ s:color_patterns_special.term, s:color_patterns_special.term_nroff ]
let start = s:Reltime()
if (s:CheckTimeout(Pat[0], a:force)) && !s:IsInComment()
if !get(g:, Pat[2], 1) || (get(s:, Pat[2]. '_disable', 0) > 0)
" Coloring disabled
continue
endif
if Pat[2] is# 'colorizer_nroff'
let arg = '[submatch(0)]'
else
let arg = '[submatch(1), submatch(2), submatch(3)]'
endif
let cmd = printf(':sil keeppatterns %d,%d%ss/%s/\=call(Pat[1],%s)/egin',
\ a:line1, a:line2, s:color_unfolded, Pat[0], arg)
try
exe cmd
let Pat[3] = s:Reltime(start)
" Hide ESC Terminal Chars
let start = s:Reltime()
call s:TermConceal(s:color_patterns_special.term_conceal[0])
let s:color_patterns_special.term_conceal[3] = s:Reltime(start)
catch
" some error occured, stop when finished (and don't setup auto
" comands
let error=" ColorTerm "
break
endtry
endif
endfor
" convert matches into synatx highlighting, so TOhtml can display it
" correctly
call s:SyntaxMatcher(s:color_syntax)
if !exists("#FTColorizer#BufWinEnter#<buffer>") && empty(error)
" Initialise current window.
call Colorizer#LocalFTAutoCmds(1)
call Colorizer#ColorWinEnter(1, 1) " don't call DoColor recursively!
endif
let s:relstop = s:Reltime(s:relstart)
if !empty(error)
" Some error occured, stop trying to color the file
call Colorizer#ColorOff()
call s:Warn("Some error occured here: ". error)
if exists("s:position")
call s:Warn("Position: ". string(s:position))
call matchadd('Color_Error', '\%'.s:position[1].'l\%'.s:position[2].'c.*\>')
endif
endif
call s:PrintColorStatistics()
call s:SaveRestoreOptions(0, save, [])
call winrestview(_a)
endfu
function! Colorizer#RGB2Term(arg,bang) "{{{1
if a:arg =~ '^rgb'
let clr = s:StripParentheses(a:arg)
let color = printf("#%02X%02X%02X", clr[0], clr[1], clr[2])
else
let color = a:arg[0] == '#' ? a:arg : '#'.a:arg
endif
call s:ColorInit(1)
let tcolor = s:Rgb2xterm(color)
if empty(a:bang)
call s:DoHlGroup("Color_". color[1:], s:GenerateColors({'bg': color[1:]}))
exe "echohl" "Color_".color[1:]
echo a:arg. " => ". tcolor
echohl None
endif
return tcolor
endfu
function! Colorizer#Term2RGB(arg) "{{{1
let index = a:arg + 0
if a:arg > 255 || a:arg < 0
call s:Warn('invalid index')
return
endif
let _t_Co=&t_Co
let &t_Co = 256
call s:ColorInit(1)
let rgb = s:Term2RGB(index)
call s:DoHlGroup("Color_". rgb, s:GenerateColors({'bg': rgb, 'ctermbg': index}))
exe "echohl" "Color_".rgb
echo "TerminalColor: ". a:arg. " => ". rgb
echohl None
let &t_Co = _t_Co
endfu
function! Colorizer#HSL2Term(arg) "{{{1
let hsl = s:StripParentheses(a:arg)
if empty(hsl)
call s:Warn("Error evaluating expression". a:val. "! Please report as bug.")
return a:val
endif
let str = s:PrepareHSLArgs(hsl)
let tcolor = s:Rgb2xterm('#'.str)
call s:DoHlGroup("Color_".str, s:GenerateColors({'bg': str}))
exe "echohl" str
echo a:arg. " => ". tcolor
echohl None
endfu
function! Colorizer#AutoCmds(enable) "{{{1
if a:enable && !get(g:, 'colorizer_debug', 0)
aug Colorizer
au!
au InsertLeave * sil call Colorizer#ColorLine('!', line('w0'), line('w$'))
au TextChangedI * sil call Colorizer#ColorLine('', line('.'),line('.'))
au GUIEnter,ColorScheme * sil call Colorizer#DoColor('!', 1, line('$'))
au WinEnter,BufWinEnter * sil call Colorizer#ColorWinEnter()
aug END
else
aug Colorizer
au!
aug END
aug! Colorizer
endif
endfu
function! Colorizer#LocalFTAutoCmds(enable) "{{{1
if a:enable
aug FTColorizer
au!
au InsertLeave <buffer> silent call
\ Colorizer#ColorLine('', line('w0'), line('w$'))
au CursorMoved,CursorMovedI <buffer> call Colorizer#ColorLine('',line('.'), line('.'))
au WinEnter,BufWinEnter <buffer> silent call Colorizer#ColorWinEnter()
"au BufLeave <buffer> call Colorizer#ColorOff()
au GUIEnter,ColorScheme <buffer> silent
\ call Colorizer#DoColor('!', 1, line('$'))
if get(g:, 'colorizer_cursormoved', 0)
au CursorMoved,CursorMovedI * call Colorizer#ColorLine('', line('.'),line('.'))
au CusorHold, CursorHoldI * silent call Colorizer#ColorLine('!', line('w0'), line('w$'))
endif
aug END
if !exists("b:undo_ftplugin")
" simply unlet a dummy variable
let b:undo_ftplugin = 'unlet! b:Colorizer_foobar'
endif
" Delete specific auto commands, because the filetype
" has been changed.
let b:undo_ftplugin .= '| exe "sil! au! FTColorizer"'
let b:undo_ftplugin .= '| exe "sil! aug! FTColorizer"'
let b:undo_ftplugin .= '| exe ":ColorClear"'
else
aug FTColorizer
au!
aug END
aug! FTColorizer
endif
endfu
function! Colorizer#ColorWinEnter(...) "{{{1
let force = a:0 ? a:1 : 0
" be fast!
if !force
let ft_list = split(get(g:, "colorizer_auto_filetype", ""), ',')
if match(ft_list, "^".&ft."$") == -1
" current filetype doesn't match g:colorizer_auto_filetype,
" so nothing to do
return
endif
if get(b:, 'Colorizer_changedtick', 0) == b:changedtick &&
\ !empty(getmatches())
" nothing to do
return
endif
endif
let g:colorizer_only_unfolded = 1
let _c = getpos('.')
if !exists("a:2")
" don't call it recursively!
call Colorizer#DoColor('', 1, line('$'))
endif
let b:Colorizer_changedtick = b:changedtick
unlet! g:colorizer_only_unfolded
call setpos('.', _c)
endfu
function! Colorizer#ColorLine(force, start, end) "{{{1
if get(b:, 'Colorizer_changedtick', 0) == b:changedtick && empty(a:force)
" nothing to do
return
else
call Colorizer#DoColor(a:force, a:start, a:end)
let b:Colorizer_changedtick = b:changedtick
endif
endfu
function! Colorizer#SwitchContrast() "{{{1
if exists("s:swap_fg_bg") && s:swap_fg_bg
call s:Warn('Contrast Adjustment does not work with swapped foreground colors!')
return
endif
if !exists("s:predefined_fgcolors")
" init variables
call s:ColorInit('')
endif
" make sure, g:colorizer_fgcontrast is set up
if !exists('g:colorizer_fgcontrast')
" Default to black / white
let g:colorizer_fgcontrast = len(s:predefined_fgcolors['dark']) - 1
endif
let g:colorizer_fgcontrast-=1
if g:colorizer_fgcontrast < -1
let g:colorizer_fgcontrast = len(s:predefined_fgcolors['dark']) - 1
endif
echom 'Colorizer: using fgcontrast' g:colorizer_fgcontrast
call Colorizer#DoColor(1, 1, line('$'))
endfu
function! Colorizer#SwitchFGBG() "{{{1
let range = [ 0, 1, -1 ]
if !exists("s:round")
let s:round = 0
else
let s:round = (s:round >= 2 ? 0 : s:round+1)
endif
let s:swap_fg_bg = range[s:round]
call Colorizer#DoColor(1, 1, line('$'))
endfu
" DEBUG TEST "{{{1
if !get(g:, 'colorizer_debug', 0)
let &cpo = s:cpo_save
unlet s:cpo_save
finish
endif
fu! ColorizerXtermColors() "{{{2
let list=[]
for c in range(0, 254)
let css_color = s:Xterm2rgb256(c)
call add(list, css_color)
endfor
return list
endfu
fu! ColorizerGet(args) "{{{2
exe "return s:".a:args
endfu
" Plugin folklore and Vim Modeline " {{{1
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: set foldmethod=marker et fdl=0: