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