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