codekingpro/portable-devtools
114k
1" Vim syntax file2" Language: Perl3" Maintainer: vim-perl <vim-perl@googlegroups.com> (need to be subscribed to post)4" Homepage: https://github.com/vim-perl/vim-perl5" Bugs/requests: https://github.com/vim-perl/vim-perl/issues6" License: Vim License (see :help license)7" Last Change: 2022 Jun 138" Contributors: Andy Lester <andy@petdance.com>9" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>10" Lukas Mai <l.mai.web.de>11" Nick Hibma <nick@van-laarhoven.org>12" Sonia Heimann <niania@netsurf.org>13" Rob Hoelz <rob@hoelz.ro>14" Doug Kearns <dougkearns@gmail.com>15" and many others.16"17" Please download the most recent version first, before mailing18" any comments.19"20" The following parameters are available for tuning the21" perl syntax highlighting, with defaults given:22"23" let perl_include_pod = 124" unlet perl_no_scope_in_variables25" unlet perl_no_extended_vars26" unlet perl_string_as_statement27" unlet perl_no_sync_on_sub28" unlet perl_no_sync_on_global_var29" let perl_sync_dist = 10030" unlet perl_fold31" unlet perl_fold_blocks32" unlet perl_nofold_packages33" unlet perl_nofold_subs34" unlet perl_fold_anonymous_subs35" unlet perl_no_subprototype_error36 37if exists("b:current_syntax")38 finish39endif40 41let s:cpo_save = &cpo42set cpo&vim43 44" POD starts with ^=<word> and ends with ^=cut45 46if get(g:, 'perl_include_pod', 1)47 " Include a while extra syntax file48 syn include @Pod syntax/pod.vim49 unlet b:current_syntax50 if get(g:, 'perl_fold', 1)51 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend52 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend53 else54 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend55 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend56 endif57else58 " Use only the bare minimum of rules59 if get(g:, 'perl_fold', 1)60 syn region perlPOD start="^=[a-z]" end="^=cut" fold61 else62 syn region perlPOD start="^=[a-z]" end="^=cut"63 endif64endif65 66 67syn cluster perlTop contains=TOP68 69syn region perlBraces start="{" end="}" transparent extend70 71" All keywords72"73syn match perlConditional "\<\%(if\|elsif\|unless\|given\|when\|default\)\>"74syn match perlConditional "\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty75syn match perlRepeat "\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"76syn match perlOperator "\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"77" for some reason, adding this as the nextgroup for perlControl fixes BEGIN78" folding issues...79syn match perlFakeGroup "" contained80syn match perlControl "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup81 82syn match perlStatementStorage "\<\%(my\|our\|local\|state\)\>"83syn match perlStatementControl "\<\%(return\|last\|next\|redo\|goto\|break\)\>"84syn match perlStatementScalar "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"85syn match perlStatementRegexp "\<\%(pos\|quotemeta\|split\|study\)\>"86syn match perlStatementNumeric "\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"87syn match perlStatementList "\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"88syn match perlStatementHash "\<\%(delete\|each\|exists\|keys\|values\)\>"89syn match perlStatementIOfunc "\<\%(syscall\|dbmopen\|dbmclose\)\>"90syn match perlStatementFiledesc "\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite91syn match perlStatementFiledesc "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite92syn match perlStatementVector "\<vec\>"93syn match perlStatementFiles "\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"94syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"95syn match perlStatementFlow "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"96syn match perlStatementInclude "\<\%(require\|import\|unimport\)\>"97syn match perlStatementInclude "\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\%(::\%(exception\%(::system\)\=\|hints\|skip\)\)\=\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|deprecate\|diagnostics\|encoding\%(::warnings\)\=\|experimental\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|ok\|open\|ops\|overload\|overloading\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="98syn match perlStatementProc "\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"99syn match perlStatementSocket "\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"100syn match perlStatementIPC "\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"101syn match perlStatementNetwork "\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"102syn match perlStatementPword "\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"103syn match perlStatementTime "\<\%(gmtime\|localtime\|time\)\>"104 105syn match perlStatementMisc "\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"106 107syn keyword perlTodo TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained108 109syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend110 111syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"112 113" Perl Identifiers.114"115" Should be cleaned up to better handle identifiers in particular situations116" (in hash keys for example)117"118" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.119" We do not process complex things such as @{${"foo"}}. Too complicated, and120" too slow. And what is after the -> is *not* considered as part of the121" variable - there again, too complicated and too slow.122 123" Special variables first ($^A, ...) and ($|, $', ...)124syn match perlVarPlain "$^[ACDEFHILMNOPRSTVWX]\="125syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"126syn match perlVarPlain "@[-+]"127syn match perlVarPlain "$\%(0\|[1-9]\d*\)"128" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)129syn match perlVarPlain "$::\@!"130" These variables are not recognized within matches.131syn match perlVarNotInMatches "$[|)]"132" This variable is not recognized within matches delimited by m//.133syn match perlVarSlash "$/"134 135" And plain identifiers136syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained137 138" To not highlight packages in variables as a scope reference - i.e. in139" $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"140" If you don't want complex things like @{${"foo"}} to be processed,141" just set the variable "perl_no_extended_vars"...142 143if !get(g:, 'perl_no_scope_in_variables', 0)144 syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref145 syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref146 syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref147else148 syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref149 syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref150 syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref151endif152 153syn match perlVarPlain2 "%[-+]"154 155if !get(g:, 'perl_no_extended_vars', 0)156 syn cluster perlExpr contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQ,perlQQ,perlQW,perlQR,perlArrow,perlBraces157 syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained158 syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained159 syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained160 syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained161 syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend162 syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend163 syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend164 syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend165 syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend166 syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contains=perlVarSimpleMemberName contained extend167 syn match perlVarSimpleMemberName "\I\i*" contained168 syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend169 syn match perlPackageConst "__PACKAGE__" nextgroup=perlPostDeref170 syn match perlPostDeref "->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref171 syn region perlPostDeref start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref172 syn region perlPostDeref matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" keepend extend contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref173endif174 175" File Descriptors176syn match perlFiledescRead "<\h\w*>"177 178syn match perlFiledescStatementComma "(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement179syn match perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement180 181syn match perlFiledescStatement "\<\u\w*\>" contained182 183" Special characters in strings and matches184syn match perlSpecialString "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend185syn match perlSpecialStringU2 "\\." extend contained contains=NONE186syn match perlSpecialStringU "\\\\" contained187syn match perlSpecialMatch "\\[1-9]" contained extend188syn match perlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained189syn match perlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained190syn match perlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained191syn match perlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend192syn match perlSpecialMatch "[+*()?.]" contained193syn match perlSpecialMatch "(?[#:=!]" contained194syn match perlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained195syn match perlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained196syn match perlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained197syn match perlSpecialMatch "(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained198 199" Possible errors200"201" Highlight lines with only whitespace (only in blank delimited here documents) as errors202syn match perlNotEmptyLine "^\s\+$" contained203" Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"204syn match perlElseIfError "else\_s*if" containedin=perlConditional205syn keyword perlElseIfError elseif containedin=perlConditional206 207" Variable interpolation208"209" These items are interpolated inside "" strings and similar constructs.210syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock211" These items are interpolated inside '' strings and similar constructs.212syn cluster perlInterpSQ contains=perlSpecialStringU,perlSpecialStringU2213" These items are interpolated inside m// matches and s/// substitutions.214syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock215" These items are interpolated inside m## matches and s### substitutions.216syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash217 218" Shell commands219syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend220 221" Constants222"223" Numbers224syn case ignore225syn match perlNumber "\<\%(0\|[1-9]\%(_\=\d\)*\)\>"226syn match perlNumber "\<0\%(x\x\%(_\=\x\)*\|b[01]\%(_\=[01]\)*\|o\=\%(_\=\o\)*\)\>"227syn match perlFloat "\<\d\%(_\=\d\)*e[-+]\=\d\%(_\=\d\)*"228syn match perlFloat "\<\d\%(_\=\d\)*\.\%(\d\%(_\=\d\)*\)\=\%(e[-+]\=\d\%(_\=\d\)*\)\="229syn match perlFloat "\.\d\%(_\=\d\)*\%(e[-+]\=\d\%(_\=\d\)*\)\="230syn match perlFloat "\<0x\x\%(_\=\x\)*p[-+]\=\d\%(_\=\d\)*"231syn match perlFloat "\<0x\x\%(_\=\x\)*\.\%(\x\%(_\=\x\)*\)\=\%(p[-+]\=\d\%(_\=\d\)*\)\="232syn match perlFloat "\<0x\.\x\%(_\=\x\)*\%(p[-+]\=\d\%(_\=\d\)*\)\="233syn case match234 235syn match perlString "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV236syn match perlVStringV "\<v" contained237 238 239syn region perlParensSQ start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend240syn region perlBracketsSQ start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend241syn region perlBracesSQ start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend242syn region perlAnglesSQ start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend243 244syn region perlParensDQ start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend245syn region perlBracketsDQ start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend246syn region perlBracesDQ start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend247syn region perlAnglesDQ start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend248 249 250" Simple version of searches and matches251syn match perlMatchModifiers "[msixpadluncgo]\+" contained252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers254syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlMatchModifiers255syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlMatchModifiers256syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlMatchModifiers257syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ extend nextgroup=perlMatchModifiers258syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ keepend extend nextgroup=perlMatchModifiers259syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ keepend extend nextgroup=perlMatchModifiers260 261" Below some hacks to recognise the // variant. This is virtually impossible to catch in all262" cases as the / is used in so many other ways, but these should be the most obvious ones.263syn 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=+/+ contains=@perlInterpSlash extend nextgroup=perlMatchModifiers264 265 266" Substitutions267" perlMatch is the first part, perlSubstitution* is the substitution part268syn match perlSubstitutionModifiers "[msixpadluncgero]\+" contained269syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend270syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend274syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend275syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend276syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend277syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1+ keepend contained contains=@perlInterpDQ extend nextgroup=perlSubstitutionModifiers278syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contained contains=@perlInterpDQ,perlParensDQ keepend extend nextgroup=perlSubstitutionModifiers279syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend nextgroup=perlSubstitutionModifiers280syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend nextgroup=perlSubstitutionModifiers281syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend nextgroup=perlSubstitutionModifiers282syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'+ contained contains=@perlInterpSQ keepend extend nextgroup=perlSubstitutionModifiers283 284" Translations285" perlMatch is the first part, perlTranslation* is the second, translator part.286syn match perlTranslationModifiers "[cdsr]\+" contained287syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ288syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ289syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl290syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl291syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl292syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl293syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1+ contained nextgroup=perlTranslationModifiers294syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contains=perlParensSQ contained nextgroup=perlTranslationModifiers295syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contains=perlBracketsSQ contained nextgroup=perlTranslationModifiers296syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contains=perlBracesSQ contained nextgroup=perlTranslationModifiers297syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contains=perlAnglesSQ contained nextgroup=perlTranslationModifiers298 299 300" Strings and q, qq, qw and qr expressions301 302syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend303syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ keepend extend304syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend305syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend306syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend307syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend308syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend309syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend310 311syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend312syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend313syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend314syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend315syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend316syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend317 318syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend319syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+ end=+#+ contains=@perlInterpSQ keepend extend320syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend321syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend322syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend323syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend324 325syn match perlQRModifiers "[msixpadluno]\+" contained326syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers327syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlQRModifiers328syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers329syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlQRModifiers330syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlQRModifiers331 332" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern333syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend nextgroup=perlQRModifiers334syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend nextgroup=perlQRModifiers335syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend nextgroup=perlQRModifiers336 337" Constructs such as print <<EOF [...] EOF, 'here' documents338"339" XXX Any statements after the identifier are in perlString colour (i.e.340" 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it341" seems due to the 'auto-extending nature' of regions.342" XXX Indented heredocs are not perfect - they sometimes seem to take a moment343" to update if switched from double to single quotes and vice versa.344"345" Note: bare delimiters such as << to mean <<"" are not supported. These are a346" fatal error since 5.28 and, apparently, a rarely used feature.347 348syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\I\i*+ end=+$+ contains=@perlTop oneline349syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\\\I\i*+ end=+$+ contains=@perlTop oneline350syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*"[^\\"]*\%(\\.[^\\"]*\)*"+ end=+$+ contains=@perlTop oneline351syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*'[^\\']*\%(\\.[^\\']*\)*'+ end=+$+ contains=@perlTop oneline352syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*`[^\\`]*\%(\\.[^\\`]*\)*`+ end=+$+ contains=@perlTop oneline353syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*""+ end=+$+ contains=@perlTop oneline354syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*''+ end=+$+ contains=@perlTop oneline355syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*``+ end=+$+ contains=@perlTop oneline356 357if get(g:, 'perl_fold', 0)358 syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend359 syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend360 syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend361 syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend362 syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend363 syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend364 syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend365 syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend366else367 syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ368 syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ369 syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ370 syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ371 syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ372 syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine373 syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine374 syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine375endif376 377if get(g:, 'perl_fold', 0)378 syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend379 syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend380 syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend381 syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend382 syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend383 syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend384 syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend385 syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend386else387 syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ388 syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ389 syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ390 syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ391 syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ392 syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine393 syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine394 syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine395endif396 397 398" Class declarations399"400syn match perlPackageDecl "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage401syn keyword perlStatementPackage package contained402 403" Functions404if get(g:, "perl_sub_signatures", 0)405 syn match perlSubSignature "\s*([^)]*)" contained extend406else407 syn match perlSubPrototype "\s*([\\$@%&*\[\];]*)" contained extend408endif409syn match perlSubAttribute "\s*:\s*\h\w*\%(([^)]*)\|\)" contained extend410syn match perlSubName "\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\s*" contained extend411syn region perlSubDeclaration start="" end="[;{]" contains=perlSubName,perlSubPrototype,perlSubAttribute,perlSubSignature,perlComment contained transparent412syn match perlFunction "\<sub\>\_s*" nextgroup=perlSubDeclaration413 414" The => operator forces a bareword to the left of it to be interpreted as415" a string416syn match perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="417 418" All other # are comments, except ^#!419syn match perlComment "#.*" contains=perlTodo,@Spell extend420syn match perlSharpBang "^#!.*"421 422" Formats423syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2424syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained425syn match perlFormatField "[@^][|<>~]\+\%(\.\.\.\)\=" contained426syn match perlFormatField "[@^]#[#.]*" contained427syn match perlFormatField "@\*" contained428syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained429syn match perlFormatField "@$" contained430 431" __END__ and __DATA__ clauses432 433" Vim excludes empty syn-region end lines from the fold region. This is434" probably a bug and means a DATA section ending with an empty line does not435" have that final line included in the fold.436"437" As a workaround we exploit an unterminated syntax region here with an end438" pattern that will (probably) never match. This forces all lines to be439" included in the fold region. Of course, if it does match then there's440" nothing to work around as it is a non-empty line.441"442" This problem also exists with empty string delimited heredocs but there's no443" known workaround for that case.444if get(g:, 'perl_fold', 0)445 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold446 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold447else448 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="\%$" contains=@perlDATA449 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="\%$" contains=@perlDATA450endif451 452" TODO: generalise this to allow other filetypes453if get(g:, 'perl_highlight_data', 0)454 syn cluster perlDATA add=perlPOD455else456 syn cluster perlDATA remove=perlPOD457endif458 459"460" Folding461if get(g:, 'perl_fold', 0)462 " Note: this bit must come before the actual highlighting of the "package"463 " keyword, otherwise this will screw up Pod lines that match /^package/464 if !get(g:, 'perl_nofold_packages', 0)465 syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend466 syn region perlPackageFold start="^\z(\s*\)package\s*\S\+\s*{" end="^\z1}" transparent fold keepend467 endif468 if !get(g:, 'perl_nofold_subs', 0)469 if get(g:, "perl_fold_anonymous_subs", 0)470 " EXPLANATION:471 " \<sub\> - "sub" keyword472 " \_[^;{]* - any characters, including new line, but not ";" or "{", zero or more times473 " \%(([\\$@%&*\[\];]*)\)\= - prototype definition, \$@%&*[]; characters between (), zero or 1 times474 " \_[^;]* - any characters, including new line, but not ";" or "{", zero or more times475 " { - start subroutine block476 syn region perlSubFold start="\<sub\>\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;{]*{" end="}" transparent fold keepend extend477 else478 " EXPLANATION:479 " same, as above, but first non-space character after "sub" keyword must480 " be [A-Za-z_] 481 syn region perlSubFold start="\<sub\>\s*\h\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;]*{" end="}" transparent fold keepend extend482 endif483 484 syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>\_s*{" end="}" transparent fold keepend485 endif486 487 if get(g:, 'perl_fold_blocks', 0)488 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 keepend489 490 " TODO this is works incorrectly491 syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend492 else493 if get(g:, 'perl_fold_do_blocks', 0)494 syn region perlDoBlockDeclaration start="" end="{" contains=perlComment contained transparent495 syn match perlOperator "\<do\>\_s*" nextgroup=perlDoBlockDeclaration496 497 syn region perlDoBlockFold start="\<do\>\_[^{]*{" end="}" transparent fold keepend extend498 endif499 endif500 501 syn sync fromstart502else503 " fromstart above seems to set minlines even if perl_fold is not set.504 syn sync minlines=0505endif506 507" NOTE: If you're linking new highlight groups to perlString, please also put508" them into b:match_skip in ftplugin/perl.vim.509 510" The default highlighting.511hi def link perlSharpBang PreProc512hi def link perlControl PreProc513hi def link perlInclude Include514hi def link perlSpecial Special515hi def link perlString String516hi def link perlCharacter Character517hi def link perlNumber Number518hi def link perlFloat Float519hi def link perlType Type520hi def link perlIdentifier Identifier521hi def link perlLabel Label522hi def link perlStatement Statement523hi def link perlConditional Conditional524hi def link perlRepeat Repeat525hi def link perlOperator Operator526hi def link perlFunction Keyword527hi def link perlSubName Function528hi def link perlSubPrototype Type529hi def link perlSubSignature Type530hi def link perlSubAttribute PreProc531hi def link perlComment Comment532hi def link perlTodo Todo533if get(g:, 'perl_string_as_statement', 0)534 hi def link perlStringStartEnd perlStatement535else536 hi def link perlStringStartEnd perlString537endif538hi def link perlVStringV perlStringStartEnd539hi def link perlList perlStatement540hi def link perlMisc perlStatement541hi def link perlVarPlain perlIdentifier542hi def link perlVarPlain2 perlIdentifier543hi def link perlArrow perlIdentifier544hi def link perlFiledescRead perlIdentifier545hi def link perlFiledescStatement perlIdentifier546hi def link perlVarSimpleMember perlIdentifier547hi def link perlVarSimpleMemberName perlString548hi def link perlVarNotInMatches perlIdentifier549hi def link perlVarSlash perlIdentifier550hi def link perlQ perlString551hi def link perlQQ perlString552hi def link perlQW perlString553hi def link perlQR perlString554hi def link perlMatchModifiers perlMatchStartEnd555hi def link perlSubstitutionModifiers perlMatchStartEnd556hi def link perlTranslationModifiers perlMatchStartEnd557hi def link perlQRModifiers perlStringStartEnd558hi def link perlHereDoc perlString559hi def link perlIndentedHereDoc perlString560hi def link perlStringUnexpanded perlString561hi def link perlSubstitutionSQ perlString562hi def link perlSubstitutionGQQ perlString563hi def link perlTranslationGQ perlString564hi def link perlMatch perlString565hi def link perlMatchStartEnd perlStatement566hi def link perlFormatName perlIdentifier567hi def link perlFormatField perlString568hi def link perlPackageDecl perlType569hi def link perlStorageClass perlType570hi def link perlPackageRef perlType571hi def link perlStatementPackage perlStatement572hi def link perlStatementStorage perlStatement573hi def link perlStatementControl perlStatement574hi def link perlStatementScalar perlStatement575hi def link perlStatementRegexp perlStatement576hi def link perlStatementNumeric perlStatement577hi def link perlStatementList perlStatement578hi def link perlStatementHash perlStatement579hi def link perlStatementIOfunc perlStatement580hi def link perlStatementFiledesc perlStatement581hi def link perlStatementVector perlStatement582hi def link perlStatementFiles perlStatement583hi def link perlStatementFlow perlStatement584hi def link perlStatementInclude perlStatement585hi def link perlStatementProc perlStatement586hi def link perlStatementSocket perlStatement587hi def link perlStatementIPC perlStatement588hi def link perlStatementNetwork perlStatement589hi def link perlStatementPword perlStatement590hi def link perlStatementTime perlStatement591hi def link perlStatementMisc perlStatement592hi def link perlStatementIndirObj perlStatement593hi def link perlFunctionName perlIdentifier594hi def link perlMethod perlIdentifier595hi def link perlPostDeref perlIdentifier596hi def link perlFunctionPRef perlType597 598if !get(g:, 'perl_include_pod', 1)599 hi def link perlPOD perlComment600endif601hi def link perlShellCommand perlString602hi def link perlSpecialAscii perlSpecial603hi def link perlSpecialDollar perlSpecial604hi def link perlSpecialString perlSpecial605hi def link perlSpecialStringU perlSpecial606hi def link perlSpecialMatch perlSpecial607hi def link perlEND perlComment608hi def link perlENDStart perlEND609hi def link perlDATA perlComment610hi def link perlDATAStart perlDATA611 612" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),613" I had to remove the transparent property from the following regions614" in order to get them to highlight correctly. Feel free to remove615" these and reinstate the transparent property if you know how.616hi def link perlParensSQ perlString617hi def link perlBracketsSQ perlString618hi def link perlBracesSQ perlString619hi def link perlAnglesSQ perlString620 621hi def link perlParensDQ perlString622hi def link perlBracketsDQ perlString623hi def link perlBracesDQ perlString624hi def link perlAnglesDQ perlString625 626hi def link perlSpecialStringU2 perlString627 628" Possible errors629hi def link perlNotEmptyLine Error630hi def link perlElseIfError Error631 632" Syncing to speed up processing633"634if !get(g:, 'perl_no_sync_on_sub', 0)635 syn sync match perlSync grouphere NONE "^\s*\<package\s"636 syn sync match perlSync grouphere NONE "^\s*\<sub\>"637 syn sync match perlSync grouphere NONE "^}"638endif639 640if !get(g:, 'perl_no_sync_on_global_var', 0)641 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"642 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("643endif644 645if get(g:, 'perl_sync_dist', 0)646 execute "syn sync maxlines=" . perl_sync_dist647else648 syn sync maxlines=100649endif650 651syn sync match perlSyncPOD grouphere perlPOD "^=pod"652syn sync match perlSyncPOD grouphere perlPOD "^=head"653syn sync match perlSyncPOD grouphere perlPOD "^=item"654syn sync match perlSyncPOD grouphere NONE "^=cut"655 656let b:current_syntax = "perl"657 658let &cpo = s:cpo_save659unlet s:cpo_save660 661" XXX Change to sts=4:sw=4662" vim:ts=8:sts=2:sw=2:expandtab:ft=vim663 