diff options
Diffstat (limited to 'runtime/syntax/perl.vim')
-rw-r--r-- | runtime/syntax/perl.vim | 556 |
1 files changed, 556 insertions, 0 deletions
diff --git a/runtime/syntax/perl.vim b/runtime/syntax/perl.vim new file mode 100644 index 000000000..438872918 --- /dev/null +++ b/runtime/syntax/perl.vim @@ -0,0 +1,556 @@ +" Vim syntax file +" Language: Perl +" Maintainer: Nick Hibma <n_hibma@van-laarhoven.org> +" Last Change: 2004 May 16 +" Location: http://www.van-laarhoven.org/vim/syntax/perl.vim +" +" Please download most recent version first before mailing +" any comments. +" See also the file perl.vim.regression.pl to check whether your +" modifications work in the most odd cases +" http://www.van-laarhoven.org/vim/syntax/perl.vim.regression.pl +" +" Original version: Sonia Heimann <niania@netsurf.org> +" Thanks to many people for their contribution. + +" The following parameters are available for tuning the +" perl syntax highlighting, with defaults given: +" +" unlet perl_include_pod +" unlet perl_want_scope_in_variables +" unlet perl_extended_vars +" unlet perl_string_as_statement +" unlet perl_no_sync_on_sub +" unlet perl_no_sync_on_global_var +" let perl_sync_dist = 100 +" unlet perl_fold +" unlet perl_fold_blocks + +" Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file +" was already loaded (6.x). +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" Unset perl_fold if it set but vim doesn't support it. +if version < 600 && exists("perl_fold") + unlet perl_fold +endif + + +" POD starts with ^=<word> and ends with ^=cut + +if exists("perl_include_pod") + " Include a while extra syntax file + syn include @Pod syntax/pod.vim + unlet b:current_syntax + if exists("perl_fold") + syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend fold + syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold + else + syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend + syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend + endif +else + " Use only the bare minimum of rules + if exists("perl_fold") + syn region perlPOD start="^=[a-z]" end="^=cut" fold + else + syn region perlPOD start="^=[a-z]" end="^=cut" + endif +endif + + +" All keywords +" +if exists("perl_fold") && exists("perl_fold_blocks") + syn match perlConditional "\<if\>" + syn match perlConditional "\<elsif\>" + syn match perlConditional "\<unless\>" + syn match perlConditional "\<else\>" nextgroup=perlElseIfError skipwhite skipnl skipempty +else + syn keyword perlConditional if elsif unless + syn keyword perlConditional else nextgroup=perlElseIfError skipwhite skipnl skipempty +endif +syn keyword perlConditional switch eq ne gt lt ge le cmp not and or xor err +if exists("perl_fold") && exists("perl_fold_blocks") + syn match perlRepeat "\<while\>" + syn match perlRepeat "\<for\>" + syn match perlRepeat "\<foreach\>" + syn match perlRepeat "\<do\>" + syn match perlRepeat "\<until\>" + syn match perlRepeat "\<continue\>" +else + syn keyword perlRepeat while for foreach do until continue +endif +syn keyword perlOperator defined undef and or not bless ref +if exists("perl_fold") + " if BEGIN/END is a keyword the perlBEGINENDFold does not work + syn match perlControl "\<BEGIN\>" contained + syn match perlControl "\<END\>" contained +else + syn keyword perlControl BEGIN END +endif + +syn keyword perlStatementStorage my local our +syn keyword perlStatementControl goto return last next redo +syn keyword perlStatementScalar chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst +syn keyword perlStatementRegexp pos quotemeta split study +syn keyword perlStatementNumeric abs atan2 cos exp hex int log oct rand sin sqrt srand +syn keyword perlStatementList splice unshift shift push pop split join reverse grep map sort unpack +syn keyword perlStatementHash each exists keys values tie tied untie +syn keyword perlStatementIOfunc carp confess croak dbmclose dbmopen die syscall +syn keyword perlStatementFiledesc binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite +syn keyword perlStatementFiledesc fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite +syn keyword perlStatementVector pack vec +syn keyword perlStatementFiles chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime +syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>" +syn keyword perlStatementFlow caller die dump eval exit wantarray +syn keyword perlStatementInclude require +syn match perlStatementInclude "\(use\|no\)\s\+\(integer\>\|strict\>\|lib\>\|sigtrap\>\|subs\>\|vars\>\|warnings\>\|utf8\>\|byte\>\)\=" +syn keyword perlStatementScope import +syn keyword perlStatementProc alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid +syn keyword perlStatementSocket accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair +syn keyword perlStatementIPC msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite +syn keyword perlStatementNetwork endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent +syn keyword perlStatementPword getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent +syn keyword perlStatementTime gmtime localtime time times + +syn keyword perlStatementMisc warn formline reset scalar delete prototype lock +syn keyword perlStatementNew new + +syn keyword perlTodo TODO TBD FIXME XXX contained + +" Perl Identifiers. +" +" Should be cleaned up to better handle identifiers in particular situations +" (in hash keys for example) +" +" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc. +" We do not process complex things such as @{${"foo"}}. Too complicated, and +" too slow. And what is after the -> is *not* considered as part of the +" variable - there again, too complicated and too slow. + +" Special variables first ($^A, ...) and ($|, $', ...) +syn match perlVarPlain "$^[ADEFHILMOPSTWX]\=" +syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@$<>(-]" +syn match perlVarPlain "$\(0\|[1-9][0-9]*\)" +" Same as above, but avoids confusion in $::foo (equivalent to $main::foo) +syn match perlVarPlain "$:[^:]" +" These variables are not recognized within matches. +syn match perlVarNotInMatches "$[|)]" +" This variable is not recognized within matches delimited by m//. +syn match perlVarSlash "$/" + +" And plain identifiers +syn match perlPackageRef "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained + +" To highlight packages in variables as a scope reference - i.e. in $pack::var, +" pack:: is a scope, just set "perl_want_scope_in_variables" +" If you *want* complex things like @{${"foo"}} to be processed, +" just set the variable "perl_extended_vars"... + +" FIXME value between {} should be marked as string. is treated as such by Perl. +" At the moment it is marked as something greyish instead of read. Probably todo +" with transparency. Or maybe we should handle the bare word in that case. or make it into + +if exists("perl_want_scope_in_variables") + syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod + syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember +else + syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod + syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember +endif + +if exists("perl_extended_vars") + syn cluster perlExpr contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ + syn region perlVarBlock matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember + syn region perlVarBlock matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr + syn match perlVarPlain "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember + syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember + syn match perlVarSimpleMember "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained + syn match perlVarSimpleMemberName "\I\i*" contained + syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember + syn match perlMethod "\(->\)\I\i*" contained +endif + +" File Descriptors +syn match perlFiledescRead "[<]\h\w\+[>]" + +syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement +syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement + +syn match perlFiledescStatement "\u\w*" contained + +" Special characters in strings and matches +syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained +syn match perlSpecialStringU "\\['\\]" contained +syn match perlSpecialMatch "{\d\(,\d\)\=}" contained +syn match perlSpecialMatch "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained +syn match perlSpecialMatch "[+*()?.]" contained +syn match perlSpecialMatch "(?[#:=!]" contained +syn match perlSpecialMatch "(?[imsx]\+)" contained +" FIXME the line below does not work. It should mark end of line and +" begin of line as perlSpecial. +" syn match perlSpecialBEOM "^\^\|\$$" contained + +" Possible errors +" +" Highlight lines with only whitespace (only in blank delimited here documents) as errors +syn match perlNotEmptyLine "^\s\+$" contained +" Highlight '} else if (...) {', it should be '} else { if (...) { ' or +" '} elsif (...) {'. +"syn keyword perlElseIfError if contained + +" Variable interpolation +" +" These items are interpolated inside "" strings and similar constructs. +syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock +" These items are interpolated inside '' strings and similar constructs. +syn cluster perlInterpSQ contains=perlSpecialStringU +" These items are interpolated inside m// matches and s/// substitutions. +syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM +" These items are interpolated inside m## matches and s### substitutions. +syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash + +" Shell commands +syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ + +" Constants +" +" Numbers +syn match perlNumber "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)" +syn match perlFloat "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+" +syn match perlFloat "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\=" +syn match perlFloat "[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\=" + + +" Simple version of searches and matches +" caters for m//, m##, m{} and m[] (and the !/ variant) +syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash +syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch +syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch +syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch + +" A special case for m!!x which allows for comments and extra whitespace in the pattern +syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment + +" Below some hacks to recognise the // variant. This is virtually impossible to catch in all +" cases as the / is used in so many other ways, but these should be the most obvious ones. +"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 +syn 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 + + +" Substitutions +" caters for s///, s### and s[][] +" perlMatch is the first part, perlSubstitution* is the substitution part +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl +syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ +syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ +syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ +syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ +syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ +syn region perlSubstitutionCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ + +" A special case for m!!x which allows for comments and extra whitespace in the pattern +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling +syn region perlSubstitutionPling matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ + +" Substitutions +" caters for tr///, tr### and tr[][] +" perlMatch is the first part, perlTranslation* is the second, translator part. +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl +syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl +syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained +syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained +syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained +syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained +syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained +syn region perlTranslationCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained + + +" The => operator forces a bareword to the left of it to be interpreted as +" a string +syn match perlString "\<\I\i*\s*=>"me=e-2 + +" Strings and q, qq, qw and qr expressions + +" Brackets in qq() +syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ + +syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ +syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlBrackets +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr#+ end=+#[imosx]*+ contains=@perlInterpMatch +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr|+ end=+|[imosx]*+ contains=@perlInterpMatch +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr(+ end=+)[imosx]*+ contains=@perlInterpMatch +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr{+ end=+}[imosx]*+ contains=@perlInterpMatch +syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash + +" Constructs such as print <<EOF [...] EOF, 'here' documents +" +if version >= 600 + " XXX Any statements after the identifier are in perlString colour (i.e. + " 'if $a' in 'print <<EOF if $a'). + if exists("perl_fold") + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ fold + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold + syn region perlAutoload matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold + else + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine + syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine + syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL + endif +else + syn match perlUntilEOFStart "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent + syn match perlUntilEOFStart "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent + syn match perlUntilEOFStart "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent + syn match perlUntilEOFStart "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent + syn match perlUntilEOFStart "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent + syn region perlUntilEOFDQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained + syn region perlUntilEOFSQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained + syn region perlUntilEmptySQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained + syn region perlUntilEmptyDQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained + syn match perlHereIdentifier "<<EOF" + syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL +endif + + +" Class declarations +" +syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage +syn keyword perlStatementPackage package contained + +" Functions +" sub [name] [(prototype)] { +" +syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment +syn keyword perlStatementSub sub contained + +syn match perlFunctionPrototype "([^)]*)" contained +if exists("perl_want_scope_in_variables") + syn match perlFunctionPRef "\h\w*::" contained + syn match perlFunctionName "\h\w*[^:]" contained +else + syn match perlFunctionName "\h[[:alnum:]_:]*" contained +endif + + +" All other # are comments, except ^#! +syn match perlComment "#.*" contains=perlTodo +syn match perlSharpBang "^#!.*" + +" Formats +syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain +syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained +syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained +syn match perlFormatField "[@^]#[#.]*" contained +syn match perlFormatField "@\*" contained +syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained +syn match perlFormatField "@$" contained + +" __END__ and __DATA__ clauses +if exists("perl_fold") + syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold +else + syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA +endif + + +" +" Folding + +if exists("perl_fold") + syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="\n\+package"me=s-1 transparent fold keepend + syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend + syn region perlBEGINENDFold start="^\z(\s*\)\<\(BEGIN\|END\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend + + if exists("perl_fold_blocks") + 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 + syn region perlIfFold start="^\z(\s*\)do\s*{\s*$" end="^\z1}\s*while" end="^\z1}\s*;\=$" transparent fold keepend + endif + + setlocal foldmethod=syntax + syn sync fromstart +else + " fromstart above seems to set minlines even if perl_fold is not set. + syn sync minlines=0 +endif + + +if version >= 508 || !exists("did_perl_syn_inits") + if version < 508 + let did_perl_syn_inits = 1 + command -nargs=+ HiLink hi link <args> + else + command -nargs=+ HiLink hi def link <args> + endif + + " The default highlighting. + HiLink perlSharpBang PreProc + HiLink perlControl PreProc + HiLink perlInclude Include + HiLink perlSpecial Special + HiLink perlString String + HiLink perlCharacter Character + HiLink perlNumber Number + HiLink perlFloat Float + HiLink perlType Type + HiLink perlIdentifier Identifier + HiLink perlLabel Label + HiLink perlStatement Statement + HiLink perlConditional Conditional + HiLink perlRepeat Repeat + HiLink perlOperator Operator + HiLink perlFunction Function + HiLink perlFunctionPrototype perlFunction + HiLink perlComment Comment + HiLink perlTodo Todo + if exists("perl_string_as_statement") + HiLink perlStringStartEnd perlStatement + else + HiLink perlStringStartEnd perlString + endif + HiLink perlList perlStatement + HiLink perlMisc perlStatement + HiLink perlVarPlain perlIdentifier + HiLink perlFiledescRead perlIdentifier + HiLink perlFiledescStatement perlIdentifier + HiLink perlVarSimpleMember perlIdentifier + HiLink perlVarSimpleMemberName perlString + HiLink perlVarNotInMatches perlIdentifier + HiLink perlVarSlash perlIdentifier + HiLink perlQQ perlString + if version >= 600 + HiLink perlHereDoc perlString + else + HiLink perlHereIdentifier perlStringStartEnd + HiLink perlUntilEOFDQ perlString + HiLink perlUntilEOFSQ perlString + HiLink perlUntilEmptyDQ perlString + HiLink perlUntilEmptySQ perlString + HiLink perlUntilEOF perlString + endif + HiLink perlStringUnexpanded perlString + HiLink perlSubstitutionSQ perlString + HiLink perlSubstitutionDQ perlString + HiLink perlSubstitutionSlash perlString + HiLink perlSubstitutionHash perlString + HiLink perlSubstitutionBracket perlString + HiLink perlSubstitutionCurly perlString + HiLink perlSubstitutionPling perlString + HiLink perlTranslationSlash perlString + HiLink perlTranslationHash perlString + HiLink perlTranslationBracket perlString + HiLink perlTranslationCurly perlString + HiLink perlMatch perlString + HiLink perlMatchStartEnd perlStatement + HiLink perlFormatName perlIdentifier + HiLink perlFormatField perlString + HiLink perlPackageDecl perlType + HiLink perlStorageClass perlType + HiLink perlPackageRef perlType + HiLink perlStatementPackage perlStatement + HiLink perlStatementSub perlStatement + HiLink perlStatementStorage perlStatement + HiLink perlStatementControl perlStatement + HiLink perlStatementScalar perlStatement + HiLink perlStatementRegexp perlStatement + HiLink perlStatementNumeric perlStatement + HiLink perlStatementList perlStatement + HiLink perlStatementHash perlStatement + HiLink perlStatementIOfunc perlStatement + HiLink perlStatementFiledesc perlStatement + HiLink perlStatementVector perlStatement + HiLink perlStatementFiles perlStatement + HiLink perlStatementFlow perlStatement + HiLink perlStatementScope perlStatement + HiLink perlStatementInclude perlStatement + HiLink perlStatementProc perlStatement + HiLink perlStatementSocket perlStatement + HiLink perlStatementIPC perlStatement + HiLink perlStatementNetwork perlStatement + HiLink perlStatementPword perlStatement + HiLink perlStatementTime perlStatement + HiLink perlStatementMisc perlStatement + HiLink perlStatementNew perlStatement + HiLink perlFunctionName perlIdentifier + HiLink perlMethod perlIdentifier + HiLink perlFunctionPRef perlType + HiLink perlPOD perlComment + HiLink perlShellCommand perlString + HiLink perlSpecialAscii perlSpecial + HiLink perlSpecialDollar perlSpecial + HiLink perlSpecialString perlSpecial + HiLink perlSpecialStringU perlSpecial + HiLink perlSpecialMatch perlSpecial + HiLink perlSpecialBEOM perlSpecial + HiLink perlDATA perlComment + + HiLink perlBrackets Error + + " Possible errors + HiLink perlNotEmptyLine Error + HiLink perlElseIfError Error + + delcommand HiLink +endif + +" Syncing to speed up processing +" +if !exists("perl_no_sync_on_sub") + syn sync match perlSync grouphere NONE "^\s*\<package\s" + syn sync match perlSync grouphere perlFunction "^\s*\<sub\s" + syn sync match perlSync grouphere NONE "^}" +endif + +if !exists("perl_no_sync_on_global_var") + syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{" + syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*(" +endif + +if exists("perl_sync_dist") + execute "syn sync maxlines=" . perl_sync_dist +else + syn sync maxlines=100 +endif + +syn sync match perlSyncPOD grouphere perlPOD "^=pod" +syn sync match perlSyncPOD grouphere perlPOD "^=head" +syn sync match perlSyncPOD grouphere perlPOD "^=item" +syn sync match perlSyncPOD grouphere NONE "^=cut" + +let b:current_syntax = "perl" + +" vim: ts=8 |