1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:	Java Properties resource file (*.properties[_*])
3071d4279SBram Moolenaar" Maintainer:	Simon Baldwin <[email protected]>
4071d4279SBram Moolenaar" Last change:	26th Mar 2000
5071d4279SBram Moolenaar
6071d4279SBram Moolenaar" =============================================================================
7071d4279SBram Moolenaar
8071d4279SBram Moolenaar" Optional and tuning variables:
9071d4279SBram Moolenaar
10071d4279SBram Moolenaar" jproperties_lines
11071d4279SBram Moolenaar" -----------------
12071d4279SBram Moolenaar"   Set a value for the sync block that we use to find long continuation lines
13071d4279SBram Moolenaar"   in properties; the value is already large - if you have larger continuation
14071d4279SBram Moolenaar"   sets you may need to increase it further - if not, and you find editing is
15071d4279SBram Moolenaar"   slow, reduce the value of jproperties_lines.
16071d4279SBram Moolenaarif !exists("jproperties_lines")
17071d4279SBram Moolenaar	let jproperties_lines = 256
18071d4279SBram Moolenaarendif
19071d4279SBram Moolenaar
20071d4279SBram Moolenaar" jproperties_strict_syntax
21071d4279SBram Moolenaar" -------------------------
22071d4279SBram Moolenaar"   Most properties files assign values with "id=value" or "id:value".  But,
23071d4279SBram Moolenaar"   strictly, the Java properties parser also allows "id value", "id", and
24071d4279SBram Moolenaar"   even more bizarrely "=value", ":value", " value", and so on.  These latter
25071d4279SBram Moolenaar"   ones, however, are rarely used, if ever, and handling them in the high-
26071d4279SBram Moolenaar"   lighting can obscure errors in the more normal forms.  So, in practice
27071d4279SBram Moolenaar"   we take special efforts to pick out only "id=value" and "id:value" forms
28071d4279SBram Moolenaar"   by default.  If you want strict compliance, set jproperties_strict_syntax
29071d4279SBram Moolenaar"   to non-zero (and good luck).
30071d4279SBram Moolenaarif !exists("jproperties_strict_syntax")
31071d4279SBram Moolenaar	let jproperties_strict_syntax = 0
32071d4279SBram Moolenaarendif
33071d4279SBram Moolenaar
34071d4279SBram Moolenaar" jproperties_show_messages
35071d4279SBram Moolenaar" -------------------------
36071d4279SBram Moolenaar"   If this properties file contains messages for use with MessageFormat,
37071d4279SBram Moolenaar"   setting a non-zero value will highlight them.  Messages are of the form
38071d4279SBram Moolenaar"   "{...}".  Highlighting doesn't go to the pains of picking apart what is
39071d4279SBram Moolenaar"   in the format itself - just the basics for now.
40071d4279SBram Moolenaarif !exists("jproperties_show_messages")
41071d4279SBram Moolenaar	let jproperties_show_messages = 0
42071d4279SBram Moolenaarendif
43071d4279SBram Moolenaar
44071d4279SBram Moolenaar" =============================================================================
45071d4279SBram Moolenaar
4689bcfda6SBram Moolenaar" quit when a syntax file was already loaded
4789bcfda6SBram Moolenaarif exists("b:current_syntax")
48071d4279SBram Moolenaar  finish
49071d4279SBram Moolenaarendif
50071d4279SBram Moolenaar
51071d4279SBram Moolenaar" switch case sensitivity off
52071d4279SBram Moolenaarsyn case ignore
53071d4279SBram Moolenaar
54071d4279SBram Moolenaar" set the block
55071d4279SBram Moolenaarexec "syn sync lines=" . jproperties_lines
56071d4279SBram Moolenaar
57071d4279SBram Moolenaar" switch between 'normal' and 'strict' syntax
58071d4279SBram Moolenaarif jproperties_strict_syntax != 0
59071d4279SBram Moolenaar
60071d4279SBram Moolenaar	" an assignment is pretty much any non-empty line at this point,
61071d4279SBram Moolenaar	" trying to not think about continuation lines
62071d4279SBram Moolenaar	syn match   jpropertiesAssignment	"^\s*[^[:space:]]\+.*$" contains=jpropertiesIdentifier
63071d4279SBram Moolenaar
64071d4279SBram Moolenaar	" an identifier is anything not a space character, pretty much; it's
65071d4279SBram Moolenaar	" followed by = or :, or space or tab.  Or end-of-line.
66071d4279SBram Moolenaar	syn match   jpropertiesIdentifier	"[^=:[:space:]]*" contained nextgroup=jpropertiesDelimiter
67071d4279SBram Moolenaar
68071d4279SBram Moolenaar	" treat the delimiter specially to get colours right
69071d4279SBram Moolenaar	syn match   jpropertiesDelimiter	"\s*[=:[:space:]]\s*" contained nextgroup=jpropertiesString
70071d4279SBram Moolenaar
71071d4279SBram Moolenaar	" catch the bizarre case of no identifier; a special case of delimiter
72071d4279SBram Moolenaar	syn match   jpropertiesEmptyIdentifier	"^\s*[=:]\s*" nextgroup=jpropertiesString
73071d4279SBram Moolenaarelse
74071d4279SBram Moolenaar
75071d4279SBram Moolenaar	" here an assignment is id=value or id:value, and we conveniently
76071d4279SBram Moolenaar	" ignore continuation lines for the present
77071d4279SBram Moolenaar	syn match   jpropertiesAssignment	"^\s*[^=:[:space:]]\+\s*[=:].*$" contains=jpropertiesIdentifier
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar	" an identifier is anything not a space character, pretty much; it's
80071d4279SBram Moolenaar	" always followed by = or :, and we find it in an assignment
81071d4279SBram Moolenaar	syn match   jpropertiesIdentifier	"[^=:[:space:]]\+" contained nextgroup=jpropertiesDelimiter
82071d4279SBram Moolenaar
83071d4279SBram Moolenaar	" treat the delimiter specially to get colours right; this time the
84071d4279SBram Moolenaar	" delimiter must contain = or :
85071d4279SBram Moolenaar	syn match   jpropertiesDelimiter	"\s*[=:]\s*" contained nextgroup=jpropertiesString
86071d4279SBram Moolenaarendif
87071d4279SBram Moolenaar
88071d4279SBram Moolenaar" a definition is all up to the last non-\-terminated line; strictly, Java
89071d4279SBram Moolenaar" properties tend to ignore leading whitespace on all lines of a multi-line
90071d4279SBram Moolenaar" definition, but we don't look for that here (because it's a major hassle)
91071d4279SBram Moolenaarsyn region  jpropertiesString		start="" skip="\\$" end="$" contained contains=jpropertiesSpecialChar,jpropertiesError,jpropertiesSpecial
92071d4279SBram Moolenaar
93071d4279SBram Moolenaar" {...} is a Java Message formatter - add a minimal recognition of these
94071d4279SBram Moolenaar" if required
95071d4279SBram Moolenaarif jproperties_show_messages != 0
96071d4279SBram Moolenaar	syn match   jpropertiesSpecial		"{[^}]*}\{-1,\}" contained
97071d4279SBram Moolenaar	syn match   jpropertiesSpecial		"'{" contained
98071d4279SBram Moolenaar	syn match   jpropertiesSpecial		"''" contained
99071d4279SBram Moolenaarendif
100071d4279SBram Moolenaar
101071d4279SBram Moolenaar" \uABCD are unicode special characters
102071d4279SBram Moolenaarsyn match   jpropertiesSpecialChar	"\\u\x\{1,4}" contained
103071d4279SBram Moolenaar
104071d4279SBram Moolenaar" ...and \u not followed by a hex digit is an error, though the properties
105071d4279SBram Moolenaar" file parser won't issue an error on it, just set something wacky like zero
106071d4279SBram Moolenaarsyn match   jpropertiesError		"\\u\X\{1,4}" contained
107071d4279SBram Moolenaarsyn match   jpropertiesError		"\\u$"me=e-1 contained
108071d4279SBram Moolenaar
109071d4279SBram Moolenaar" other things of note are the \t,r,n,\, and the \ preceding line end
110071d4279SBram Moolenaarsyn match   jpropertiesSpecial		"\\[trn\\]" contained
111071d4279SBram Moolenaarsyn match   jpropertiesSpecial		"\\\s" contained
112071d4279SBram Moolenaarsyn match   jpropertiesSpecial		"\\$" contained
113071d4279SBram Moolenaar
114071d4279SBram Moolenaar" comments begin with # or !, and persist to end of line; put here since
115071d4279SBram Moolenaar" they may have been caught by patterns above us
116071d4279SBram Moolenaarsyn match   jpropertiesComment		"^\s*[#!].*$" contains=jpropertiesTODO
117071d4279SBram Moolenaarsyn keyword jpropertiesTodo		TODO FIXME XXX contained
118071d4279SBram Moolenaar
119071d4279SBram Moolenaar" Define the default highlighting.
12089bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet
121071d4279SBram Moolenaar
122*f37506f6SBram Moolenaarhi def link jpropertiesComment	Comment
123*f37506f6SBram Moolenaarhi def link jpropertiesTodo		Todo
124*f37506f6SBram Moolenaarhi def link jpropertiesIdentifier	Identifier
125*f37506f6SBram Moolenaarhi def link jpropertiesString	String
126*f37506f6SBram Moolenaarhi def link jpropertiesExtendString	String
127*f37506f6SBram Moolenaarhi def link jpropertiesCharacter	Character
128*f37506f6SBram Moolenaarhi def link jpropertiesSpecial	Special
129*f37506f6SBram Moolenaarhi def link jpropertiesSpecialChar	SpecialChar
130*f37506f6SBram Moolenaarhi def link jpropertiesError	Error
131071d4279SBram Moolenaar
132071d4279SBram Moolenaar
133071d4279SBram Moolenaarlet b:current_syntax = "jproperties"
134071d4279SBram Moolenaar
135071d4279SBram Moolenaar" vim:ts=8
136