xref: /vim-8.2.3635/runtime/syntax/xpm2.vim (revision 3df0173f)
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