xref: /vim-8.2.3635/runtime/syntax/xpm.vim (revision 6e649224)
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