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