1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: X Pixmap v2 3071d4279SBram Moolenaar" Maintainer: Steve Wall ([email protected]) 4*3df0173fSBram Moolenaar" Last Change: 2017 Feb 01 5c873442bSBram Moolenaar" (Dominique Pelle added @Spell) 6071d4279SBram Moolenaar" Version: 5.8 7*3df0173fSBram Moolenaar" Jemma Nelson added termguicolors support 8071d4279SBram Moolenaar" 9071d4279SBram Moolenaar" Made from xpm.vim by Ronald Schild <[email protected]> 10071d4279SBram Moolenaar 1189bcfda6SBram Moolenaar" quit when a syntax file was already loaded 1289bcfda6SBram Moolenaarif exists("b:current_syntax") 13071d4279SBram Moolenaar finish 14071d4279SBram Moolenaarendif 15071d4279SBram Moolenaar 16b8ff1fb5SBram Moolenaarlet s:cpo_save = &cpo 17b8ff1fb5SBram Moolenaarset cpo&vim 18b8ff1fb5SBram Moolenaar 19071d4279SBram Moolenaarsyn region xpm2PixelString start="^" end="$" contains=@xpm2Colors 20071d4279SBram Moolenaarsyn keyword xpm2Todo TODO FIXME XXX contained 21c873442bSBram Moolenaarsyn match xpm2Comment "\!.*$" contains=@Spell,xpm2Todo 22071d4279SBram Moolenaar 23071d4279SBram Moolenaar 24071d4279SBram Moolenaarcommand -nargs=+ Hi hi def <args> 25071d4279SBram Moolenaar 26*3df0173fSBram Moolenaarif has("gui_running") || has("termguicolors") && &termguicolors 27071d4279SBram Moolenaar 28071d4279SBram Moolenaar let color = "" 29071d4279SBram Moolenaar let chars = "" 30071d4279SBram Moolenaar let colors = 0 31071d4279SBram Moolenaar let cpp = 0 32071d4279SBram Moolenaar let n = 0 33071d4279SBram Moolenaar let i = 1 34071d4279SBram Moolenaar 35071d4279SBram Moolenaar while i <= line("$") " scanning all lines 36071d4279SBram Moolenaar 37071d4279SBram Moolenaar let s = getline(i) 38071d4279SBram Moolenaar if match(s,"\!.*$") != -1 39071d4279SBram Moolenaar let s = matchstr(s, "^[^\!]*") 40071d4279SBram Moolenaar endif 41071d4279SBram Moolenaar if s != "" " does line contain a string? 42071d4279SBram Moolenaar 43071d4279SBram Moolenaar if n == 0 " first string is the Values string 44071d4279SBram Moolenaar 45071d4279SBram Moolenaar " get the 3rd value: colors = number of colors 46071d4279SBram Moolenaar let colors = substitute(s, '\s*\d\+\s\+\d\+\s\+\(\d\+\).*', '\1', '') 47071d4279SBram Moolenaar " get the 4th value: cpp = number of character per pixel 48071d4279SBram Moolenaar let cpp = substitute(s, '\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*', '\1', '') 493577c6faSBram Moolenaar if cpp =~ '[^0-9]' 503577c6faSBram Moolenaar break " if cpp is not made of digits there must be something wrong 513577c6faSBram Moolenaar endif 52071d4279SBram Moolenaar 533577c6faSBram Moolenaar " Highlight the Values string as normal string (no pixel string). 543577c6faSBram Moolenaar " Only when there is no slash, it would terminate the pattern. 553577c6faSBram Moolenaar if s !~ '/' 56071d4279SBram Moolenaar exe 'syn match xpm2Values /' . s . '/' 573577c6faSBram Moolenaar endif 58f37506f6SBram Moolenaar hi def link xpm2Values Statement 59071d4279SBram Moolenaar 60071d4279SBram Moolenaar let n = 1 " n = color index 61071d4279SBram Moolenaar 62071d4279SBram Moolenaar elseif n <= colors " string is a color specification 63071d4279SBram Moolenaar 64071d4279SBram Moolenaar " get chars = <cpp> length string representing the pixels 65071d4279SBram Moolenaar " (first incl. the following whitespace) 66071d4279SBram Moolenaar let chars = substitute(s, '\(.\{'.cpp.'}\s\+\).*', '\1', '') 67071d4279SBram Moolenaar 68071d4279SBram Moolenaar " now get color, first try 'c' key if any (color visual) 69071d4279SBram Moolenaar let color = substitute(s, '.*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*', '\1', '') 70071d4279SBram Moolenaar if color == s 71071d4279SBram Moolenaar " no 'c' key, try 'g' key (grayscale with more than 4 levels) 72071d4279SBram Moolenaar let color = substitute(s, '.*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*', '\1', '') 73071d4279SBram Moolenaar if color == s 74071d4279SBram Moolenaar " next try: 'g4' key (4-level grayscale) 75071d4279SBram Moolenaar let color = substitute(s, '.*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*', '\1', '') 76071d4279SBram Moolenaar if color == s 77071d4279SBram Moolenaar " finally try 'm' key (mono visual) 78071d4279SBram Moolenaar let color = substitute(s, '.*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*', '\1', '') 79071d4279SBram Moolenaar if color == s 80071d4279SBram Moolenaar let color = "" 81071d4279SBram Moolenaar endif 82071d4279SBram Moolenaar endif 83071d4279SBram Moolenaar endif 84071d4279SBram Moolenaar endif 85071d4279SBram Moolenaar 86071d4279SBram Moolenaar " Vim cannot handle RGB codes with more than 6 hex digits 87071d4279SBram Moolenaar if color =~ '#\x\{10,}$' 88071d4279SBram Moolenaar let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g') 89071d4279SBram Moolenaar elseif color =~ '#\x\{7,}$' 90071d4279SBram Moolenaar let color = substitute(color, '\(\x\x\)\x', '\1', 'g') 91071d4279SBram Moolenaar " nor with 3 digits 92071d4279SBram Moolenaar elseif color =~ '#\x\{3}$' 93071d4279SBram Moolenaar let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '') 94071d4279SBram Moolenaar endif 95071d4279SBram Moolenaar 96071d4279SBram Moolenaar " escape meta characters in patterns 97071d4279SBram Moolenaar let s = escape(s, '/\*^$.~[]') 98071d4279SBram Moolenaar let chars = escape(chars, '/\*^$.~[]') 99071d4279SBram Moolenaar 100071d4279SBram Moolenaar " change whitespace to "\s\+" 101071d4279SBram Moolenaar let s = substitute(s, "[ \t][ \t]*", "\\\\s\\\\+", "g") 102071d4279SBram Moolenaar let chars = substitute(chars, "[ \t][ \t]*", "\\\\s\\\\+", "g") 103071d4279SBram Moolenaar 104071d4279SBram Moolenaar " now create syntax items 105071d4279SBram Moolenaar " highlight the color string as normal string (no pixel string) 106071d4279SBram Moolenaar exe 'syn match xpm2Col'.n.'Def /'.s.'/ contains=xpm2Col'.n.'inDef' 107f37506f6SBram Moolenaar exe 'hi def link xpm2Col'.n.'Def Constant' 108071d4279SBram Moolenaar 109071d4279SBram Moolenaar " but highlight the first whitespace after chars in its color 110071d4279SBram Moolenaar exe 'syn match xpm2Col'.n.'inDef /^'.chars.'/hs=s+'.(cpp).' contained' 111f37506f6SBram Moolenaar exe 'hi def link xpm2Col'.n.'inDef xpm2Color'.n 112071d4279SBram Moolenaar 113071d4279SBram Moolenaar " remove the following whitespace from chars 114071d4279SBram Moolenaar let chars = substitute(chars, '\\s\\+$', '', '') 115071d4279SBram Moolenaar 116071d4279SBram Moolenaar " and create the syntax item contained in the pixel strings 117071d4279SBram Moolenaar exe 'syn match xpm2Color'.n.' /'.chars.'/ contained' 118071d4279SBram Moolenaar exe 'syn cluster xpm2Colors add=xpm2Color'.n 119071d4279SBram Moolenaar 120071d4279SBram Moolenaar " if no color or color = "None" show background 121071d4279SBram Moolenaar if color == "" || substitute(color, '.*', '\L&', '') == 'none' 122071d4279SBram Moolenaar exe 'Hi xpm2Color'.n.' guifg=bg guibg=NONE' 1233577c6faSBram Moolenaar elseif color !~ "'" 124071d4279SBram Moolenaar exe 'Hi xpm2Color'.n." guifg='".color."' guibg='".color."'" 125071d4279SBram Moolenaar endif 126071d4279SBram Moolenaar let n = n + 1 127071d4279SBram Moolenaar else 128071d4279SBram Moolenaar break " no more color string 129071d4279SBram Moolenaar endif 130071d4279SBram Moolenaar endif 131071d4279SBram Moolenaar let i = i + 1 132071d4279SBram Moolenaar endwhile 133071d4279SBram Moolenaar 134071d4279SBram Moolenaar unlet color chars colors cpp n i s 135071d4279SBram Moolenaar 136*3df0173fSBram Moolenaarendif " has("gui_running") || has("termguicolors") && &termguicolors 137071d4279SBram Moolenaar 138071d4279SBram Moolenaar" Define the default highlighting. 13989bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet 140071d4279SBram Moolenaar" The default highlighting. 141f37506f6SBram Moolenaarhi def link xpm2Type Type 142f37506f6SBram Moolenaarhi def link xpm2StorageClass StorageClass 143f37506f6SBram Moolenaarhi def link xpm2Todo Todo 144f37506f6SBram Moolenaarhi def link xpm2Comment Comment 145f37506f6SBram Moolenaarhi def link xpm2PixelString String 14689bcfda6SBram Moolenaar 147071d4279SBram Moolenaardelcommand Hi 148071d4279SBram Moolenaar 149071d4279SBram Moolenaarlet b:current_syntax = "xpm2" 150071d4279SBram Moolenaar 151b8ff1fb5SBram Moolenaarlet &cpo = s:cpo_save 152b8ff1fb5SBram Moolenaarunlet s:cpo_save 153071d4279SBram Moolenaar" vim: ts=8:sw=2:noet: 154