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