1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: X Pixmap 3071d4279SBram Moolenaar" Maintainer: Ronald Schild <[email protected]> 4*6e649224SBram Moolenaar" Last Change: 2021 Oct 04 5071d4279SBram Moolenaar" Version: 5.4n.1 63df0173fSBram Moolenaar" Jemma Nelson added termguicolors support 7*6e649224SBram Moolenaar" Dominique Pellé fixed spelling support 8071d4279SBram Moolenaar 989bcfda6SBram Moolenaar" quit when a syntax file was already loaded 1089bcfda6SBram Moolenaarif exists("b:current_syntax") 11071d4279SBram Moolenaar finish 12071d4279SBram Moolenaarendif 13071d4279SBram Moolenaar 14*6e649224SBram Moolenaarsyn spell notoplevel 15*6e649224SBram Moolenaar 16071d4279SBram Moolenaarsyn keyword xpmType char 17071d4279SBram Moolenaarsyn keyword xpmStorageClass static 18071d4279SBram Moolenaarsyn keyword xpmTodo TODO FIXME XXX contained 19*6e649224SBram Moolenaarsyn region xpmComment start="/\*" end="\*/" contains=xpmTodo,@Spell 20071d4279SBram Moolenaarsyn region xpmPixelString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@xpmColors 21071d4279SBram Moolenaar 223df0173fSBram Moolenaarif has("gui_running") || has("termguicolors") && &termguicolors 23071d4279SBram Moolenaar 24071d4279SBram Moolenaarlet color = "" 25071d4279SBram Moolenaarlet chars = "" 26071d4279SBram Moolenaarlet colors = 0 27071d4279SBram Moolenaarlet cpp = 0 28071d4279SBram Moolenaarlet n = 0 29071d4279SBram Moolenaarlet i = 1 30071d4279SBram Moolenaar 31071d4279SBram Moolenaarwhile i <= line("$") " scanning all lines 32071d4279SBram Moolenaar 33071d4279SBram Moolenaar let s = matchstr(getline(i), '".\{-1,}"') 34071d4279SBram Moolenaar if s != "" " does line contain a string? 35071d4279SBram Moolenaar 36071d4279SBram Moolenaar if n == 0 " first string is the Values string 37071d4279SBram Moolenaar 38071d4279SBram Moolenaar " get the 3rd value: colors = number of colors 39071d4279SBram Moolenaar let colors = substitute(s, '"\s*\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '') 40071d4279SBram Moolenaar " get the 4th value: cpp = number of character per pixel 41071d4279SBram Moolenaar let cpp = substitute(s, '"\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '') 42446cb837SBram Moolenaar if cpp =~ '[^0-9]' 43446cb837SBram Moolenaar break " if cpp is not made of digits there must be something wrong 44446cb837SBram Moolenaar endif 45071d4279SBram Moolenaar 46446cb837SBram Moolenaar " Highlight the Values string as normal string (no pixel string). 47446cb837SBram Moolenaar " Only when there is no slash, it would terminate the pattern. 48446cb837SBram Moolenaar if s !~ '/' 49071d4279SBram Moolenaar exe 'syn match xpmValues /' . s . '/' 50446cb837SBram Moolenaar endif 51071d4279SBram Moolenaar hi link xpmValues String 52071d4279SBram Moolenaar 53071d4279SBram Moolenaar let n = 1 " n = color index 54071d4279SBram Moolenaar 55071d4279SBram Moolenaar elseif n <= colors " string is a color specification 56071d4279SBram Moolenaar 57071d4279SBram Moolenaar " get chars = <cpp> length string representing the pixels 58071d4279SBram Moolenaar " (first incl. the following whitespace) 59071d4279SBram Moolenaar let chars = substitute(s, '"\(.\{'.cpp.'}\s\).*"', '\1', '') 60071d4279SBram Moolenaar 61071d4279SBram Moolenaar " now get color, first try 'c' key if any (color visual) 62071d4279SBram Moolenaar let color = substitute(s, '".*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*"', '\1', '') 63071d4279SBram Moolenaar if color == s 64071d4279SBram Moolenaar " no 'c' key, try 'g' key (grayscale with more than 4 levels) 65071d4279SBram Moolenaar let color = substitute(s, '".*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*"', '\1', '') 66071d4279SBram Moolenaar if color == s 67071d4279SBram Moolenaar " next try: 'g4' key (4-level grayscale) 68071d4279SBram Moolenaar let color = substitute(s, '".*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*"', '\1', '') 69071d4279SBram Moolenaar if color == s 70071d4279SBram Moolenaar " finally try 'm' key (mono visual) 71071d4279SBram Moolenaar let color = substitute(s, '".*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*"', '\1', '') 72071d4279SBram Moolenaar if color == s 73071d4279SBram Moolenaar let color = "" 74071d4279SBram Moolenaar endif 75071d4279SBram Moolenaar endif 76071d4279SBram Moolenaar endif 77071d4279SBram Moolenaar endif 78071d4279SBram Moolenaar 79071d4279SBram Moolenaar " Vim cannot handle RGB codes with more than 6 hex digits 80071d4279SBram Moolenaar if color =~ '#\x\{10,}$' 81071d4279SBram Moolenaar let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g') 82071d4279SBram Moolenaar elseif color =~ '#\x\{7,}$' 83071d4279SBram Moolenaar let color = substitute(color, '\(\x\x\)\x', '\1', 'g') 84071d4279SBram Moolenaar " nor with 3 digits 85071d4279SBram Moolenaar elseif color =~ '#\x\{3}$' 86071d4279SBram Moolenaar let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '') 87071d4279SBram Moolenaar endif 88071d4279SBram Moolenaar 89071d4279SBram Moolenaar " escape meta characters in patterns 90071d4279SBram Moolenaar let s = escape(s, '/\*^$.~[]') 91071d4279SBram Moolenaar let chars = escape(chars, '/\*^$.~[]') 92071d4279SBram Moolenaar 93071d4279SBram Moolenaar " now create syntax items 94071d4279SBram Moolenaar " highlight the color string as normal string (no pixel string) 95071d4279SBram Moolenaar exe 'syn match xpmCol'.n.'Def /'.s.'/ contains=xpmCol'.n.'inDef' 96071d4279SBram Moolenaar exe 'hi link xpmCol'.n.'Def String' 97071d4279SBram Moolenaar 98071d4279SBram Moolenaar " but highlight the first whitespace after chars in its color 99071d4279SBram Moolenaar exe 'syn match xpmCol'.n.'inDef /"'.chars.'/hs=s+'.(cpp+1).' contained' 100071d4279SBram Moolenaar exe 'hi link xpmCol'.n.'inDef xpmColor'.n 101071d4279SBram Moolenaar 102071d4279SBram Moolenaar " remove the following whitespace from chars 103071d4279SBram Moolenaar let chars = substitute(chars, '.$', '', '') 104071d4279SBram Moolenaar 105071d4279SBram Moolenaar " and create the syntax item contained in the pixel strings 106071d4279SBram Moolenaar exe 'syn match xpmColor'.n.' /'.chars.'/ contained' 107071d4279SBram Moolenaar exe 'syn cluster xpmColors add=xpmColor'.n 108071d4279SBram Moolenaar 109071d4279SBram Moolenaar " if no color or color = "None" show background 110071d4279SBram Moolenaar if color == "" || substitute(color, '.*', '\L&', '') == 'none' 111071d4279SBram Moolenaar exe 'hi xpmColor'.n.' guifg=bg' 112071d4279SBram Moolenaar exe 'hi xpmColor'.n.' guibg=NONE' 113446cb837SBram Moolenaar elseif color !~ "'" 114071d4279SBram Moolenaar exe 'hi xpmColor'.n." guifg='".color."'" 115071d4279SBram Moolenaar exe 'hi xpmColor'.n." guibg='".color."'" 116071d4279SBram Moolenaar endif 117071d4279SBram Moolenaar let n = n + 1 118071d4279SBram Moolenaar else 119071d4279SBram Moolenaar break " no more color string 120071d4279SBram Moolenaar endif 121071d4279SBram Moolenaar endif 122071d4279SBram Moolenaar let i = i + 1 123071d4279SBram Moolenaarendwhile 124071d4279SBram Moolenaar 125071d4279SBram Moolenaarunlet color chars colors cpp n i s 126071d4279SBram Moolenaar 1273df0173fSBram Moolenaarendif " has("gui_running") || has("termguicolors") && &termguicolors 128071d4279SBram Moolenaar 129071d4279SBram Moolenaar" Define the default highlighting. 13089bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet 131071d4279SBram Moolenaar 132f37506f6SBram Moolenaarhi def link xpmType Type 133f37506f6SBram Moolenaarhi def link xpmStorageClass StorageClass 134f37506f6SBram Moolenaarhi def link xpmTodo Todo 135f37506f6SBram Moolenaarhi def link xpmComment Comment 136f37506f6SBram Moolenaarhi def link xpmPixelString String 137071d4279SBram Moolenaar 138071d4279SBram Moolenaar 139071d4279SBram Moolenaarlet b:current_syntax = "xpm" 140071d4279SBram Moolenaar 141071d4279SBram Moolenaar" vim: ts=8:sw=3:noet: 142