1" Vim syntax file 2" Language: Perl 3" Maintainer: Nick Hibma <[email protected]> 4" Last Change: 2006 November 23 5" Location: http://www.van-laarhoven.org/vim/syntax/perl.vim 6" 7" Please download most recent version first before mailing 8" any comments. 9" See also the file perl.vim.regression.pl to check whether your 10" modifications work in the most odd cases 11" http://www.van-laarhoven.org/vim/syntax/perl.vim.regression.pl 12" 13" Original version: Sonia Heimann <[email protected]> 14" Thanks to many people for their contribution. 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_want_scope_in_variables 21" unlet perl_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 31" Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file 32" was already loaded (6.x). 33if version < 600 34 syntax clear 35elseif exists("b:current_syntax") 36 finish 37endif 38 39" Unset perl_fold if it set but vim doesn't support it. 40if version < 600 && exists("perl_fold") 41 unlet perl_fold 42endif 43 44 45" POD starts with ^=<word> and ends with ^=cut 46 47if exists("perl_include_pod") 48 " Include a while extra syntax file 49 syn include @Pod syntax/pod.vim 50 unlet b:current_syntax 51 if exists("perl_fold") 52 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold 53 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold 54 else 55 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend 56 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend 57 endif 58else 59 " Use only the bare minimum of rules 60 if exists("perl_fold") 61 syn region perlPOD start="^=[a-z]" end="^=cut" fold 62 else 63 syn region perlPOD start="^=[a-z]" end="^=cut" 64 endif 65endif 66 67 68" All keywords 69" 70if exists("perl_fold") && exists("perl_fold_blocks") 71 syn match perlConditional "\<if\>" 72 syn match perlConditional "\<elsif\>" 73 syn match perlConditional "\<unless\>" 74 syn match perlConditional "\<else\>" nextgroup=perlElseIfError skipwhite skipnl skipempty 75else 76 syn keyword perlConditional if elsif unless 77 syn keyword perlConditional else nextgroup=perlElseIfError skipwhite skipnl skipempty 78endif 79syn keyword perlConditional switch eq ne gt lt ge le cmp not and or xor err 80if exists("perl_fold") && exists("perl_fold_blocks") 81 syn match perlRepeat "\<while\>" 82 syn match perlRepeat "\<for\>" 83 syn match perlRepeat "\<foreach\>" 84 syn match perlRepeat "\<do\>" 85 syn match perlRepeat "\<until\>" 86 syn match perlRepeat "\<continue\>" 87else 88 syn keyword perlRepeat while for foreach do until continue 89endif 90syn keyword perlOperator defined undef and or not bless ref 91if exists("perl_fold") 92 " if BEGIN/END would be a keyword the perlBEGINENDFold does not work 93 syn match perlControl "\<BEGIN\|CHECK\|INIT\|END\>" contained 94else 95 syn keyword perlControl BEGIN END CHECK INIT 96endif 97 98syn keyword perlStatementStorage my local our 99syn keyword perlStatementControl goto return last next redo 100syn keyword perlStatementScalar chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst 101syn keyword perlStatementRegexp pos quotemeta split study 102syn keyword perlStatementNumeric abs atan2 cos exp hex int log oct rand sin sqrt srand 103syn keyword perlStatementList splice unshift shift push pop split join reverse grep map sort unpack 104syn keyword perlStatementHash each exists keys values tie tied untie 105syn keyword perlStatementIOfunc carp confess croak dbmclose dbmopen die syscall 106syn keyword perlStatementFiledesc binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite 107syn keyword perlStatementFiledesc fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite 108syn keyword perlStatementVector pack vec 109syn keyword perlStatementFiles chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime 110syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>" 111syn keyword perlStatementFlow caller die dump eval exit wantarray 112syn keyword perlStatementInclude require 113syn match perlStatementInclude "\<\(use\|no\)\s\+\(\(integer\|strict\|lib\|sigtrap\|subs\|vars\|warnings\|utf8\|byte\|base\|fields\)\>\)\=" 114syn keyword perlStatementScope import 115syn keyword perlStatementProc alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid 116syn keyword perlStatementSocket accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair 117syn keyword perlStatementIPC msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite 118syn keyword perlStatementNetwork endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent 119syn keyword perlStatementPword getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent 120syn keyword perlStatementTime gmtime localtime time times 121 122syn keyword perlStatementMisc warn formline reset scalar delete prototype lock 123syn keyword perlStatementNew new 124 125syn keyword perlTodo TODO TBD FIXME XXX contained 126 127" Perl Identifiers. 128" 129" Should be cleaned up to better handle identifiers in particular situations 130" (in hash keys for example) 131" 132" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc. 133" We do not process complex things such as @{${"foo"}}. Too complicated, and 134" too slow. And what is after the -> is *not* considered as part of the 135" variable - there again, too complicated and too slow. 136 137" Special variables first ($^A, ...) and ($|, $', ...) 138syn match perlVarPlain "$^[ADEFHILMOPSTWX]\=" 139syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]" 140syn match perlVarPlain "$\(0\|[1-9][0-9]*\)" 141" Same as above, but avoids confusion in $::foo (equivalent to $main::foo) 142syn match perlVarPlain "$:[^:]" 143" These variables are not recognized within matches. 144syn match perlVarNotInMatches "$[|)]" 145" This variable is not recognized within matches delimited by m//. 146syn match perlVarSlash "$/" 147 148" And plain identifiers 149syn match perlPackageRef "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained 150 151" To highlight packages in variables as a scope reference - i.e. in $pack::var, 152" pack:: is a scope, just set "perl_want_scope_in_variables" 153" If you *want* complex things like @{${"foo"}} to be processed, 154" just set the variable "perl_extended_vars"... 155 156" FIXME value between {} should be marked as string. is treated as such by Perl. 157" At the moment it is marked as something greyish instead of read. Probably todo 158" with transparency. Or maybe we should handle the bare word in that case. or make it into 159 160if exists("perl_want_scope_in_variables") 161 syn match perlVarPlain "\\\=\([@$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod 162 syn match perlVarPlain2 "\\\=%\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod 163 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember 164else 165 syn match perlVarPlain "\\\=\([@$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod 166 syn match perlVarPlain2 "\\\=%\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod 167 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember 168endif 169 170if exists("perl_extended_vars") 171 syn cluster perlExpr contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ 172 syn region perlVarBlock matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember 173 syn region perlVarBlock matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr 174 syn match perlVarPlain "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember 175 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember 176 syn match perlVarSimpleMember "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained 177 syn match perlVarSimpleMemberName "\I\i*" contained 178 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember 179 syn match perlMethod "\(->\)\I\i*" contained 180endif 181 182" File Descriptors 183syn match perlFiledescRead "[<]\h\w\+[>]" 184 185syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement 186syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement 187 188syn match perlFiledescStatement "\u\w*" contained 189 190" Special characters in strings and matches 191syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained 192syn match perlSpecialStringU "\\['\\]" contained 193syn match perlSpecialMatch "{\d\+\(,\(\d\+\)\=\)\=}" contained 194syn match perlSpecialMatch "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained 195syn match perlSpecialMatch "[+*()?.]" contained 196syn match perlSpecialMatch "(?[#:=!]" contained 197syn match perlSpecialMatch "(?[imsx]\+)" contained 198" FIXME the line below does not work. It should mark end of line and 199" begin of line as perlSpecial. 200" syn match perlSpecialBEOM "^\^\|\$$" contained 201 202" Possible errors 203" 204" Highlight lines with only whitespace (only in blank delimited here documents) as errors 205syn match perlNotEmptyLine "^\s\+$" contained 206" Highlight '} else if (...) {', it should be '} else { if (...) { ' or 207" '} elsif (...) {'. 208"syn keyword perlElseIfError if contained 209 210" Variable interpolation 211" 212" These items are interpolated inside "" strings and similar constructs. 213syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock 214" These items are interpolated inside '' strings and similar constructs. 215syn cluster perlInterpSQ contains=perlSpecialStringU 216" These items are interpolated inside m// matches and s/// substitutions. 217syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM 218" These items are interpolated inside m## matches and s### substitutions. 219syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash 220 221" Shell commands 222syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ 223 224" Constants 225" 226" Numbers 227syn match perlNumber "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)" 228syn match perlFloat "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+" 229syn match perlFloat "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\=" 230syn match perlFloat "[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\=" 231 232 233" Simple version of searches and matches 234" caters for m//, m##, m{} and m[] (and the !/ variant) 235syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash 236syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch 237syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch 238syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch 239 240" A special case for m!!x which allows for comments and extra whitespace in the pattern 241syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment 242 243" Below some hacks to recognise the // variant. This is virtually impossible to catch in all 244" cases as the / is used in so many other ways, but these should be the most obvious ones. 245syn region perlMatch matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^while /+lc=5 start=+[^$@%]\<while /+lc=6 start=+^if /+lc=2 start=+[^$@%]\<if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash 246 247 248" Substitutions 249" caters for s///, s### and s[][] 250" perlMatch is the first part, perlSubstitution* is the substitution part 251syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ 252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ 253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash 254syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash 255syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl 256syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl 257syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ 258syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ 259syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ 260syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ 261syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ 262syn region perlSubstitutionCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ 263 264" A special case for m!!x which allows for comments and extra whitespace in the pattern 265syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling 266syn region perlSubstitutionPling matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ 267 268" Substitutions 269" caters for tr///, tr### and tr[][] 270" perlMatch is the first part, perlTranslation* is the second, translator part. 271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ 272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ 273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash 274syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash 275syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl 276syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl 277syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained 278syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained 279syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained 280syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained 281syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained 282syn region perlTranslationCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained 283 284 285" The => operator forces a bareword to the left of it to be interpreted as 286" a string 287syn match perlString "\<\I\i*\s*=>"me=e-2 288 289" Strings and q, qq, qw and qr expressions 290 291" Brackets in qq() 292syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ 293 294syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ 295syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ 296syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ 297syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ 298syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets 299syn region perlQQ matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ 300syn region perlQQ matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ 301syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ 302syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ 303syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets 304syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ 305syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ 306syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ 307syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ 308syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlBrackets 309syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ 310syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ 311syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr#+ end=+#[imosx]*+ contains=@perlInterpMatch 312syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr|+ end=+|[imosx]*+ contains=@perlInterpMatch 313syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr(+ end=+)[imosx]*+ contains=@perlInterpMatch 314syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr{+ end=+}[imosx]*+ contains=@perlInterpMatch 315syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash 316 317" Constructs such as print <<EOF [...] EOF, 'here' documents 318" 319if version >= 600 320 " XXX Any statements after the identifier are in perlString colour (i.e. 321 " 'if $a' in 'print <<EOF if $a'). 322 if exists("perl_fold") 323 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\).*+ end=+^\z1$+ contains=@perlInterpDQ fold 324 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold 325 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold 326 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold 327 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold 328 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold 329 else 330 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ 331 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ 332 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ 333 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine 334 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine 335 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL 336 endif 337else 338 syn match perlUntilEOFStart "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent 339 syn match perlUntilEOFStart "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent 340 syn match perlUntilEOFStart "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent 341 syn match perlUntilEOFStart "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent 342 syn match perlUntilEOFStart "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent 343 syn region perlUntilEOFDQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained 344 syn region perlUntilEOFSQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained 345 syn region perlUntilEmptySQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained 346 syn region perlUntilEmptyDQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained 347 syn match perlHereIdentifier "<<EOF" 348 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL 349endif 350 351 352" Class declarations 353" 354syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage 355syn keyword perlStatementPackage package contained 356 357" Functions 358" sub [name] [(prototype)] { 359" 360syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment 361syn keyword perlStatementSub sub contained 362 363syn match perlFunctionPrototype "([^)]*)" contained 364if exists("perl_want_scope_in_variables") 365 syn match perlFunctionPRef "\h\w*::" contained 366 syn match perlFunctionName "\h\w*[^:]" contained 367else 368 syn match perlFunctionName "\h[[:alnum:]_:]*" contained 369endif 370 371" All other # are comments, except ^#! 372syn match perlComment "#.*" contains=perlTodo 373syn match perlSharpBang "^#!.*" 374 375" Formats 376syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2 377syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained 378syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained 379syn match perlFormatField "[@^]#[#.]*" contained 380syn match perlFormatField "@\*" contained 381syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained 382syn match perlFormatField "@$" contained 383 384" __END__ and __DATA__ clauses 385if exists("perl_fold") 386 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold 387else 388 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA 389endif 390 391 392" 393" Folding 394 395if exists("perl_fold") 396 if !exists("perl_nofold_packages") 397 syn region perlPackageFold start="^package \S\+;\s*\(#.*\)\=$" end="^1;\s*\(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend 398 endif 399 if !exists("perl_nofold_subs") 400 syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\(#.*\)\=$" transparent fold keepend 401 syn region perlSubFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend 402 endif 403 404 if exists("perl_fold_blocks") 405 syn region perlBlockFold start="^\z(\s*\)\(if\|elsif\|unless\|for\|while\|until\)\s*(.*)\(\s*{\)\=\s*\(#.*\)\=$" start="^\z(\s*\)foreach\s*\(\(my\|our\)\=\s*\S\+\s*\)\=(.*)\(\s*{\)\=\s*\(#.*\)\=$" end="^\z1}\s*;\=\(#.*\)\=$" transparent fold keepend 406 syn region perlBlockFold start="^\z(\s*\)\(do\|else\)\(\s*{\)\=\s*\(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\(#.*\)\=$" transparent fold keepend 407 endif 408 409 setlocal foldmethod=syntax 410 syn sync fromstart 411else 412 " fromstart above seems to set minlines even if perl_fold is not set. 413 syn sync minlines=0 414endif 415 416 417if version >= 508 || !exists("did_perl_syn_inits") 418 if version < 508 419 let did_perl_syn_inits = 1 420 command -nargs=+ HiLink hi link <args> 421 else 422 command -nargs=+ HiLink hi def link <args> 423 endif 424 425 " The default highlighting. 426 HiLink perlSharpBang PreProc 427 HiLink perlControl PreProc 428 HiLink perlInclude Include 429 HiLink perlSpecial Special 430 HiLink perlString String 431 HiLink perlCharacter Character 432 HiLink perlNumber Number 433 HiLink perlFloat Float 434 HiLink perlType Type 435 HiLink perlIdentifier Identifier 436 HiLink perlLabel Label 437 HiLink perlStatement Statement 438 HiLink perlConditional Conditional 439 HiLink perlRepeat Repeat 440 HiLink perlOperator Operator 441 HiLink perlFunction Function 442 HiLink perlFunctionPrototype perlFunction 443 HiLink perlComment Comment 444 HiLink perlTodo Todo 445 if exists("perl_string_as_statement") 446 HiLink perlStringStartEnd perlStatement 447 else 448 HiLink perlStringStartEnd perlString 449 endif 450 HiLink perlList perlStatement 451 HiLink perlMisc perlStatement 452 HiLink perlVarPlain perlIdentifier 453 HiLink perlVarPlain2 perlIdentifier 454 HiLink perlFiledescRead perlIdentifier 455 HiLink perlFiledescStatement perlIdentifier 456 HiLink perlVarSimpleMember perlIdentifier 457 HiLink perlVarSimpleMemberName perlString 458 HiLink perlVarNotInMatches perlIdentifier 459 HiLink perlVarSlash perlIdentifier 460 HiLink perlQQ perlString 461 if version >= 600 462 HiLink perlHereDoc perlString 463 else 464 HiLink perlHereIdentifier perlStringStartEnd 465 HiLink perlUntilEOFDQ perlString 466 HiLink perlUntilEOFSQ perlString 467 HiLink perlUntilEmptyDQ perlString 468 HiLink perlUntilEmptySQ perlString 469 HiLink perlUntilEOF perlString 470 endif 471 HiLink perlStringUnexpanded perlString 472 HiLink perlSubstitutionSQ perlString 473 HiLink perlSubstitutionDQ perlString 474 HiLink perlSubstitutionSlash perlString 475 HiLink perlSubstitutionHash perlString 476 HiLink perlSubstitutionBracket perlString 477 HiLink perlSubstitutionCurly perlString 478 HiLink perlSubstitutionPling perlString 479 HiLink perlTranslationSlash perlString 480 HiLink perlTranslationHash perlString 481 HiLink perlTranslationBracket perlString 482 HiLink perlTranslationCurly perlString 483 HiLink perlMatch perlString 484 HiLink perlMatchStartEnd perlStatement 485 HiLink perlFormatName perlIdentifier 486 HiLink perlFormatField perlString 487 HiLink perlPackageDecl perlType 488 HiLink perlStorageClass perlType 489 HiLink perlPackageRef perlType 490 HiLink perlStatementPackage perlStatement 491 HiLink perlStatementSub perlStatement 492 HiLink perlStatementStorage perlStatement 493 HiLink perlStatementControl perlStatement 494 HiLink perlStatementScalar perlStatement 495 HiLink perlStatementRegexp perlStatement 496 HiLink perlStatementNumeric perlStatement 497 HiLink perlStatementList perlStatement 498 HiLink perlStatementHash perlStatement 499 HiLink perlStatementIOfunc perlStatement 500 HiLink perlStatementFiledesc perlStatement 501 HiLink perlStatementVector perlStatement 502 HiLink perlStatementFiles perlStatement 503 HiLink perlStatementFlow perlStatement 504 HiLink perlStatementScope perlStatement 505 HiLink perlStatementInclude perlStatement 506 HiLink perlStatementProc perlStatement 507 HiLink perlStatementSocket perlStatement 508 HiLink perlStatementIPC perlStatement 509 HiLink perlStatementNetwork perlStatement 510 HiLink perlStatementPword perlStatement 511 HiLink perlStatementTime perlStatement 512 HiLink perlStatementMisc perlStatement 513 HiLink perlStatementNew perlStatement 514 HiLink perlFunctionName perlIdentifier 515 HiLink perlMethod perlIdentifier 516 HiLink perlFunctionPRef perlType 517 HiLink perlPOD perlComment 518 HiLink perlShellCommand perlString 519 HiLink perlSpecialAscii perlSpecial 520 HiLink perlSpecialDollar perlSpecial 521 HiLink perlSpecialString perlSpecial 522 HiLink perlSpecialStringU perlSpecial 523 HiLink perlSpecialMatch perlSpecial 524 HiLink perlSpecialBEOM perlSpecial 525 HiLink perlDATA perlComment 526 527 HiLink perlBrackets Error 528 529 " Possible errors 530 HiLink perlNotEmptyLine Error 531 HiLink perlElseIfError Error 532 533 delcommand HiLink 534endif 535 536" Syncing to speed up processing 537" 538if !exists("perl_no_sync_on_sub") 539 syn sync match perlSync grouphere NONE "^\s*\<package\s" 540 syn sync match perlSync grouphere perlFunction "^\s*\<sub\s" 541 syn sync match perlSync grouphere NONE "^}" 542endif 543 544if !exists("perl_no_sync_on_global_var") 545 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{" 546 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*(" 547endif 548 549if exists("perl_sync_dist") 550 execute "syn sync maxlines=" . perl_sync_dist 551else 552 syn sync maxlines=100 553endif 554 555syn sync match perlSyncPOD grouphere perlPOD "^=pod" 556syn sync match perlSyncPOD grouphere perlPOD "^=head" 557syn sync match perlSyncPOD grouphere perlPOD "^=item" 558syn sync match perlSyncPOD grouphere NONE "^=cut" 559 560let b:current_syntax = "perl" 561 562" vim: ts=8 563