" Vimball Archiver by Charles E. Campbell, Jr., Ph.D. UseVimball finish plugin/ColorizerPlugin.vim [[[1 95 " Plugin: Highlight Colornames and Values " Maintainer: Christian Brabandt " URL: http://www.github.com/chrisbra/color_highlight " Last Change: Thu, 27 Mar 2014 23:12:43 +0100 " Licence: Vim License (see :h License) " Version: 0.10 " GetLatestVimScripts: 3963 10 :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 hsl coloring: hsl(H,V,L) " - fix small bugs " Init some variables "{{{1 " Plugin folklore "{{{2 if v:version < 700 || exists("g:loaded_colorizer") || &cp finish endif let g:loaded_colorizer = 1 let s:cpo_save = &cpo set cpo&vim " helper functions "{{{1 fu! ColorHiArgs(A,L,P) return "syntax\nmatch\nnosyntax\nnomatch" endfu " define commands "{{{1 command! -bang -range=% -nargs=? -complete=custom,ColorHiArgs ColorHighlight \ :call Colorizer#DoColor(, , , ) command! -bang -nargs=1 RGB2Term \ :call Colorizer#RGB2Term() command! -nargs=1 Term2RGB :call Colorizer#Term2RGB() command! -bang ColorClear :call Colorizer#ColorOff() command! -bang ColorToggle :call Colorizer#ColorToggle() command! -nargs=1 HSL2RGB :call Colorizer#HSL2Term() command! ColorContrast :call Colorizer#SwitchContrast() command! ColorSwapFgBg :call Colorizer#SwitchFGBG() " define mappings "{{{1 nnoremap Colorizer :ColorToggle xnoremap Colorizer :ColorHighlight nnoremap ColorContrast :ColorContrast xnoremap ColorContrast :ColorContrast nnoremap ColorFgBg :ColorSwapFgBg xnoremap ColorFgBg :ColorSwapFgBg if get(g:, 'colorizer_auto_map', 0) " only map, if the mapped keys are not yet taken by a different plugin " and the user hasn't mapped the function to different keys if empty(maparg('cC', 'n')) && empty(hasmapto('Colorizer', 'n')) nmap cC Colorizer endif if empty(maparg('cC', 'x')) && empty(hasmapto('Colorizer', 'x')) xmap cC Colorizer endif if empty(maparg('cT', 'n')) && empty(hasmapto('ColorContrast', 'n')) nmap cT ColorContrast endif if empty(maparg('cT', 'x')) && empty(hasmapto('ColorContrast', 'n')) xmap cT ColorContrast endif if empty(maparg('cF', 'n')) && empty(hasmapto('ColorFgBg', 'n')) nmap cF ColorFgBg endif if empty(maparg('cF', 'x')) && empty(hasmapto('ColorFgBg', 'x')) xmap cF ColorFgBg endif endif " Enable Autocommands "{{{1 if exists("g:colorizer_auto_color") " Prevent autoloading exe "call Colorizer#AutoCmds(g:colorizer_auto_color)" endif if exists("g:colorizer_auto_filetype") " Setup some autocommands for specific filetypes. aug FT_ColorizerPlugin au! exe "au Filetype" g:colorizer_auto_filetype \ "call Colorizer#LocalFTAutoCmds(1)\| \ :ColorHighlight" aug END endif " Plugin folklore and Vim Modeline " {{{1 let &cpo = s:cpo_save unlet s:cpo_save " vim: set foldmethod=marker et fdl=0: doc/Colorizer.txt [[[1 432 *Colorizer.txt* A plugin to color colornames and codes Author: Christian Brabandt Version: 0.10 Thu, 27 Mar 2014 23:12:43 +0100 Copyright: (c) 2009-2013 by Christian Brabandt The VIM LICENSE applies to Colorizer.txt (see |copyright|) except use ColorizerPlugin instead of "Vim". NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK. ============================================================================== Contents *Colorizer* ============================================================================== 1. Colorizer Manual.............................|Colorizer-manual| 1.1 :ColorHighlight......................|:ColorHighlight| 1.2 :ColorClear..........................|:ColorClear| 1.3 :RGB2Term............................|:RGB2Term| 1.4 :HSL2RGB.............................|:HSL2RGB| 1.5 :Term2RGB............................|:Term2RGB| 1.6 :ColorContrast.......................|:ColorContrast| 1.7 :ColorSwapFgBg.......................|:ColorSwapFgBg| 1.8 :ColorToggle.........................|:ColorToggle| 2. Configuration................................|Colorizer-config| 2.1 Automatic loading...................|Colorizer-auto| 2.2 Automatically highlight filetypes...|Colorizer-hl-ft| 2.3 Skip coloring comments..............|Colorizer-comments| 2.4 Adjust the contrast.................|Colorizer-contrast| 2.5 Highlight colornames................|Colorizer-hl-names| 2.6 Use X11 colornames..................|Colorizer-names| 2.7 Use syntax highlighting.............|Colorizer-syntax| 2.8 Specify patterns to highlight.......|Colorizer-pattern| 2.9 Colorizing Taskwarrior files........|Colorizer-taskwarrior-files| 2.10 Colorizing vim syntax files.........|Colorizer-vim-files| 2.11 Use custom colornames...............|Colorizer-custom-colornames| 2.12 Colorizing :hi statements...........|Colorizer-vim-hi| 3. Colorizer Mappings...........................|Colorizer-maps| 4. Colorizer Tips...............................|Colorizer-tips| 5. Colorizer Feedback...........................|Colorizer-feedback| 6. Colorizer History............................|Colorizer-history| ============================================================================== 1. Colorizer Manual *Colorizer-manual* ============================================================================== Functionality This plugin is based on the css_color plugin by Nikolaus Hofer. The idea is to highlight color names and codes in the same color that they represent. The plugin understands the W3C colors (used for CSS files for example), the color names from the X11 Window System and also codes in hex notation, like #FF0000 (which represents Red in the RGB color system). Additionally, it supports the CSS color specifications, e.g. rgb(RR,GG,BB) color representation in either absolute or percentage values and also the HVL color representation like hvl(H,V,L) It works best in the gui version of Vim, but the plugin also supports 256 and 88 color terminals and translates the colors to those supported by the terminal. 16 and 8 color terminals should work theoretically too, but have not been widely tested. Note that translating the colors to the terminal might impose a performance penalty, depending on the terminal type and the number of matches in the file. This plugin defines the following commands: *:ColorHighlight* :[range]ColorHighlight[!] [args] Scan the lines given by [range] for color code names and highlight those. If [range] is omitted, the whole file will be scanned. If the ! is used, the plugin will redefine all highlighting groups. If ! is not used, it will skip patterns, that would take too long and make Vim unresponsive. [args] can by any of "syntax" or "match". "syntax" means to convert the highlighting to syntax highlighting. This is useful, so a plugin like |2html.vim| can convert the colors correctly to HTML. The default is "match", which uses the |matchadd()| function. (Prepending "no" is supported and will disable that setting and use the opposite). *:ColorClear* :ColorClear Turn off color highlighting. *:RGB2Term* :RGB2Term Translate the color code given as argument to the closest color that can be displayed in the terminal. The color must be given in the format #RRGGBB (the hex format of the colors red, green and blue (the '#' is optional), or alternatively like rgb(X,X,X) Uses the number of colors your terminal is capable of (or 256 colors for gVim). *:HSL2RGB* :HSL2RGB hsl(h,v,l) Translate the HVL color defined by the string 'hsl(h,v%,l%)' into a color that the current terminal can display. Note that the color must be given in the format 'hsl(HH, V, L)' where HH defines the Hue as absolute value between 0 and 255 and V and L represent a percentage for value and Lightness. *:Term2RGB* :Term2RGB number Translate terminal color to an RGB color (using the xterm 256 color cube). *:ColorContrast* :ColorContrast Switch between all different color contrast settings (foreground colors). *:ColorSwapFgBg* :ColorSwapFgBg Switch between foreground and background colors. This will toggle in 3 ways. From Swapping foreground and background colors, to only highlighting the foreground color back to normal foreground background color. *:ColorToggle* :ColorToggle Switch between highlighting colors and no highlighting. ============================================================================== 2 Colorizer Configuration *Colorizer-config* ============================================================================== 2.1 Automatic loading *Colorizer-auto* --------------------- The Colorizer plugin can be configured to automatically load when opening a new file. Note that this might slow down the loading process, especially on the terminal. To enable this, simply set the variable 'g:colorizer_auto_color' to 1, e.g. by defining it in your |.vimrc| > :let g:colorizer_auto_color = 1 < (Not recommended, see below at |Colorizer-hl-ft| for the preferred way) 2.2 Automatically highlight filetypes *Colorizer-hl-ft* ------------------------------------- If you want to have certain filetypes automatically highlighted, you can use the variable g:colorizer_auto_filetype, e.g. to enable highlighting for HTML and CSS files by default, add the following to your |.vimrc|: > :let g:colorizer_auto_filetype='css,html' < After restarting Vim, the plugin will become active whenever the filetype is set to either html or css. 2.3 Skip coloring comments *Colorizer-comments* -------------------------- You can skip comments from being colored by setting the variable g:colorizer_skip_comments to 1: > :let g:colorizer_skip_comments = 1 < The plugin will skip all matches of color codes and names that appear inside comments (this only works when syntax highlighting is enabled |:syn-on|) Note however, that if the same color is used inside comments and outside comments, it will also be highlighted inside the comments, because coloring is done matching only the color pattern and once this is done outside of comments, this will also match inside comments. 2.4 Adjust the contrast *Colorizer-contrast* ----------------------- Colorizer can be adjusted to blur the contrast between foreground and background color. For this, the variable 'g:colorizer_fgcontrast' can be used. It can be given any value between -1 and 2 with 2 being the default. Each smaller value will decrease the contrast a little bit, with -1 being special, as there is the foreground color equals the background color. Use |:ColorContrast| to cycle through the different values. 2.5 Highlight colornames *Colorizer-hl-names* ------------------------ If for any reason you don't want the plugin to highlight colornames, you can prevent this by setting the g:colorizer_colornames variable to 0, e.g. put > :let g:colorizer_colornames = 0 < into your |.vimrc| 2.6 Use X11 colornames *Colorizer-names* ---------------------- Colorizer can be configured to support all color names defined by the X11 Window System. By default it only supports the colors defined by the W3C for the CSS specification. To use the X11 color names, set the variable 'g:colorzer_x11_names' to 1, e,g. put in your |.vimrc| > let g:colorizer_x11_names = 1 < 2.7 Use syntax highlighting *Colorizer-syntax* --------------------------- The plugin by default uses the |matchadd()| functions for highlighting colors on the fly. Unfortunately, this is a problem, if you want to have the result successfully transformed to a HTML file using the |2html.vim| plugin. Therefore, the Colorizer plugin can also convert the highlighting to correct syntax highlighting. Use either the > :ColorHighlight syntax < command (see |:ColorHighlight|) or set the variable 'g:colorizer_syntax' to 1, e.g. in your |.vimrc| put > let g:colorizer_syntax = 1 < 2.8 Specify pattern to highlight *Colorizer-pattern* -------------------------------- By default, Colorizer detects the following patterns and highlights them as hex colors (for better readability it is separated into 3 parts): > # %(\x\{3}\|\x\{6}\) \%(\>\|[-_]\)\@=/' < This means it always looks for a '#' followed by either a 3 or 6 hexadecimal digits denoting the RGB hex color codes, followed by either the word-boundary (|/\>|), a hyphen or a underscore. But only the first and middle part will be highlighted (i.e. the RGB color codes). You can of course specify a different pattern for your needs by setting the g:colorizer_hex_pattern variable. e.g. to display '#RRGGBB' and have all of it highlighted, use > let g:colorizer_hex_pattern = ['#', '\%(\x\{3}\|\x\{6}\)', ''] 2.9 Colorizing Taskwarrior files *Colorizer-taskwarrior-files* -------------------------------- For taskwarrior files, this plugin can also highlight those colors. By default, this will only work, if the file name ends with '.theme' For an example, see this website: http://taskwarrior.org/news/182 2.10 Colorizing vim syntax files *Colorizer-vim-files* -------------------------------- Colorizer also supports highlighting vim syntax files. For this to work, the 'filetype' must be set to vim, then the plugin tries to identify the colors and highlight them. 2.11 Use custom colornames *Colorizer-custom-colornames* -------------------------- You can add separate colornames to be colored. For this to work, set the variable g:colorizer_custom_colors to your liking, e.g. like this: > let g:colorizer_custom_colors = { 'blue': '#ff0000'} Guess what, this will color the word blue in red. 2.12 Colorizing :highlight statements *Colorizer-vim-hi* ------------------------------------- Colorizer also supports highlighting |:hi| statements, that are used by vim colorschemes and syntax files as well as a dump of the |:hi| command To colorizer :hi statements, the 'filetype' must be set to vim, while for :hi dumps, the 'filetype' must be empty. ============================================================================== 3. Colorizer Mappings *Colorizer-maps* ============================================================================== By default, the Colorizer plugin does not map any key, so that it won't pollute the global mapping namespace. If you want however to have the following default maps set up, set the global variable g:colorizer_auto_map in your |.vimrc| like this: > :let g:colorizer_auto_map = 1 < This will set up the following key mappings (if they are not already taken): Keys Name Function ---- ---- -------- cC Colorizer Toggle highlighting of Colors. In visual mode it only highlights the colors in the selected region (normal and visual mode). cT ColorContrast Cycle through contrast setting |:ColorContrast| (normal and visual mode) cF ColorFgBg Toggle foreground and background color |:ColorSwapFgBg| It uses the prefix c to set all functionality up. By default, is defined as '\' (||). Use the name provided in the second column to map the function to a different key. ============================================================================== 4. Colorizer Tips *Colorizer-tips* ============================================================================== You can enable the plugin to be loaded for certain filetypes automatically. This makes sense for example for CSS files or HTML files. To do so, create the following autocommand in your |.vimrc| > :au BufNewFile,BufRead *.css,*.html,*.htm :ColorHighlight! < This will automatically highlight all existing color codes and names if you edit either a HTML file or a CSS file. Note that this does not update the highlighting, after you have been changing the file. The recommended way to do this is to use the g:colorizer_auto_filetype variable and set this to the desired filetypes. |Colorizer-hl-ft| ============================================================================== 5. Colorizer Feedback *Colorizer-feedback* ============================================================================== Feedback is always welcome. If you like the plugin, please rate it at the vim-page: http://www.vim.org/scripts/script.php?script_id=3963 You can also follow the development of the plugin at github: http://github.com/chrisbra/color_highlight Bugs can also be reported there: https://github.com/chrisbra/color_highlight/issues Alternatively, you can also report any bugs to the maintainer, mentioned in the third line of this document. Please don't hesitate to contact me, I won't bite ;) If you like the plugin, write me an email (look in the third line for my mail address). And if you are really happy, vote for the plugin and consider looking at my Amazon whishlist: http://www.amazon.de/wishlist/2BKAHE8J7Z6UW ============================================================================== 6. Colorizer History *Colorizer-history* ============================================================================== 0.10 Mar 27, 2014 {{{1 - Also highlight Ansi Term sequences - Match colornames using the "old" RE Engine, if Vim supports it. - Make |:RGB2Xterm| output the color name in its color - Rename |:RGB2Xterm| to |:RGB2Term| - Highlight Taskwarrior file - Code refactoring - Make |:ColorSwapFgBg| work as expected (did not always toggle reliably between all states) - Correctly parse Ansi Term colors - |:Term2RGB| - Highlight Vim color files correctly - merge colorhighlight plugin https://github.com/blueyed/colorhighlight.vim 0.9: Aug 14, 2013: {{{1 - https://github.com/chrisbra/color_highlight/issues/15 (rgba highlighting didn't work for floating point value of alpha, reported by LiTuX.S, thanks!) - https://github.com/chrisbra/color_highlight/issues/16 (rgb() pattern did match too much, reported by taecilla, thanks!) - https://github.com/chrisbra/color_highlight/issues/19 (error on calling ColorWinEnter() command, reported by wedgwood, thanks!) - https://github.com/chrisbra/color_highlight/issues/20 and https://github.com/chrisbra/color_highlight/issues/21 (also color on split commands, reported by wedgwood and Andri Möll, Thanks!) - https://github.com/chrisbra/color_highlight/issues/22 (Make sure, patterns like white-space won't get colored, reported by Andri Möll, Thanks!) - https://github.com/chrisbra/color_highlight/issues/23 (ColorToggle got confused when several windows with highlighting exists, reported by Andri Möll, Thanks!) - https://github.com/chrisbra/color_highlight/issues/24 (turning off coloring should also remove the autocommands, reported by Andri Möll, Thanks!) 0.8: Dec 14, 2012 {{{1 - https://github.com/chrisbra/color_highlight/issues/13 (colorizing should not stop at word-boundaries, reported by teschmitz, thanks!) - https://github.com/chrisbra/color_highlight/issues/14 (convert highlighting to syntax groups, so TOhtml works, reported by teschmitz, thanks!) 0.7: Jul 25, 2012 {{{1 - Highlight rgb colors with whitespace after comma (reported by sergey-vlasov in https://github.com/chrisbra/color_highlight/issues/12, thanks!) - Save and restore the search register, so the plugin doesn't clobber it - check for 'ed' and 'gd' defaults 0.6: May 17, 2012 {{{1 - Fix various issues with hsl coloring (reported by teschmitz in https://github.com/chrisbra/color_highlight/issues/9, thanks!) - Make it possible, to skip coloring comments (reported by teschmitz in https://github.com/chrisbra/color_highlight/issues/10, thanks!) - search highlighting should overrule color highlighting(reported by teschmitz in https://github.com/chrisbra/color_highlight/issues/11, thanks!) - updated documentation (suggested by teschmitz, thanks!) 0.5: Apr 03, 2012 {{{1 - Fix issue 7 (reported by teschmitz in https://github.com/chrisbra/color_highlight/issues/7, thanks!) 0.4: Mar, 23, 2012 {{{1 - |:ColorSwapFgBg| (suggested by teschmitz, in https://github.com/chrisbra/color_highlight/issues/3, thanks!) - make automatic color loading work (reported by wedgwood in https://github.com/chrisbra/color_highlight/issues/6, thanks!) |Colorizer-auto| and |Colorizer-hl-ft| - more documentation updates - added Mappings (suggested by Ingo Karkat, thanks!) |Colorizer-maps| - prevent highlighting of color names (suggested by Tarlika Schmitz in https://github.com/chrisbra/color_highlight/issues/5, thanks!) |Colorizer-hl-names| - enable filetype specific autocommands, so that for certain filetypes colors are highlighted automatically |Colorizer-hl-ft| (suggested by Tarlika Schmitz, thanks!) 0.3: Mar 15, 2012 {{{1 - Use the g:colorizer_fgcontrast variable to have lesser contrast between foreground and background colors (patch by Ingo Karkat, thanks!) - gvim did not color rgb(...) codes - did not correctly highlight 3 letter color codes (issue https://github.com/chrisbra/color_highlight/issues/1, reported by Taybin Rutkin, thanks!) - support autoloading (requested by Ingo Karkat, thanks!) - add |GLVS| support - |:ColorContrast| to interactively switch between contrast settings (suggested by Ingo Karkat, thanks!) 0.2: Mar 02, 2012 {{{1 - Initial upload - development versions are available at the github repository - put plugin on a public repository (http://github.com/chrisbra/color_highlight) 0.1: Mar 02, 2012 {{{1 - first internal version }}} ============================================================================== Modeline: vim:tw=78:ts=8:ft=help:et:fdm=marker:fdl=0:norl autoload/Colorizer.vim [[[1 2397 " Plugin: Highlight Colornames and Values " Maintainer: Christian Brabandt " URL: http://www.github.com/chrisbra/color_highlight " Last Change: Thu, 27 Mar 2014 23:12:43 +0100 " Licence: Vim License (see :h License) " Version: 0.10 " GetLatestVimScripts: 3963 10 :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 let s:debug = 0 " 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 (expand("$ComSpec") =~# '^\%(command\.com\|cmd\.exe\)$' && \ !has("gui_running")) || \ (exists("$ConEmuPID") && \ expand("$ConEmuANSI") ==# "OFF") || \ (expand("$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' \ } function! s:IsInComment() "{{{1 return s:skip_comments && \ synIDattr(synIDtrans(synID(line('.'), col('.'),1)), 'name') == "Comment" endfu function! s:PreviewColorName(color) "{{{1 let name=tolower(a:color) let clr = s:colors[name] " Skip color-name, e.g. white-space property call s:SetMatcher('-\@\c-\@!', {'bg': clr[1:]}) endfu function! s:PreviewColorHex(match) "{{{1 if 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 && !has("gui_running") " 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 call s:SetMatcher(s:hex_pattern[0]. pattern. s:hex_pattern[2], {'bg': color}) endfunction function! s:PreviewColorTerm(pre, text, post) "{{{1 " a:pre: Ansi-Sequences determining the highlighting " a:text: Text to color " a:post: Ansi-Sequences resetting the coloring (might be empty) let color = s:Ansi2Color(a:pre) let clr_Dict = {} if &t_Co == 8 && !has("gui_running") " 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 pattern = '\%('. a:pre. '\)\@<='.escape(a:text, '\^$.*~[]'). '\('.a:post.'\)\@=' call s:SetMatcher(pattern, clr_Dict) endfunction function! s:PreviewTaskWarriorColors(submatch) "{{{1 " a:submatch is something like 'black on rgb141' " this highlighting should overrule e.g. colorname highlighting 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 endtry endfunction function! s:PreviewVimColors(submatch) "{{{1 " a:submatch is something like 'black on rgb141' " this highlighting should overrule e.g. colorname highlighting 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) 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) "{{{1 " highlights dumps of :hi " e.g "SpecialKey xxx term=bold cterm=bold ctermfg=124 guifg=Cyan 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 = 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) "{{{1 " like colorhighlight plugin, " colorizer highlight statements in .vim files 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 " HtmlHiLink / HiLink line? let match = matchlist(tmatch, '\C\%[Html\]HiLink\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: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:ColorInit(...) "{{{1 let s:force_hl = !empty(a:1) 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('PreviewColorHex'), " \ 'rgba\=(\s*\%(\d\+%\?\D*\)\{3,4})': " \ function('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 let s:keeppatterns = v:version > 704 || v:version == 704 && has("patch38") " 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 !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 if !exists("s:conceal") && has("conceal") let s:conceal = [&l:cole, &l:cocu] endif let s:hex_pattern = get(g:, 'colorizer_hex_pattern', \ ['#', '\%(\x\{3}\|\x\{6}\)', '\%(\>\|[-_]\)\@=']) if has("gui_running") || &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(SynID(w:match_list[0].group)) && !s:force_hl))) let s:force_hl = 1 endif if &t_Co > 16 || has("gui_running") 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 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,4})', \ function("s:ColorRGBValues"), '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], \ 'vimhighlight_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_vimhighlight_dump', 'empty(&ft)' ] \ } let s:color_patterns_special = { \ 'term': ['\%(\%x1b\[0m\)\?\(\%(\%x1b\[\d\+\%(;\d\+\)*m\)\+\)\([^\e]*\)\(\%x1b\[0m\)\=', \ function("s:PreviewColorTerm"), 'colorizer_term'], \ 'term_conceal': ['\(\%(\%x1b\[0m\)\?\%x1b\[\d\+\%(;\d\+\)*m\)', '', \ 'colorizer_term_conceal' ] } if exists("s:colornamepattern") && s:color_names let s:color_patterns["colornames"] = [ s:colornamepattern, \ function("s:PreviewColorName"), 'colorizer_names', 1] endif 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 = 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 = 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]) 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 !has("gui_running") let fg = get(a:Dict, 'ctermfg', '') let bg = get(a:Dict, 'ctermbg', '') let [fg, bg] = s:SwapColors([fg, bg]) if !empty(string(bg)) && !empty(string(fg)) let hi.= printf(' ctermfg=%s ctermbg=%s', fg, bg) 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, ...) 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 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) endif if !has_key(result, 'fg') && has_key(result, 'ctermfg') let result.fg = s:Term2RGB(result.ctermfg) 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:Rgb2xterm(result.fg) endif if !has_key(result, 'ctermbg') && \ has_key(result, 'bg') let result.ctermbg = s:Rgb2xterm(result.bg) endif endif 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 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=~ '.*3[0-7]\(;1\)\?[m;]' let check[0] = 1 else let fground = "NONE" endif if a:chars=~ '.*4[0-7]\(;1\)\?[m;]' let check[1] = 1 else let bground = "NONE" endif 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 return [fground, bground] endfunction function! s:TermConceal(pattern) "{{{1 if has("conceal") exe "syn match ColorTermESC /". a:pattern. "/ conceal containedin=ALL" setl cocu=nv cole=2 endif endfu function! s:GetColorPattern(list) "{{{1 let list = map(copy(a:list), ' ''\%(-\@-\@!\)'' ') " Force the old re engine. It should be faster without backtracking. return '\%#=1'.join(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 let bg = SynID('Normal', 'bg') if empty(bg) || !has('float') return a:rgb[0:3] else if (bg =~? '\d\{1,3}') && bg < 256 " Xterm color code 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:ColorRGBValues(val) "{{{1 if 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 " drop alpha channel " call remove(rgb, 3) 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) "{{{1 if 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: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)) 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: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 if len(hsl) == 4 " drop alpha channel call remove(hsl, 3) endif 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 return s:HSL2RGB(hsl[0], hsl[1], hsl[2]) endfu function! s:SyntaxMatcher(enable) "{{{1 if !a:enable return endif let did_clean = {} for hi in s:GetMatchList() if !get(did_clean, hi.group, 0) let did_clean[hi.group] = 1 exe "sil! syn clear" hi.group endif if a:enable exe "syn match" hi.group "excludenl /". hi.pattern. "/ display containedin=ALL" " 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") && has("conceal") let [&l:cole, &l:cocu] = s:conceal endif unlet! w:match_list s:conceal endfu function! Colorizer#DoColor(force, line1, line2, ...) "{{{1 " initialize plugin try if v:version < 704 call s:Warn("Colorizer needs Vim 7.4") 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', '@/']) " 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 || has("gui_running") " 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) if !get(g:, Pat[2], 1) || (get(s:, Pat[2]. '_disable', 0) > 0) " Coloring disabled continue endif " 4th element in pattern is condition, that must be fullfilled, " before we continue if !empty(Pat[3]) && !eval(Pat[3]) continue endif " Check, the pattern isn't too costly... if s:CheckTimeout(Pat[0], a:force) && !s:IsInComment() let cmd = printf(':sil %s %d,%d%ss/%s/'. \ '\=call(Pat[1], [submatch(0)])/egin', \ (s:keeppatterns ? "keeppatterns" : ''), \ a:line1, a:line2, \ s:color_unfolded, Pat[0]) try if Pat[2] ==# 'colorizer_vimhighlight' && has('windows') \ && has('syntax') && !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 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 endif for Pat in [ s:color_patterns_special.term ] 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 let cmd = printf(':sil %s %d,%d%ss/%s/'. \ '\=call(Pat[1],[submatch(1),submatch(2),submatch(3)])/egin', \ (s:keeppatterns ? "keeppatterns" : ''), \ a:line1, a:line2, s:color_unfolded, Pat[0]) try exe cmd " Hide ESC Terminal Chars call s:TermConceal(s:color_patterns_special.term_conceal[0]) 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#") && empty(error) " Initialise current window. call Colorizer#LocalFTAutoCmds(1) call Colorizer#ColorWinEnter(1) endif if !empty(error) " Some error occured, stop trying to color the file call Colorizer#ColorOff() call s:Warn("Some error occured here: ". error) endif call s:SaveRestoreOptions(0, save, []) call winrestview(_a) endfu function! Colorizer#RGB2Term(arg) "{{{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 let tcolor = s:Rgb2xterm(color) call s:DoHlGroup("Color_". color[1:], s:GenerateColors({'bg': color[1:]})) exe "echohl" "Color_".color[1:] echo a:arg. " => ". tcolor echohl None 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 aug Colorizer au! au CursorHold,CursorHoldI,InsertLeave * silent call \ Colorizer#DoColor('', line('w0'), line('w$')) "au GUIEnter,BufWinEnter * silent call " \ Colorizer#DoColor('', 1, line('$')) au GUIEnter * silent call Colorizer#DoColor('!', 1, line('$')) au WinEnter,BufWinEnter * silent call Colorizer#ColorWinEnter() au ColorScheme * silent call Colorizer#DoColor('!', 1, line('$')) if get(g:, 'colorizer_cursormoved', 0) au CursorMoved,CursorMovedI * call Colorizer#ColorLine() endif aug END else aug Colorizer au! aug END aug! Colorizer endif endfu function! Colorizer#LocalFTAutoCmds(enable) "{{{1 if a:enable aug FTColorizer au! au CursorHold,CursorHoldI,InsertLeave silent call \ Colorizer#DoColor('', line('w0'), line('w$')) au CursorMoved,CursorMovedI call Colorizer#ColorLine() au WinEnter,BufWinEnter silent call Colorizer#ColorWinEnter() au GUIEnter,ColorScheme silent \ call Colorizer#DoColor('!', 1, line('$')) 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('.') call Colorizer#DoColor('', 1, line('$')) let b:Colorizer_changedtick = b:changedtick unlet! g:colorizer_only_unfolded call setpos('.', _c) endfu function! Colorizer#ColorLine() "{{{1 if get(b:, 'Colorizer_changedtick', 0) == b:changedtick " nothing to do return else call Colorizer#DoColor('', line('.'),line('.')) 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 " 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 !s:debug let &cpo = s:cpo_save unlet s:cpo_save finish endif fu! Test1() "{{{2 return map(range(0,254), 's:Xterm2rgb256(v:val)') endfu " fu! Test2() "{{{2 let list=[] for c in range(0, 254) let css_color = s:Xterm2rgb256(c) call add(list, css_color) endfor return list endfu " Plugin folklore and Vim Modeline " {{{1 let &cpo = s:cpo_save unlet s:cpo_save " vim: set foldmethod=marker et fdl=0: