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