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