vim: syntax: update perl
[config/dotfiles.git] / vim / vim / syntax / perl.vim
1 " Vim syntax file
2 " Language:      Perl 5
3 " Maintainer:    vim-perl <vim-perl@googlegroups.com>
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 <andy@petdance.com>
8 "                Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
9 "                Lukas Mai <l.mai.web.de>
10 "                Nick Hibma <nick@van-laarhoven.org>
11 "                Sonia Heimann <niania@netsurf.org>
12 "                Rob Hoelz <rob@hoelz.ro>
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
35 if exists("b:current_syntax")
36   finish
37 endif
38
39 let s:cpo_save = &cpo
40 set cpo&vim
41
42 " POD starts with ^=<word> and ends with ^=cut
43
44 if !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
55 else
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
62 endif
63
64
65 syn cluster perlTop             contains=TOP
66
67 syn region perlBraces start="{" end="}" transparent extend
68
69 " All keywords
70 "
71 syn match perlConditional               "\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
72 syn match perlConditional               "\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
73 syn match perlRepeat                    "\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
74 syn 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...
77 syn match perlFakeGroup                 "" contained
78 syn match perlControl                   "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
79
80 syn match perlStatementStorage          "\<\%(my\|our\|local\|state\)\>"
81 syn match perlStatementControl          "\<\%(return\|last\|next\|redo\|goto\|break\)\>"
82 syn match perlStatementScalar           "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
83 syn match perlStatementRegexp           "\<\%(pos\|quotemeta\|split\|study\)\>"
84 syn match perlStatementNumeric          "\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
85 syn match perlStatementList             "\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
86 syn match perlStatementHash             "\<\%(delete\|each\|exists\|keys\|values\)\>"
87 syn match perlStatementIOfunc           "\<\%(syscall\|dbmopen\|dbmclose\)\>"
88 syn match perlStatementFiledesc         "\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
89 syn match perlStatementFiledesc         "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
90 syn match perlStatementVector           "\<vec\>"
91 syn match perlStatementFiles            "\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
92 syn match perlStatementFiles            "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
93 syn match perlStatementFlow             "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
94 syn match perlStatementInclude          "\<\%(require\|import\|unimport\)\>"
95 syn 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\)\=\)\>\)\="
96 syn match perlStatementProc             "\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
97 syn match perlStatementSocket           "\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
98 syn match perlStatementIPC              "\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
99 syn match perlStatementNetwork          "\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
100 syn match perlStatementPword            "\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
101 syn match perlStatementTime             "\<\%(gmtime\|localtime\|time\)\>"
102
103 syn match perlStatementMisc             "\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
104
105 syn keyword perlTodo                    TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
106
107 syn region perlStatementIndirObjWrap   matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
108
109 syn 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 ($|, $', ...)
122 syn match  perlVarPlain          "$^[ACDEFHILMNOPRSTVWX]\="
123 syn match  perlVarPlain          "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
124 syn match  perlVarPlain          "@[-+]"
125 syn match  perlVarPlain          "$\%(0\|[1-9]\d*\)"
126 " Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
127 syn match  perlVarPlain          "$::\@!"
128 " These variables are not recognized within matches.
129 syn match  perlVarNotInMatches   "$[|)]"
130 " This variable is not recognized within matches delimited by m//.
131 syn match  perlVarSlash          "$/"
132
133 " And plain identifiers
134 syn 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
141 if !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
145 else
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
149 endif
150
151 syn match  perlVarPlain2         "%[-+]"
152
153 if !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
173 endif
174
175 " File Descriptors
176 syn match  perlFiledescRead     "<\h\w*>"
177
178 syn match  perlFiledescStatementComma   "(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
179 syn match  perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
180
181 syn match  perlFiledescStatement        "\<\u\w*\>" contained
182
183 " Special characters in strings and matches
184 syn match  perlSpecialString    "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
185 syn match  perlSpecialStringU2  "\\." extend contained contains=NONE
186 syn match  perlSpecialStringU   "\\\\" contained
187 syn match  perlSpecialMatch     "\\[1-9]" contained extend
188 syn match  perlSpecialMatch     "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
189 syn match  perlSpecialMatch     "\\k\%(<\h\w*>\|'\h\w*'\)" contained
190 syn match  perlSpecialMatch     "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
191 syn match  perlSpecialMatch     "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
192 syn match  perlSpecialMatch     "[+*()?.]" contained
193 syn match  perlSpecialMatch     "(?[#:=!]" contained
194 syn match  perlSpecialMatch     "(?[impsx]*\%(-[imsx]\+\)\=)" contained
195 syn match  perlSpecialMatch     "(?\%([-+]\=\d\+\|R\))" contained
196 syn match  perlSpecialMatch     "(?\%(&\|P[>=]\)\h\w*)" contained
197 syn 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
202 syn match  perlNotEmptyLine     "^\s\+$" contained
203 " Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
204 syn match perlElseIfError       "else\_s*if" containedin=perlConditional
205 syn keyword perlElseIfError     elseif containedin=perlConditional
206
207 " Variable interpolation
208 "
209 " These items are interpolated inside "" strings and similar constructs.
210 syn cluster perlInterpDQ        contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
211 " These items are interpolated inside '' strings and similar constructs.
212 syn cluster perlInterpSQ        contains=perlSpecialStringU,perlSpecialStringU2
213 " These items are interpolated inside m// matches and s/// substitutions.
214 syn cluster perlInterpSlash     contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
215 " These items are interpolated inside m## matches and s### substitutions.
216 syn cluster perlInterpMatch     contains=@perlInterpSlash,perlVarSlash
217
218 " Shell commands
219 syn region  perlShellCommand    matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
220
221 " Constants
222 "
223 " Numbers
224 syn match  perlNumber   "\<\%(0\%(x\x[[:xdigit:]_]*\|b[01][01_]*\|\o[0-7_]*\|\)\|[1-9][[:digit:]_]*\)\>"
225 syn match  perlFloat    "\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
226 syn match  perlFloat    "\<\d[[:digit:]_]*\.[[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
227 syn match  perlFloat    "\.[[:digit:]][[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
228
229 syn match  perlString   "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
230 syn match  perlVStringV "\<v" contained
231
232
233 syn region perlParensSQ         start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
234 syn region perlBracketsSQ       start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
235 syn region perlBracesSQ         start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
236 syn region perlAnglesSQ         start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
237
238 syn region perlParensDQ         start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
239 syn region perlBracketsDQ       start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
240 syn region perlBracesDQ         start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
241 syn region perlAnglesDQ         start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
242
243
244 " Simple version of searches and matches
245 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
246 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
247 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'[msixpodualgcn]*+ contains=@perlInterpSQ keepend extend
248 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash keepend extend
249 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)[msixpodualgcn]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
250 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}[msixpodualgcn]*+ contains=@perlInterpMatch,perlBracesDQ extend
251 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>[msixpodualgcn]*+ contains=@perlInterpMatch,perlAnglesDQ keepend extend
252 syn 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.
256 syn 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
261 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
262 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
263 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
264 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
265 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
266 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
267 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
268 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
269 syn region perlSubstitutionGQQ          matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1[msixpodualgcern]*+ keepend contained contains=@perlInterpDQ extend
270 syn region perlSubstitutionGQQ          matchgroup=perlMatchStartEnd start=+(+ end=+)[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlParensDQ keepend extend
271 syn region perlSubstitutionGQQ          matchgroup=perlMatchStartEnd start=+\[+ end=+\][msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend
272 syn region perlSubstitutionGQQ          matchgroup=perlMatchStartEnd start=+{+ end=+}[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend
273 syn region perlSubstitutionGQQ          matchgroup=perlMatchStartEnd start=+<+ end=+>[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend
274 syn 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.
278 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
279 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
280 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
281 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
282 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
283 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
284 syn region perlTranslationGQ            matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1[cdsr]*+ contained
285 syn region perlTranslationGQ            matchgroup=perlMatchStartEnd start=+(+ end=+)[cdsr]*+ contains=perlParensSQ contained
286 syn region perlTranslationGQ            matchgroup=perlMatchStartEnd start=+\[+ end=+\][cdsr]*+ contains=perlBracketsSQ contained
287 syn region perlTranslationGQ            matchgroup=perlMatchStartEnd start=+{+ end=+}[cdsr]*+ contains=perlBracesSQ contained
288 syn region perlTranslationGQ            matchgroup=perlMatchStartEnd start=+<+ end=+>[cdsr]*+ contains=perlAnglesSQ contained
289
290
291 " Strings and q, qq, qw and qr expressions
292
293 syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
294 syn region perlString           matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ keepend extend
295 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
296 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
297 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
298 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
299 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
300 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
301
302 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
303 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
304 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
305 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
306 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
307 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
308
309 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+  end=+\z1+ contains=@perlInterpSQ keepend extend
310 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+  end=+#+ contains=@perlInterpSQ keepend extend
311 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+  end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
312 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+  end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
313 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+  end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
314 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+  end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
315
316 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+  end=+\z1[imosxdual]*+ contains=@perlInterpMatch keepend extend
317 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+  end=+/[imosxdual]*+ contains=@perlInterpSlash keepend extend
318 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+  end=+#[imosxdual]*+ contains=@perlInterpMatch keepend extend
319 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+  end=+'[imosxdual]*+ contains=@perlInterpSQ keepend extend
320 syn 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
323 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+  end=+}[imosxdual]*+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend
324 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+  end=+>[imosxdual]*+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend
325 syn 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.
332 syn region perlHereDocStart     matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+  end=+$+     contains=@perlTop oneline
333 syn region perlHereDocStart     matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+$+ contains=@perlTop oneline
334 syn region perlHereDocStart     matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+$+ contains=@perlTop oneline
335 syn region perlHereDocStart     matchgroup=perlStringStartEnd start=+<<\s*""+       end=+$+     contains=@perlTop oneline
336 syn region perlHereDocStart     matchgroup=perlStringStartEnd start=+<<\s*''+       end=+$+     contains=@perlTop oneline
337 if 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
344 else
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
351 endif
352
353
354 " Class declarations
355 "
356 syn match   perlPackageDecl             "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
357 syn keyword perlStatementPackage        package contained
358
359 " Functions
360 "       sub [name] [(prototype)] {
361 "
362 syn match perlSubError "[^[:space:];{#]" contained
363 syn match perlSubAttributesCont "\h\w*\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained
364 syn region perlSubAttributesCont matchgroup=perlSubAttributesCont start="\h\w*(" end=")\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained contains=@perlInterpSQ,perlParensSQ
365 syn cluster perlSubAttrMaybe contains=perlSubAttributesCont,perlSubError,perlFakeGroup
366 syn match perlSubAttributes "" contained nextgroup=perlSubError
367 syn match perlSubAttributes ":\_s*" contained nextgroup=@perlSubAttrMaybe
368 if get(g:, "perl_sub_signatures", 0)
369     syn match perlSignature +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained
370 else
371     syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained
372     syn match perlSubPrototype +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError
373 endif
374
375 syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlSignature,perlSubAttributes,perlComment
376
377 syn 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
381 syn match  perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
382
383 " All other # are comments, except ^#!
384 syn match  perlComment          "#.*" contains=perlTodo,@Spell extend
385 syn match  perlSharpBang        "^#!.*"
386
387 " Formats
388 syn region perlFormat           matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
389 syn match  perlFormatName       "format\s\+\k\+\s*="lc=7,me=e-1 contained
390 syn match  perlFormatField      "[@^][|<>~]\+\%(\.\.\.\)\=" contained
391 syn match  perlFormatField      "[@^]#[#.]*" contained
392 syn match  perlFormatField      "@\*" contained
393 syn match  perlFormatField      "@[^A-Za-z_|<>~#*]"me=e-1 contained
394 syn match  perlFormatField      "@$" contained
395
396 " __END__ and __DATA__ clauses
397 if 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
400 else
401   syntax region perlDATA                start="^__DATA__$" skip="." end="." contains=@perlDATA
402   syntax region perlDATA                start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA
403 endif
404
405 "
406 " Folding
407
408 if 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
431 else
432   " fromstart above seems to set minlines even if perl_fold is not set.
433   syn sync minlines=0
434 endif
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.
440 hi def link perlSharpBang               PreProc
441 hi def link perlControl         PreProc
442 hi def link perlInclude         Include
443 hi def link perlSpecial         Special
444 hi def link perlString          String
445 hi def link perlCharacter               Character
446 hi def link perlNumber          Number
447 hi def link perlFloat           Float
448 hi def link perlType                    Type
449 hi def link perlIdentifier              Identifier
450 hi def link perlLabel           Label
451 hi def link perlStatement               Statement
452 hi def link perlConditional             Conditional
453 hi def link perlRepeat          Repeat
454 hi def link perlOperator                Operator
455 hi def link perlFunction                Keyword
456 hi def link perlSubName         Function
457 hi def link perlSubPrototype            Type
458 hi def link perlSignature               Type
459 hi def link perlSubAttributes   PreProc
460 hi def link perlSubAttributesCont       perlSubAttributes
461 hi def link perlComment         Comment
462 hi def link perlTodo                    Todo
463 if exists("perl_string_as_statement")
464   hi def link perlStringStartEnd        perlStatement
465 else
466   hi def link perlStringStartEnd        perlString
467 endif
468 hi def link perlVStringV                perlStringStartEnd
469 hi def link perlList                    perlStatement
470 hi def link perlMisc                    perlStatement
471 hi def link perlVarPlain                perlIdentifier
472 hi def link perlVarPlain2               perlIdentifier
473 hi def link perlArrow           perlIdentifier
474 hi def link perlFiledescRead            perlIdentifier
475 hi def link perlFiledescStatement       perlIdentifier
476 hi def link perlVarSimpleMember perlIdentifier
477 hi def link perlVarSimpleMemberName     perlString
478 hi def link perlVarNotInMatches perlIdentifier
479 hi def link perlVarSlash                perlIdentifier
480 hi def link perlQQ                      perlString
481 hi def link perlHereDoc         perlString
482 hi def link perlStringUnexpanded        perlString
483 hi def link perlSubstitutionSQ  perlString
484 hi def link perlSubstitutionGQQ perlString
485 hi def link perlTranslationGQ   perlString
486 hi def link perlMatch           perlString
487 hi def link perlMatchStartEnd   perlStatement
488 hi def link perlFormatName              perlIdentifier
489 hi def link perlFormatField             perlString
490 hi def link perlPackageDecl             perlType
491 hi def link perlStorageClass            perlType
492 hi def link perlPackageRef              perlType
493 hi def link perlStatementPackage        perlStatement
494 hi def link perlStatementStorage        perlStatement
495 hi def link perlStatementControl        perlStatement
496 hi def link perlStatementScalar perlStatement
497 hi def link perlStatementRegexp perlStatement
498 hi def link perlStatementNumeric        perlStatement
499 hi def link perlStatementList   perlStatement
500 hi def link perlStatementHash   perlStatement
501 hi def link perlStatementIOfunc perlStatement
502 hi def link perlStatementFiledesc       perlStatement
503 hi def link perlStatementVector perlStatement
504 hi def link perlStatementFiles  perlStatement
505 hi def link perlStatementFlow   perlStatement
506 hi def link perlStatementInclude        perlStatement
507 hi def link perlStatementProc   perlStatement
508 hi def link perlStatementSocket perlStatement
509 hi def link perlStatementIPC            perlStatement
510 hi def link perlStatementNetwork        perlStatement
511 hi def link perlStatementPword  perlStatement
512 hi def link perlStatementTime   perlStatement
513 hi def link perlStatementMisc   perlStatement
514 hi def link perlStatementIndirObj       perlStatement
515 hi def link perlFunctionName            perlIdentifier
516 hi def link perlMethod          perlIdentifier
517 hi def link perlPostDeref               perlIdentifier
518 hi def link perlFunctionPRef            perlType
519 if !get(g:, 'perl_include_pod', 1)
520   hi def link perlPOD           perlComment
521 endif
522 hi def link perlShellCommand            perlString
523 hi def link perlSpecialAscii            perlSpecial
524 hi def link perlSpecialDollar   perlSpecial
525 hi def link perlSpecialString   perlSpecial
526 hi def link perlSpecialStringU  perlSpecial
527 hi def link perlSpecialMatch            perlSpecial
528 hi 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.
534 hi def link perlParensSQ                perlString
535 hi def link perlBracketsSQ              perlString
536 hi def link perlBracesSQ                perlString
537 hi def link perlAnglesSQ                perlString
538
539 hi def link perlParensDQ                perlString
540 hi def link perlBracketsDQ              perlString
541 hi def link perlBracesDQ                perlString
542 hi def link perlAnglesDQ                perlString
543
544 hi def link perlSpecialStringU2 perlString
545
546 " Possible errors
547 hi def link perlNotEmptyLine            Error
548 hi def link perlElseIfError             Error
549 hi def link perlSubPrototypeError       Error
550 hi def link perlSubError                Error
551
552 " Syncing to speed up processing
553 "
554 if !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 "^}"
558 endif
559
560 if !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*("
563 endif
564
565 if exists("perl_sync_dist")
566   execute "syn sync maxlines=" . perl_sync_dist
567 else
568   syn sync maxlines=100
569 endif
570
571 syn sync match perlSyncPOD      grouphere perlPOD "^=pod"
572 syn sync match perlSyncPOD      grouphere perlPOD "^=head"
573 syn sync match perlSyncPOD      grouphere perlPOD "^=item"
574 syn sync match perlSyncPOD      grouphere NONE "^=cut"
575
576 let b:current_syntax = "perl"
577
578 let &cpo = s:cpo_save
579 unlet s:cpo_save
580
581 " XXX Change to sts=4:sw=4
582 " vim:ts=8:sts=2:sw=2:expandtab:ft=vim