home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unix / vim-6.2.tar.bz2 / vim-6.2.tar / vim62 / runtime / syntax / perl.vim < prev    next >
Encoding:
Text File  |  2003-05-04  |  27.9 KB  |  550 lines

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