xref: /vim-8.2.3635/runtime/syntax/perl.vim (revision 2c7f8c57)
1" Vim syntax file
2" Language:      Perl 5
3" Maintainer:    vim-perl <[email protected]>
4" Homepage:      https://github.com/vim-perl/vim-perl/tree/master
5" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
6" Last Change:   2020 Apr 15
7" Contributors:  Andy Lester <[email protected]>
8"                Hinrik Örn Sigurðsson <[email protected]>
9"                Lukas Mai <l.mai.web.de>
10"                Nick Hibma <[email protected]>
11"                Sonia Heimann <[email protected]>
12"                Rob Hoelz <[email protected]>
13"                and many others.
14"
15" Please download the most recent version first, before mailing
16" any comments.
17"
18" The following parameters are available for tuning the
19" perl syntax highlighting, with defaults given:
20"
21" let perl_include_pod = 1
22" unlet perl_no_scope_in_variables
23" unlet perl_no_extended_vars
24" unlet perl_string_as_statement
25" unlet perl_no_sync_on_sub
26" unlet perl_no_sync_on_global_var
27" let perl_sync_dist = 100
28" unlet perl_fold
29" unlet perl_fold_blocks
30" unlet perl_nofold_packages
31" unlet perl_nofold_subs
32" unlet perl_fold_anonymous_subs
33" unlet perl_no_subprototype_error
34
35if exists("b:current_syntax")
36  finish
37endif
38
39let s:cpo_save = &cpo
40set cpo&vim
41
42" POD starts with ^=<word> and ends with ^=cut
43
44if !exists("perl_include_pod") || perl_include_pod == 1
45  " Include a while extra syntax file
46  syn include @Pod syntax/pod.vim
47  unlet b:current_syntax
48  if exists("perl_fold")
49    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend
50    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend
51  else
52    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
53    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
54  endif
55else
56  " Use only the bare minimum of rules
57  if exists("perl_fold")
58    syn region perlPOD start="^=[a-z]" end="^=cut" fold
59  else
60    syn region perlPOD start="^=[a-z]" end="^=cut"
61  endif
62endif
63
64
65syn cluster perlTop		contains=TOP
66
67syn region perlBraces start="{" end="}" transparent extend
68
69" All keywords
70"
71syn match perlConditional		"\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
72syn match perlConditional		"\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
73syn match perlRepeat			"\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
74syn match perlOperator			"\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"
75" for some reason, adding this as the nextgroup for perlControl fixes BEGIN
76" folding issues...
77syn match perlFakeGroup 		"" contained
78syn match perlControl			"\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
79
80syn match perlStatementStorage		"\<\%(my\|our\|local\|state\)\>"
81syn match perlStatementControl		"\<\%(return\|last\|next\|redo\|goto\|break\)\>"
82syn match perlStatementScalar		"\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
83syn match perlStatementRegexp		"\<\%(pos\|quotemeta\|split\|study\)\>"
84syn match perlStatementNumeric		"\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
85syn match perlStatementList		"\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
86syn match perlStatementHash		"\<\%(delete\|each\|exists\|keys\|values\)\>"
87syn match perlStatementIOfunc		"\<\%(syscall\|dbmopen\|dbmclose\)\>"
88syn match perlStatementFiledesc		"\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
89syn match perlStatementFiledesc		"\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
90syn match perlStatementVector		"\<vec\>"
91syn match perlStatementFiles		"\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
92syn match perlStatementFiles		"-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
93syn match perlStatementFlow		"\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
94syn match perlStatementInclude		"\<\%(require\|import\|unimport\)\>"
95syn match perlStatementInclude		"\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\%(::warnings\)\=\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|open\|ops\|overload\|overloading\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="
96syn match perlStatementProc		"\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
97syn match perlStatementSocket		"\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
98syn match perlStatementIPC		"\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
99syn match perlStatementNetwork		"\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
100syn match perlStatementPword		"\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
101syn match perlStatementTime		"\<\%(gmtime\|localtime\|time\)\>"
102
103syn match perlStatementMisc		"\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
104
105syn keyword perlTodo			TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
106
107syn region perlStatementIndirObjWrap   matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
108
109syn match perlLabel      "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
110
111" Perl Identifiers.
112"
113" Should be cleaned up to better handle identifiers in particular situations
114" (in hash keys for example)
115"
116" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
117" We do not process complex things such as @{${"foo"}}. Too complicated, and
118" too slow. And what is after the -> is *not* considered as part of the
119" variable - there again, too complicated and too slow.
120
121" Special variables first ($^A, ...) and ($|, $', ...)
122syn match  perlVarPlain		 "$^[ACDEFHILMNOPRSTVWX]\="
123syn match  perlVarPlain		 "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
124syn match  perlVarPlain		 "@[-+]"
125syn match  perlVarPlain		 "$\%(0\|[1-9]\d*\)"
126" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
127syn match  perlVarPlain		 "$::\@!"
128" These variables are not recognized within matches.
129syn match  perlVarNotInMatches	 "$[|)]"
130" This variable is not recognized within matches delimited by m//.
131syn match  perlVarSlash		 "$/"
132
133" And plain identifiers
134syn match  perlPackageRef	 "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
135
136" To not highlight packages in variables as a scope reference - i.e. in
137" $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"
138" If you don't want complex things like @{${"foo"}} to be processed,
139" just set the variable "perl_no_extended_vars"...
140
141if !exists("perl_no_scope_in_variables")
142  syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
143  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
144  syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
145else
146  syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
147  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
148  syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
149endif
150
151syn match  perlVarPlain2	 "%[-+]"
152
153if !exists("perl_no_extended_vars")
154  syn cluster perlExpr		contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ,perlArrow,perlBraces
155  syn region perlArrow		matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
156  syn region perlArrow		matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
157  syn region perlArrow		matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
158  syn match  perlArrow		"->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
159  syn region perlArrow		matchgroup=perlArrow start="->\s*\$*\I\i*\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
160  syn region perlVarBlock	matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
161  syn region perlVarBlock2	matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
162  syn match  perlVarPlain2	"[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
163  syn match  perlVarPlain	"\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
164  syn region perlVarMember	matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
165  syn match  perlVarSimpleMember	"\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contains=perlVarSimpleMemberName contained extend
166  syn match  perlVarSimpleMemberName	"\I\i*" contained
167  syn region perlVarMember	matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
168  syn match perlPackageConst	"__PACKAGE__" nextgroup=perlMethod,perlPostDeref
169  syn match  perlMethod		"->\$*\I\i*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
170  syn match  perlPostDeref	"->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
171  syn region  perlPostDeref	start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
172  syn region  perlPostDeref	matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
173endif
174
175" File Descriptors
176syn match  perlFiledescRead	"<\h\w*>"
177
178syn match  perlFiledescStatementComma	"(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
179syn match  perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
180
181syn match  perlFiledescStatement	"\<\u\w*\>" contained
182
183" Special characters in strings and matches
184syn match  perlSpecialString	"\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
185syn match  perlSpecialStringU2	"\\." extend contained contains=NONE
186syn match  perlSpecialStringU	"\\\\" contained
187syn match  perlSpecialMatch	"\\[1-9]" contained extend
188syn match  perlSpecialMatch	"\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
189syn match  perlSpecialMatch	"\\k\%(<\h\w*>\|'\h\w*'\)" contained
190syn match  perlSpecialMatch	"{\d\+\%(,\%(\d\+\)\=\)\=}" contained
191syn match  perlSpecialMatch	"\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
192syn match  perlSpecialMatch	"[+*()?.]" contained
193syn match  perlSpecialMatch	"(?[#:=!]" contained
194syn match  perlSpecialMatch	"(?[impsx]*\%(-[imsx]\+\)\=)" contained
195syn match  perlSpecialMatch	"(?\%([-+]\=\d\+\|R\))" contained
196syn match  perlSpecialMatch	"(?\%(&\|P[>=]\)\h\w*)" contained
197syn match  perlSpecialMatch	"(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained
198
199" Possible errors
200"
201" Highlight lines with only whitespace (only in blank delimited here documents) as errors
202syn match  perlNotEmptyLine	"^\s\+$" contained
203" Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
204syn match perlElseIfError	"else\_s*if" containedin=perlConditional
205syn keyword perlElseIfError	elseif containedin=perlConditional
206
207" Variable interpolation
208"
209" These items are interpolated inside "" strings and similar constructs.
210syn cluster perlInterpDQ	contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
211" These items are interpolated inside '' strings and similar constructs.
212syn cluster perlInterpSQ	contains=perlSpecialStringU,perlSpecialStringU2
213" These items are interpolated inside m// matches and s/// substitutions.
214syn cluster perlInterpSlash	contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
215" These items are interpolated inside m## matches and s### substitutions.
216syn cluster perlInterpMatch	contains=@perlInterpSlash,perlVarSlash
217
218" Shell commands
219syn region  perlShellCommand	matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
220
221" Constants
222"
223" Numbers
224syn match  perlNumber	"\<\%(0\%(x\x[[:xdigit:]_]*\|b[01][01_]*\|\o[0-7_]*\|\)\|[1-9][[:digit:]_]*\)\>"
225syn match  perlFloat	"\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
226syn match  perlFloat	"\<\d[[:digit:]_]*\.[[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
227syn match  perlFloat    "\.[[:digit:]][[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
228
229syn match  perlString	"\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
230syn match  perlVStringV	"\<v" contained
231
232
233syn region perlParensSQ		start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
234syn region perlBracketsSQ	start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
235syn region perlBracesSQ		start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
236syn region perlAnglesSQ		start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
237
238syn region perlParensDQ		start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
239syn region perlBracketsDQ	start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
240syn region perlBracesDQ		start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
241syn region perlAnglesDQ		start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
242
243
244" Simple version of searches and matches
245syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
246syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
247syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'[msixpodualgcn]*+ contains=@perlInterpSQ keepend extend
248syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash keepend extend
249syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)[msixpodualgcn]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
250syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}[msixpodualgcn]*+ contains=@perlInterpMatch,perlBracesDQ extend
251syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>[msixpodualgcn]*+ contains=@perlInterpMatch,perlAnglesDQ keepend extend
252syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\][msixpodualgcn]*+ contains=@perlInterpMatch,perlBracketsDQ keepend extend
253
254" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
255" cases as the / is used in so many other ways, but these should be the most obvious ones.
256syn region perlMatch	matchgroup=perlMatchStartEnd start="\%([$@%&*]\@<!\%(\<split\|\<while\|\<if\|\<unless\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=/\%(/=\)\@!" start=+^/\%(/=\)\@!+ start=+\s\@<=/\%(/=\)\@![^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!+ skip=+\\/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash extend
257
258
259" Substitutions
260" perlMatch is the first part, perlSubstitution* is the substitution part
261syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
262syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
263syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
264syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
265syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
266syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
267syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
268syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
269syn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1[msixpodualgcern]*+ keepend contained contains=@perlInterpDQ extend
270syn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+(+ end=+)[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlParensDQ keepend extend
271syn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+\[+ end=+\][msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend
272syn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+{+ end=+}[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend
273syn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+<+ end=+>[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend
274syn region perlSubstitutionSQ		matchgroup=perlMatchStartEnd start=+'+  end=+'[msixpodualgcern]*+ contained contains=@perlInterpSQ keepend extend
275
276" Translations
277" perlMatch is the first part, perlTranslation* is the second, translator part.
278syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
279syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
280syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
281syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
282syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
283syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
284syn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1[cdsr]*+ contained
285syn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+(+ end=+)[cdsr]*+ contains=perlParensSQ contained
286syn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+\[+ end=+\][cdsr]*+ contains=perlBracketsSQ contained
287syn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+{+ end=+}[cdsr]*+ contains=perlBracesSQ contained
288syn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+<+ end=+>[cdsr]*+ contains=perlAnglesSQ contained
289
290
291" Strings and q, qq, qw and qr expressions
292
293syn region perlStringUnexpanded	matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
294syn region perlString		matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ keepend extend
295syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
296syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
297syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
298syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
299syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
300syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
301
302syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
303syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
304syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
305syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
306syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
307syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
308
309syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+  end=+\z1+ contains=@perlInterpSQ keepend extend
310syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+  end=+#+ contains=@perlInterpSQ keepend extend
311syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+  end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
312syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+  end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
313syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+  end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
314syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+  end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
315
316syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+  end=+\z1[imosxdual]*+ contains=@perlInterpMatch keepend extend
317syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+  end=+/[imosxdual]*+ contains=@perlInterpSlash keepend extend
318syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+  end=+#[imosxdual]*+ contains=@perlInterpMatch keepend extend
319syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+  end=+'[imosxdual]*+ contains=@perlInterpSQ keepend extend
320syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+  end=+)[imosxdual]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
321
322" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
323syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+  end=+}[imosxdual]*+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend
324syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+  end=+>[imosxdual]*+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend
325syn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+  end=+\][imosxdual]*+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend
326
327" Constructs such as print <<EOF [...] EOF, 'here' documents
328"
329" XXX Any statements after the identifier are in perlString colour (i.e.
330" 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
331" seems due to the 'auto-extending nature' of regions.
332syn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+  end=+$+     contains=@perlTop oneline
333syn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+$+ contains=@perlTop oneline
334syn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+$+ contains=@perlTop oneline
335syn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*""+       end=+$+     contains=@perlTop oneline
336syn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*''+       end=+$+     contains=@perlTop oneline
337if exists("perl_fold")
338  syn region perlHereDoc	start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd      end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
339  syn region perlHereDoc	start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
340  syn region perlHereDoc	start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
341  syn region perlHereDoc	start=+<<\s*""+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
342  syn region perlHereDoc	start=+<<\s*''+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
343  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL fold extend
344else
345  syn region perlHereDoc	start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd      end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
346  syn region perlHereDoc	start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
347  syn region perlHereDoc	start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
348  syn region perlHereDoc	start=+<<\s*""+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
349  syn region perlHereDoc	start=+<<\s*''+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
350  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
351endif
352
353
354" Class declarations
355"
356syn match   perlPackageDecl		"\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
357syn keyword perlStatementPackage	package contained
358
359" Functions
360"       sub [name] [(prototype)] {
361"
362syn match perlSubError "[^[:space:];{#]" contained
363syn match perlSubAttributesCont "\h\w*\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained
364syn region perlSubAttributesCont matchgroup=perlSubAttributesCont start="\h\w*(" end=")\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained contains=@perlInterpSQ,perlParensSQ
365syn cluster perlSubAttrMaybe contains=perlSubAttributesCont,perlSubError,perlFakeGroup
366syn match perlSubAttributes "" contained nextgroup=perlSubError
367syn match perlSubAttributes ":\_s*" contained nextgroup=@perlSubAttrMaybe
368if get(g:, "perl_sub_signatures", 0)
369    syn match perlSignature +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained
370else
371    syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained
372    syn match perlSubPrototype +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError
373endif
374
375syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlSignature,perlSubAttributes,perlComment
376
377syn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName
378
379" The => operator forces a bareword to the left of it to be interpreted as
380" a string
381syn match  perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
382
383" All other # are comments, except ^#!
384syn match  perlComment		"#.*" contains=perlTodo,@Spell extend
385syn match  perlSharpBang	"^#!.*"
386
387" Formats
388syn region perlFormat		matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
389syn match  perlFormatName	"format\s\+\k\+\s*="lc=7,me=e-1 contained
390syn match  perlFormatField	"[@^][|<>~]\+\%(\.\.\.\)\=" contained
391syn match  perlFormatField	"[@^]#[#.]*" contained
392syn match  perlFormatField	"@\*" contained
393syn match  perlFormatField	"@[^A-Za-z_|<>~#*]"me=e-1 contained
394syn match  perlFormatField	"@$" contained
395
396" __END__ and __DATA__ clauses
397if exists("perl_fold")
398  syntax region perlDATA		start="^__DATA__$" skip="." end="." contains=@perlDATA fold
399  syntax region perlDATA		start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA fold
400else
401  syntax region perlDATA		start="^__DATA__$" skip="." end="." contains=@perlDATA
402  syntax region perlDATA		start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA
403endif
404
405"
406" Folding
407
408if exists("perl_fold")
409  " Note: this bit must come before the actual highlighting of the "package"
410  " keyword, otherwise this will screw up Pod lines that match /^package/
411  if !exists("perl_nofold_packages")
412    syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
413  endif
414  if !exists("perl_nofold_subs")
415    if get(g:, "perl_fold_anonymous_subs", 0)
416      syn region perlSubFold start="\<sub\>[^{]*{" end="}" transparent fold keepend extend
417      syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\)\>\s*{" end="}" transparent fold keepend
418    else
419      syn region perlSubFold     start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\%(#.*\)\=$" transparent fold keepend
420      syn region perlSubFold start="^\z(\s*\)\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
421    endif
422  endif
423
424  if exists("perl_fold_blocks")
425    syn region perlBlockFold start="^\z(\s*\)\%(if\|elsif\|unless\|for\|while\|until\|given\)\s*(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" start="^\z(\s*\)for\%(each\)\=\s*\%(\%(my\|our\)\=\s*\S\+\s*\)\=(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
426    syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
427  endif
428
429  setlocal foldmethod=syntax
430  syn sync fromstart
431else
432  " fromstart above seems to set minlines even if perl_fold is not set.
433  syn sync minlines=0
434endif
435
436" NOTE: If you're linking new highlight groups to perlString, please also put
437"       them into b:match_skip in ftplugin/perl.vim.
438
439" The default highlighting.
440hi def link perlSharpBang		PreProc
441hi def link perlControl		PreProc
442hi def link perlInclude		Include
443hi def link perlSpecial		Special
444hi def link perlString		String
445hi def link perlCharacter		Character
446hi def link perlNumber		Number
447hi def link perlFloat		Float
448hi def link perlType			Type
449hi def link perlIdentifier		Identifier
450hi def link perlLabel		Label
451hi def link perlStatement		Statement
452hi def link perlConditional		Conditional
453hi def link perlRepeat		Repeat
454hi def link perlOperator		Operator
455hi def link perlFunction		Keyword
456hi def link perlSubName		Function
457hi def link perlSubPrototype		Type
458hi def link perlSignature		Type
459hi def link perlSubAttributes	PreProc
460hi def link perlSubAttributesCont	perlSubAttributes
461hi def link perlComment		Comment
462hi def link perlTodo			Todo
463if exists("perl_string_as_statement")
464  hi def link perlStringStartEnd	perlStatement
465else
466  hi def link perlStringStartEnd	perlString
467endif
468hi def link perlVStringV		perlStringStartEnd
469hi def link perlList			perlStatement
470hi def link perlMisc			perlStatement
471hi def link perlVarPlain		perlIdentifier
472hi def link perlVarPlain2		perlIdentifier
473hi def link perlArrow		perlIdentifier
474hi def link perlFiledescRead		perlIdentifier
475hi def link perlFiledescStatement	perlIdentifier
476hi def link perlVarSimpleMember	perlIdentifier
477hi def link perlVarSimpleMemberName 	perlString
478hi def link perlVarNotInMatches	perlIdentifier
479hi def link perlVarSlash		perlIdentifier
480hi def link perlQQ			perlString
481hi def link perlHereDoc		perlString
482hi def link perlStringUnexpanded	perlString
483hi def link perlSubstitutionSQ	perlString
484hi def link perlSubstitutionGQQ	perlString
485hi def link perlTranslationGQ	perlString
486hi def link perlMatch		perlString
487hi def link perlMatchStartEnd	perlStatement
488hi def link perlFormatName		perlIdentifier
489hi def link perlFormatField		perlString
490hi def link perlPackageDecl		perlType
491hi def link perlStorageClass		perlType
492hi def link perlPackageRef		perlType
493hi def link perlStatementPackage	perlStatement
494hi def link perlStatementStorage	perlStatement
495hi def link perlStatementControl	perlStatement
496hi def link perlStatementScalar	perlStatement
497hi def link perlStatementRegexp	perlStatement
498hi def link perlStatementNumeric	perlStatement
499hi def link perlStatementList	perlStatement
500hi def link perlStatementHash	perlStatement
501hi def link perlStatementIOfunc	perlStatement
502hi def link perlStatementFiledesc	perlStatement
503hi def link perlStatementVector	perlStatement
504hi def link perlStatementFiles	perlStatement
505hi def link perlStatementFlow	perlStatement
506hi def link perlStatementInclude	perlStatement
507hi def link perlStatementProc	perlStatement
508hi def link perlStatementSocket	perlStatement
509hi def link perlStatementIPC		perlStatement
510hi def link perlStatementNetwork	perlStatement
511hi def link perlStatementPword	perlStatement
512hi def link perlStatementTime	perlStatement
513hi def link perlStatementMisc	perlStatement
514hi def link perlStatementIndirObj	perlStatement
515hi def link perlFunctionName		perlIdentifier
516hi def link perlMethod		perlIdentifier
517hi def link perlPostDeref		perlIdentifier
518hi def link perlFunctionPRef		perlType
519if !get(g:, 'perl_include_pod', 1)
520  hi def link perlPOD		perlComment
521endif
522hi def link perlShellCommand		perlString
523hi def link perlSpecialAscii		perlSpecial
524hi def link perlSpecialDollar	perlSpecial
525hi def link perlSpecialString	perlSpecial
526hi def link perlSpecialStringU	perlSpecial
527hi def link perlSpecialMatch		perlSpecial
528hi def link perlDATA			perlComment
529
530" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
531"       I had to remove the transparent property from the following regions
532"       in order to get them to highlight correctly.  Feel free to remove
533"       these and reinstate the transparent property if you know how.
534hi def link perlParensSQ		perlString
535hi def link perlBracketsSQ		perlString
536hi def link perlBracesSQ		perlString
537hi def link perlAnglesSQ		perlString
538
539hi def link perlParensDQ		perlString
540hi def link perlBracketsDQ		perlString
541hi def link perlBracesDQ		perlString
542hi def link perlAnglesDQ		perlString
543
544hi def link perlSpecialStringU2	perlString
545
546" Possible errors
547hi def link perlNotEmptyLine		Error
548hi def link perlElseIfError		Error
549hi def link perlSubPrototypeError	Error
550hi def link perlSubError		Error
551
552" Syncing to speed up processing
553"
554if !exists("perl_no_sync_on_sub")
555  syn sync match perlSync	grouphere NONE "^\s*\<package\s"
556  syn sync match perlSync	grouphere NONE "^\s*\<sub\>"
557  syn sync match perlSync	grouphere NONE "^}"
558endif
559
560if !exists("perl_no_sync_on_global_var")
561  syn sync match perlSync	grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
562  syn sync match perlSync	grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
563endif
564
565if exists("perl_sync_dist")
566  execute "syn sync maxlines=" . perl_sync_dist
567else
568  syn sync maxlines=100
569endif
570
571syn sync match perlSyncPOD	grouphere perlPOD "^=pod"
572syn sync match perlSyncPOD	grouphere perlPOD "^=head"
573syn sync match perlSyncPOD	grouphere perlPOD "^=item"
574syn sync match perlSyncPOD	grouphere NONE "^=cut"
575
576let b:current_syntax = "perl"
577
578let &cpo = s:cpo_save
579unlet s:cpo_save
580
581" XXX Change to sts=4:sw=4
582" vim:ts=8:sts=2:sw=2:expandtab:ft=vim
583