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>
14 " Please download most recent version first before mailing
17 " The following parameters are available for tuning the
18 " perl syntax highlighting, with defaults given:
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
28 " unlet perl_fold_blocks
29 " let perl_nofold_packages = 1
30 " let perl_nofold_subs = 1
32 if exists("b:current_syntax")
37 " POD starts with ^=<word> and ends with ^=cut
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
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
51 " Use only the bare minimum of rules
52 if exists("perl_fold")
53 syn region perlPOD start="^=[a-z]" end="^=cut" fold
55 syn region perlPOD start="^=[a-z]" end="^=cut"
60 syn cluster perlTop contains=TOP
61 syn region perlGenericBlock matchgroup=perlGenericBlock start="{" end="}" contained transparent
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\)\>"
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\)\>"
95 syn match perlStatementMisc "\<\%(warn\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
97 syn keyword perlTodo TODO TBD FIXME XXX NOTE contained
99 syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\<\%(map\|grep\|sort\|print\|system\|exec\)\>\s*{" end="}" contains=@perlTop,perlGenericBlock
101 syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
105 " Should be cleaned up to better handle identifiers in particular situations
106 " (in hash keys for example)
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.
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 "$/"
125 " And plain identifiers
126 syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
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"...
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
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
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
163 syn match perlFiledescRead "<\h\w*>"
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
168 syn match perlFiledescStatement "\u\w*" contained
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
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
194 " Variable interpolation
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
206 syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
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\+\)\="
216 syn match perlString "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
217 syn match perlVStringV "\<v" contained
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
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
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
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
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
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
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
280 " Strings and q, qq, qw and qr expressions
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
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
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
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
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
316 " Constructs such as print <<EOF [...] EOF, 'here' documents
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
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
340 syn match perlPackageDecl "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
341 syn keyword perlStatementPackage package contained
344 " sub [name] [(prototype)] {
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
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
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
360 syn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName
362 if !exists("perl_no_scope_in_variables")
363 syn match perlFunctionPRef "\h\w*::" contained
364 syn match perlFunctionName "\h\w*[^:]" contained
366 syn match perlFunctionName "\h[[:alnum:]_:]*" contained
369 " The => operator forces a bareword to the left of it to be interpreted as
371 syn match perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
373 " All other # are comments, except ^#!
374 syn match perlComment "#.*" contains=perlTodo,@Spell
375 syn match perlSharpBang "^#!.*"
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
386 " __END__ and __DATA__ clauses
387 if exists("perl_fold")
388 syntax region perlDATA start="^__\%(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
390 syntax region perlDATA start="^__\%(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
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
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
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
412 setlocal foldmethod=syntax
415 " fromstart above seems to set minlines even if perl_fold is not set.
419 command -nargs=+ HiLink hi def link <args>
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
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
444 if exists("perl_string_as_statement")
445 HiLink perlStringStartEnd perlStatement
447 HiLink perlStringStartEnd perlString
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
509 HiLink perlNotEmptyLine Error
510 HiLink perlElseIfError Error
511 HiLink perlSubPrototypeError Error
512 HiLink perlSubError Error
516 " Syncing to speed up processing
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 "^}"
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*("
529 if exists("perl_sync_dist")
530 execute "syn sync maxlines=" . perl_sync_dist
532 syn sync maxlines=100
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"
540 let b:current_syntax = "perl"
542 " XXX Change to sts=4:sw=4
543 " vim:ts=8:sts=2:sw=2:expandtab:ft=vim