1" Vim syntax file 2" Language: X Pixmap 3" Maintainer: Ronald Schild <[email protected]> 4" Last Change: 2017 Feb 01 5" Version: 5.4n.1 6" Jemma Nelson added termguicolors support 7 8" quit when a syntax file was already loaded 9if exists("b:current_syntax") 10 finish 11endif 12 13syn keyword xpmType char 14syn keyword xpmStorageClass static 15syn keyword xpmTodo TODO FIXME XXX contained 16syn region xpmComment start="/\*" end="\*/" contains=xpmTodo 17syn region xpmPixelString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@xpmColors 18 19if has("gui_running") || has("termguicolors") && &termguicolors 20 21let color = "" 22let chars = "" 23let colors = 0 24let cpp = 0 25let n = 0 26let i = 1 27 28while i <= line("$") " scanning all lines 29 30 let s = matchstr(getline(i), '".\{-1,}"') 31 if s != "" " does line contain a string? 32 33 if n == 0 " first string is the Values string 34 35 " get the 3rd value: colors = number of colors 36 let colors = substitute(s, '"\s*\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '') 37 " get the 4th value: cpp = number of character per pixel 38 let cpp = substitute(s, '"\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '') 39 if cpp =~ '[^0-9]' 40 break " if cpp is not made of digits there must be something wrong 41 endif 42 43 " Highlight the Values string as normal string (no pixel string). 44 " Only when there is no slash, it would terminate the pattern. 45 if s !~ '/' 46 exe 'syn match xpmValues /' . s . '/' 47 endif 48 hi link xpmValues String 49 50 let n = 1 " n = color index 51 52 elseif n <= colors " string is a color specification 53 54 " get chars = <cpp> length string representing the pixels 55 " (first incl. the following whitespace) 56 let chars = substitute(s, '"\(.\{'.cpp.'}\s\).*"', '\1', '') 57 58 " now get color, first try 'c' key if any (color visual) 59 let color = substitute(s, '".*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*"', '\1', '') 60 if color == s 61 " no 'c' key, try 'g' key (grayscale with more than 4 levels) 62 let color = substitute(s, '".*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*"', '\1', '') 63 if color == s 64 " next try: 'g4' key (4-level grayscale) 65 let color = substitute(s, '".*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*"', '\1', '') 66 if color == s 67 " finally try 'm' key (mono visual) 68 let color = substitute(s, '".*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*"', '\1', '') 69 if color == s 70 let color = "" 71 endif 72 endif 73 endif 74 endif 75 76 " Vim cannot handle RGB codes with more than 6 hex digits 77 if color =~ '#\x\{10,}$' 78 let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g') 79 elseif color =~ '#\x\{7,}$' 80 let color = substitute(color, '\(\x\x\)\x', '\1', 'g') 81 " nor with 3 digits 82 elseif color =~ '#\x\{3}$' 83 let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '') 84 endif 85 86 " escape meta characters in patterns 87 let s = escape(s, '/\*^$.~[]') 88 let chars = escape(chars, '/\*^$.~[]') 89 90 " now create syntax items 91 " highlight the color string as normal string (no pixel string) 92 exe 'syn match xpmCol'.n.'Def /'.s.'/ contains=xpmCol'.n.'inDef' 93 exe 'hi link xpmCol'.n.'Def String' 94 95 " but highlight the first whitespace after chars in its color 96 exe 'syn match xpmCol'.n.'inDef /"'.chars.'/hs=s+'.(cpp+1).' contained' 97 exe 'hi link xpmCol'.n.'inDef xpmColor'.n 98 99 " remove the following whitespace from chars 100 let chars = substitute(chars, '.$', '', '') 101 102 " and create the syntax item contained in the pixel strings 103 exe 'syn match xpmColor'.n.' /'.chars.'/ contained' 104 exe 'syn cluster xpmColors add=xpmColor'.n 105 106 " if no color or color = "None" show background 107 if color == "" || substitute(color, '.*', '\L&', '') == 'none' 108 exe 'hi xpmColor'.n.' guifg=bg' 109 exe 'hi xpmColor'.n.' guibg=NONE' 110 elseif color !~ "'" 111 exe 'hi xpmColor'.n." guifg='".color."'" 112 exe 'hi xpmColor'.n." guibg='".color."'" 113 endif 114 let n = n + 1 115 else 116 break " no more color string 117 endif 118 endif 119 let i = i + 1 120endwhile 121 122unlet color chars colors cpp n i s 123 124endif " has("gui_running") || has("termguicolors") && &termguicolors 125 126" Define the default highlighting. 127" Only when an item doesn't have highlighting yet 128 129hi def link xpmType Type 130hi def link xpmStorageClass StorageClass 131hi def link xpmTodo Todo 132hi def link xpmComment Comment 133hi def link xpmPixelString String 134 135 136let b:current_syntax = "xpm" 137 138" vim: ts=8:sw=3:noet: 139