perl.vim 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. " Vim syntax file
  2. " Language: Perl
  3. " Maintainer: vim-perl <vim-perl@googlegroups.com>
  4. " Homepage: https://github.com/vim-perl/vim-perl
  5. " Bugs/requests: https://github.com/vim-perl/vim-perl/issues
  6. " License: Vim License (see :help license)
  7. " Last Change: 2022 Jun 13
  8. " Contributors: Andy Lester <andy@petdance.com>
  9. " Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
  10. " Lukas Mai <l.mai.web.de>
  11. " Nick Hibma <nick@van-laarhoven.org>
  12. " Sonia Heimann <niania@netsurf.org>
  13. " Rob Hoelz <rob@hoelz.ro>
  14. " Doug Kearns <dougkearns@gmail.com>
  15. " and many others.
  16. "
  17. " Please download the most recent version first, before mailing
  18. " any comments.
  19. "
  20. " The following parameters are available for tuning the
  21. " perl syntax highlighting, with defaults given:
  22. "
  23. " let perl_include_pod = 1
  24. " unlet perl_no_scope_in_variables
  25. " unlet perl_no_extended_vars
  26. " unlet perl_string_as_statement
  27. " unlet perl_no_sync_on_sub
  28. " unlet perl_no_sync_on_global_var
  29. " let perl_sync_dist = 100
  30. " unlet perl_fold
  31. " unlet perl_fold_blocks
  32. " unlet perl_nofold_packages
  33. " unlet perl_nofold_subs
  34. " unlet perl_fold_anonymous_subs
  35. " unlet perl_no_subprototype_error
  36. if exists("b:current_syntax")
  37. finish
  38. endif
  39. let s:cpo_save = &cpo
  40. set cpo&vim
  41. " POD starts with ^=<word> and ends with ^=cut
  42. if get(g:, 'perl_include_pod', 1)
  43. " Include a while extra syntax file
  44. syn include @Pod syntax/pod.vim
  45. unlet b:current_syntax
  46. if get(g:, 'perl_fold', 1)
  47. syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend
  48. syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend
  49. else
  50. syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
  51. syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
  52. endif
  53. else
  54. " Use only the bare minimum of rules
  55. if get(g:, 'perl_fold', 1)
  56. syn region perlPOD start="^=[a-z]" end="^=cut" fold
  57. else
  58. syn region perlPOD start="^=[a-z]" end="^=cut"
  59. endif
  60. endif
  61. syn cluster perlTop contains=TOP
  62. syn region perlBraces start="{" end="}" transparent extend
  63. " All keywords
  64. "
  65. syn match perlConditional "\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
  66. syn match perlConditional "\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
  67. syn match perlRepeat "\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
  68. syn match perlOperator "\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"
  69. " for some reason, adding this as the nextgroup for perlControl fixes BEGIN
  70. " folding issues...
  71. syn match perlFakeGroup "" contained
  72. syn match perlControl "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
  73. syn match perlStatementStorage "\<\%(my\|our\|local\|state\)\>"
  74. syn match perlStatementControl "\<\%(return\|last\|next\|redo\|goto\|break\)\>"
  75. syn match perlStatementScalar "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
  76. syn match perlStatementRegexp "\<\%(pos\|quotemeta\|split\|study\)\>"
  77. syn match perlStatementNumeric "\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
  78. syn match perlStatementList "\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
  79. syn match perlStatementHash "\<\%(delete\|each\|exists\|keys\|values\)\>"
  80. syn match perlStatementIOfunc "\<\%(syscall\|dbmopen\|dbmclose\)\>"
  81. syn match perlStatementFiledesc "\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
  82. syn match perlStatementFiledesc "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
  83. syn match perlStatementVector "\<vec\>"
  84. syn match perlStatementFiles "\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
  85. syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
  86. syn match perlStatementFlow "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
  87. syn match perlStatementInclude "\<\%(require\|import\|unimport\)\>"
  88. syn match perlStatementInclude "\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\%(::\%(exception\%(::system\)\=\|hints\|skip\)\)\=\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|deprecate\|diagnostics\|encoding\%(::warnings\)\=\|experimental\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|ok\|open\|ops\|overload\|overloading\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="
  89. syn match perlStatementProc "\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
  90. syn match perlStatementSocket "\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
  91. syn match perlStatementIPC "\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
  92. syn match perlStatementNetwork "\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
  93. syn match perlStatementPword "\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
  94. syn match perlStatementTime "\<\%(gmtime\|localtime\|time\)\>"
  95. syn match perlStatementMisc "\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
  96. syn keyword perlTodo TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
  97. syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
  98. syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
  99. " Perl Identifiers.
  100. "
  101. " Should be cleaned up to better handle identifiers in particular situations
  102. " (in hash keys for example)
  103. "
  104. " Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
  105. " We do not process complex things such as @{${"foo"}}. Too complicated, and
  106. " too slow. And what is after the -> is *not* considered as part of the
  107. " variable - there again, too complicated and too slow.
  108. " Special variables first ($^A, ...) and ($|, $', ...)
  109. syn match perlVarPlain "$^[ACDEFHILMNOPRSTVWX]\="
  110. syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
  111. syn match perlVarPlain "@[-+]"
  112. syn match perlVarPlain "$\%(0\|[1-9]\d*\)"
  113. " Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
  114. syn match perlVarPlain "$::\@!"
  115. " These variables are not recognized within matches.
  116. syn match perlVarNotInMatches "$[|)]"
  117. " This variable is not recognized within matches delimited by m//.
  118. syn match perlVarSlash "$/"
  119. " And plain identifiers
  120. syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
  121. " To not highlight packages in variables as a scope reference - i.e. in
  122. " $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"
  123. " If you don't want complex things like @{${"foo"}} to be processed,
  124. " just set the variable "perl_no_extended_vars"...
  125. if !get(g:, 'perl_no_scope_in_variables', 0)
  126. syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  127. syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  128. syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  129. else
  130. syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  131. syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  132. syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
  133. endif
  134. syn match perlVarPlain2 "%[-+]"
  135. if !get(g:, 'perl_no_extended_vars', 0)
  136. syn cluster perlExpr contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQ,perlQQ,perlQW,perlQR,perlArrow,perlBraces
  137. syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
  138. syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
  139. syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
  140. syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
  141. syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  142. syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  143. syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  144. syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  145. syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  146. syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contains=perlVarSimpleMemberName contained extend
  147. syn match perlVarSimpleMemberName "\I\i*" contained
  148. syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
  149. syn match perlPackageConst "__PACKAGE__" nextgroup=perlPostDeref
  150. syn match perlPostDeref "->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
  151. syn region perlPostDeref start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
  152. syn region perlPostDeref matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" keepend extend contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
  153. endif
  154. " File Descriptors
  155. syn match perlFiledescRead "<\h\w*>"
  156. syn match perlFiledescStatementComma "(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
  157. syn match perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
  158. syn match perlFiledescStatement "\<\u\w*\>" contained
  159. " Special characters in strings and matches
  160. syn match perlSpecialString "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
  161. syn match perlSpecialStringU2 "\\." extend contained contains=NONE
  162. syn match perlSpecialStringU "\\\\" contained
  163. syn match perlSpecialMatch "\\[1-9]" contained extend
  164. syn match perlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
  165. syn match perlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained
  166. syn match perlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
  167. syn match perlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
  168. syn match perlSpecialMatch "[+*()?.]" contained
  169. syn match perlSpecialMatch "(?[#:=!]" contained
  170. syn match perlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained
  171. syn match perlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained
  172. syn match perlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained
  173. syn match perlSpecialMatch "(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained
  174. " Possible errors
  175. "
  176. " Highlight lines with only whitespace (only in blank delimited here documents) as errors
  177. syn match perlNotEmptyLine "^\s\+$" contained
  178. " Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
  179. syn match perlElseIfError "else\_s*if" containedin=perlConditional
  180. syn keyword perlElseIfError elseif containedin=perlConditional
  181. " Variable interpolation
  182. "
  183. " These items are interpolated inside "" strings and similar constructs.
  184. syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
  185. " These items are interpolated inside '' strings and similar constructs.
  186. syn cluster perlInterpSQ contains=perlSpecialStringU,perlSpecialStringU2
  187. " These items are interpolated inside m// matches and s/// substitutions.
  188. syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
  189. " These items are interpolated inside m## matches and s### substitutions.
  190. syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash
  191. " Shell commands
  192. syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
  193. " Constants
  194. "
  195. " Numbers
  196. syn case ignore
  197. syn match perlNumber "\<\%(0\|[1-9]\%(_\=\d\)*\)\>"
  198. syn match perlNumber "\<0\%(x\x\%(_\=\x\)*\|b[01]\%(_\=[01]\)*\|o\=\%(_\=\o\)*\)\>"
  199. syn match perlFloat "\<\d\%(_\=\d\)*e[-+]\=\d\%(_\=\d\)*"
  200. syn match perlFloat "\<\d\%(_\=\d\)*\.\%(\d\%(_\=\d\)*\)\=\%(e[-+]\=\d\%(_\=\d\)*\)\="
  201. syn match perlFloat "\.\d\%(_\=\d\)*\%(e[-+]\=\d\%(_\=\d\)*\)\="
  202. syn match perlFloat "\<0x\x\%(_\=\x\)*p[-+]\=\d\%(_\=\d\)*"
  203. syn match perlFloat "\<0x\x\%(_\=\x\)*\.\%(\x\%(_\=\x\)*\)\=\%(p[-+]\=\d\%(_\=\d\)*\)\="
  204. syn match perlFloat "\<0x\.\x\%(_\=\x\)*\%(p[-+]\=\d\%(_\=\d\)*\)\="
  205. syn case match
  206. syn match perlString "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
  207. syn match perlVStringV "\<v" contained
  208. syn region perlParensSQ start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
  209. syn region perlBracketsSQ start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
  210. syn region perlBracesSQ start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
  211. syn region perlAnglesSQ start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
  212. syn region perlParensDQ start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
  213. syn region perlBracketsDQ start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
  214. syn region perlBracesDQ start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
  215. syn region perlAnglesDQ start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
  216. " Simple version of searches and matches
  217. syn match perlMatchModifiers "[msixpadluncgo]\+" contained
  218. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
  219. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
  220. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlMatchModifiers
  221. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlMatchModifiers
  222. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlMatchModifiers
  223. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ extend nextgroup=perlMatchModifiers
  224. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ keepend extend nextgroup=perlMatchModifiers
  225. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ keepend extend nextgroup=perlMatchModifiers
  226. " Below some hacks to recognise the // variant. This is virtually impossible to catch in all
  227. " cases as the / is used in so many other ways, but these should be the most obvious ones.
  228. syn region perlMatch matchgroup=perlMatchStartEnd start="\%([$@%&*]\@<!\%(\<split\|\<while\|\<if\|\<unless\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=/\%(/=\)\@!" start=+^/\%(/=\)\@!+ start=+\s\@<=/\%(/=\)\@![^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!+ skip=+\\/+ end=+/+ contains=@perlInterpSlash extend nextgroup=perlMatchModifiers
  229. " Substitutions
  230. " perlMatch is the first part, perlSubstitution* is the substitution part
  231. syn match perlSubstitutionModifiers "[msixpadluncgero]\+" contained
  232. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
  233. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
  234. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
  235. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
  236. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
  237. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
  238. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
  239. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
  240. syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1+ keepend contained contains=@perlInterpDQ extend nextgroup=perlSubstitutionModifiers
  241. syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contained contains=@perlInterpDQ,perlParensDQ keepend extend nextgroup=perlSubstitutionModifiers
  242. syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend nextgroup=perlSubstitutionModifiers
  243. syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend nextgroup=perlSubstitutionModifiers
  244. syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend nextgroup=perlSubstitutionModifiers
  245. syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'+ contained contains=@perlInterpSQ keepend extend nextgroup=perlSubstitutionModifiers
  246. " Translations
  247. " perlMatch is the first part, perlTranslation* is the second, translator part.
  248. syn match perlTranslationModifiers "[cdsr]\+" contained
  249. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
  250. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
  251. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
  252. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
  253. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
  254. syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
  255. syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1+ contained nextgroup=perlTranslationModifiers
  256. syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contains=perlParensSQ contained nextgroup=perlTranslationModifiers
  257. syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contains=perlBracketsSQ contained nextgroup=perlTranslationModifiers
  258. syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contains=perlBracesSQ contained nextgroup=perlTranslationModifiers
  259. syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contains=perlAnglesSQ contained nextgroup=perlTranslationModifiers
  260. " Strings and q, qq, qw and qr expressions
  261. syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
  262. syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ keepend extend
  263. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
  264. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
  265. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
  266. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
  267. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
  268. syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
  269. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
  270. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
  271. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
  272. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
  273. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
  274. syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
  275. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
  276. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+ end=+#+ contains=@perlInterpSQ keepend extend
  277. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
  278. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
  279. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
  280. syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
  281. syn match perlQRModifiers "[msixpadluno]\+" contained
  282. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
  283. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlQRModifiers
  284. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
  285. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlQRModifiers
  286. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlQRModifiers
  287. " A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
  288. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend nextgroup=perlQRModifiers
  289. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend nextgroup=perlQRModifiers
  290. syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend nextgroup=perlQRModifiers
  291. " Constructs such as print <<EOF [...] EOF, 'here' documents
  292. "
  293. " XXX Any statements after the identifier are in perlString colour (i.e.
  294. " 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
  295. " seems due to the 'auto-extending nature' of regions.
  296. " XXX Indented heredocs are not perfect - they sometimes seem to take a moment
  297. " to update if switched from double to single quotes and vice versa.
  298. "
  299. " Note: bare delimiters such as << to mean <<"" are not supported. These are a
  300. " fatal error since 5.28 and, apparently, a rarely used feature.
  301. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\I\i*+ end=+$+ contains=@perlTop oneline
  302. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\\\I\i*+ end=+$+ contains=@perlTop oneline
  303. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*"[^\\"]*\%(\\.[^\\"]*\)*"+ end=+$+ contains=@perlTop oneline
  304. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*'[^\\']*\%(\\.[^\\']*\)*'+ end=+$+ contains=@perlTop oneline
  305. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*`[^\\`]*\%(\\.[^\\`]*\)*`+ end=+$+ contains=@perlTop oneline
  306. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*""+ end=+$+ contains=@perlTop oneline
  307. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*''+ end=+$+ contains=@perlTop oneline
  308. syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*``+ end=+$+ contains=@perlTop oneline
  309. if get(g:, 'perl_fold', 0)
  310. syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
  311. syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
  312. syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
  313. syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
  314. syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
  315. syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
  316. syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
  317. syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
  318. else
  319. syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
  320. syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
  321. syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
  322. syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
  323. syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
  324. syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
  325. syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
  326. syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
  327. endif
  328. if get(g:, 'perl_fold', 0)
  329. syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
  330. syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
  331. syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
  332. syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
  333. syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
  334. syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
  335. syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
  336. syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
  337. else
  338. syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
  339. syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
  340. syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
  341. syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
  342. syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
  343. syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
  344. syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
  345. syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
  346. endif
  347. " Class declarations
  348. "
  349. syn match perlPackageDecl "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
  350. syn keyword perlStatementPackage package contained
  351. " Functions
  352. if get(g:, "perl_sub_signatures", 0)
  353. syn match perlSubSignature "\s*([^)]*)" contained extend
  354. else
  355. syn match perlSubPrototype "\s*([\\$@%&*\[\];]*)" contained extend
  356. endif
  357. syn match perlSubAttribute "\s*:\s*\h\w*\%(([^)]*)\|\)" contained extend
  358. syn match perlSubName "\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\s*" contained extend
  359. syn region perlSubDeclaration start="" end="[;{]" contains=perlSubName,perlSubPrototype,perlSubAttribute,perlSubSignature,perlComment contained transparent
  360. syn match perlFunction "\<sub\>\_s*" nextgroup=perlSubDeclaration
  361. " The => operator forces a bareword to the left of it to be interpreted as
  362. " a string
  363. syn match perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
  364. " All other # are comments, except ^#!
  365. syn match perlComment "#.*" contains=perlTodo,@Spell extend
  366. syn match perlSharpBang "^#!.*"
  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,perlVarPlain2
  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. " __END__ and __DATA__ clauses
  376. " Vim excludes empty syn-region end lines from the fold region. This is
  377. " probably a bug and means a DATA section ending with an empty line does not
  378. " have that final line included in the fold.
  379. "
  380. " As a workaround we exploit an unterminated syntax region here with an end
  381. " pattern that will (probably) never match. This forces all lines to be
  382. " included in the fold region. Of course, if it does match then there's
  383. " nothing to work around as it is a non-empty line.
  384. "
  385. " This problem also exists with empty string delimited heredocs but there's no
  386. " known workaround for that case.
  387. if get(g:, 'perl_fold', 0)
  388. syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
  389. syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
  390. else
  391. syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="\%$" contains=@perlDATA
  392. syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="\%$" contains=@perlDATA
  393. endif
  394. " TODO: generalise this to allow other filetypes
  395. if get(g:, 'perl_highlight_data', 0)
  396. syn cluster perlDATA add=perlPOD
  397. else
  398. syn cluster perlDATA remove=perlPOD
  399. endif
  400. "
  401. " Folding
  402. if get(g:, 'perl_fold', 0)
  403. " Note: this bit must come before the actual highlighting of the "package"
  404. " keyword, otherwise this will screw up Pod lines that match /^package/
  405. if !get(g:, 'perl_nofold_packages', 0)
  406. syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
  407. syn region perlPackageFold start="^\z(\s*\)package\s*\S\+\s*{" end="^\z1}" transparent fold keepend
  408. endif
  409. if !get(g:, 'perl_nofold_subs', 0)
  410. if get(g:, "perl_fold_anonymous_subs", 0)
  411. " EXPLANATION:
  412. " \<sub\> - "sub" keyword
  413. " \_[^;{]* - any characters, including new line, but not ";" or "{", zero or more times
  414. " \%(([\\$@%&*\[\];]*)\)\= - prototype definition, \$@%&*[]; characters between (), zero or 1 times
  415. " \_[^;]* - any characters, including new line, but not ";" or "{", zero or more times
  416. " { - start subroutine block
  417. syn region perlSubFold start="\<sub\>\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;{]*{" end="}" transparent fold keepend extend
  418. else
  419. " EXPLANATION:
  420. " same, as above, but first non-space character after "sub" keyword must
  421. " be [A-Za-z_]
  422. syn region perlSubFold start="\<sub\>\s*\h\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;]*{" end="}" transparent fold keepend extend
  423. endif
  424. syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>\_s*{" end="}" transparent fold keepend
  425. endif
  426. if get(g:, 'perl_fold_blocks', 0)
  427. syn region perlBlockFold start="^\z(\s*\)\%(if\|elsif\|unless\|for\|while\|until\|given\)\s*(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" start="^\z(\s*\)for\%(each\)\=\s*\%(\%(my\|our\)\=\s*\S\+\s*\)\=(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
  428. " TODO this is works incorrectly
  429. syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
  430. else
  431. if get(g:, 'perl_fold_do_blocks', 0)
  432. syn region perlDoBlockDeclaration start="" end="{" contains=perlComment contained transparent
  433. syn match perlOperator "\<do\>\_s*" nextgroup=perlDoBlockDeclaration
  434. syn region perlDoBlockFold start="\<do\>\_[^{]*{" end="}" transparent fold keepend extend
  435. endif
  436. endif
  437. syn sync fromstart
  438. else
  439. " fromstart above seems to set minlines even if perl_fold is not set.
  440. syn sync minlines=0
  441. endif
  442. " NOTE: If you're linking new highlight groups to perlString, please also put
  443. " them into b:match_skip in ftplugin/perl.vim.
  444. " The default highlighting.
  445. hi def link perlSharpBang PreProc
  446. hi def link perlControl PreProc
  447. hi def link perlInclude Include
  448. hi def link perlSpecial Special
  449. hi def link perlString String
  450. hi def link perlCharacter Character
  451. hi def link perlNumber Number
  452. hi def link perlFloat Float
  453. hi def link perlType Type
  454. hi def link perlIdentifier Identifier
  455. hi def link perlLabel Label
  456. hi def link perlStatement Statement
  457. hi def link perlConditional Conditional
  458. hi def link perlRepeat Repeat
  459. hi def link perlOperator Operator
  460. hi def link perlFunction Keyword
  461. hi def link perlSubName Function
  462. hi def link perlSubPrototype Type
  463. hi def link perlSubSignature Type
  464. hi def link perlSubAttribute PreProc
  465. hi def link perlComment Comment
  466. hi def link perlTodo Todo
  467. if get(g:, 'perl_string_as_statement', 0)
  468. hi def link perlStringStartEnd perlStatement
  469. else
  470. hi def link perlStringStartEnd perlString
  471. endif
  472. hi def link perlVStringV perlStringStartEnd
  473. hi def link perlList perlStatement
  474. hi def link perlMisc perlStatement
  475. hi def link perlVarPlain perlIdentifier
  476. hi def link perlVarPlain2 perlIdentifier
  477. hi def link perlArrow perlIdentifier
  478. hi def link perlFiledescRead perlIdentifier
  479. hi def link perlFiledescStatement perlIdentifier
  480. hi def link perlVarSimpleMember perlIdentifier
  481. hi def link perlVarSimpleMemberName perlString
  482. hi def link perlVarNotInMatches perlIdentifier
  483. hi def link perlVarSlash perlIdentifier
  484. hi def link perlQ perlString
  485. hi def link perlQQ perlString
  486. hi def link perlQW perlString
  487. hi def link perlQR perlString
  488. hi def link perlMatchModifiers perlMatchStartEnd
  489. hi def link perlSubstitutionModifiers perlMatchStartEnd
  490. hi def link perlTranslationModifiers perlMatchStartEnd
  491. hi def link perlQRModifiers perlStringStartEnd
  492. hi def link perlHereDoc perlString
  493. hi def link perlIndentedHereDoc perlString
  494. hi def link perlStringUnexpanded perlString
  495. hi def link perlSubstitutionSQ perlString
  496. hi def link perlSubstitutionGQQ perlString
  497. hi def link perlTranslationGQ perlString
  498. hi def link perlMatch perlString
  499. hi def link perlMatchStartEnd perlStatement
  500. hi def link perlFormatName perlIdentifier
  501. hi def link perlFormatField perlString
  502. hi def link perlPackageDecl perlType
  503. hi def link perlStorageClass perlType
  504. hi def link perlPackageRef perlType
  505. hi def link perlStatementPackage perlStatement
  506. hi def link perlStatementStorage perlStatement
  507. hi def link perlStatementControl perlStatement
  508. hi def link perlStatementScalar perlStatement
  509. hi def link perlStatementRegexp perlStatement
  510. hi def link perlStatementNumeric perlStatement
  511. hi def link perlStatementList perlStatement
  512. hi def link perlStatementHash perlStatement
  513. hi def link perlStatementIOfunc perlStatement
  514. hi def link perlStatementFiledesc perlStatement
  515. hi def link perlStatementVector perlStatement
  516. hi def link perlStatementFiles perlStatement
  517. hi def link perlStatementFlow perlStatement
  518. hi def link perlStatementInclude perlStatement
  519. hi def link perlStatementProc perlStatement
  520. hi def link perlStatementSocket perlStatement
  521. hi def link perlStatementIPC perlStatement
  522. hi def link perlStatementNetwork perlStatement
  523. hi def link perlStatementPword perlStatement
  524. hi def link perlStatementTime perlStatement
  525. hi def link perlStatementMisc perlStatement
  526. hi def link perlStatementIndirObj perlStatement
  527. hi def link perlFunctionName perlIdentifier
  528. hi def link perlMethod perlIdentifier
  529. hi def link perlPostDeref perlIdentifier
  530. hi def link perlFunctionPRef perlType
  531. if !get(g:, 'perl_include_pod', 1)
  532. hi def link perlPOD perlComment
  533. endif
  534. hi def link perlShellCommand perlString
  535. hi def link perlSpecialAscii perlSpecial
  536. hi def link perlSpecialDollar perlSpecial
  537. hi def link perlSpecialString perlSpecial
  538. hi def link perlSpecialStringU perlSpecial
  539. hi def link perlSpecialMatch perlSpecial
  540. hi def link perlEND perlComment
  541. hi def link perlENDStart perlEND
  542. hi def link perlDATA perlComment
  543. hi def link perlDATAStart perlDATA
  544. " NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
  545. " I had to remove the transparent property from the following regions
  546. " in order to get them to highlight correctly. Feel free to remove
  547. " these and reinstate the transparent property if you know how.
  548. hi def link perlParensSQ perlString
  549. hi def link perlBracketsSQ perlString
  550. hi def link perlBracesSQ perlString
  551. hi def link perlAnglesSQ perlString
  552. hi def link perlParensDQ perlString
  553. hi def link perlBracketsDQ perlString
  554. hi def link perlBracesDQ perlString
  555. hi def link perlAnglesDQ perlString
  556. hi def link perlSpecialStringU2 perlString
  557. " Possible errors
  558. hi def link perlNotEmptyLine Error
  559. hi def link perlElseIfError Error
  560. " Syncing to speed up processing
  561. "
  562. if !get(g:, 'perl_no_sync_on_sub', 0)
  563. syn sync match perlSync grouphere NONE "^\s*\<package\s"
  564. syn sync match perlSync grouphere NONE "^\s*\<sub\>"
  565. syn sync match perlSync grouphere NONE "^}"
  566. endif
  567. if !get(g:, 'perl_no_sync_on_global_var', 0)
  568. syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
  569. syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
  570. endif
  571. if get(g:, 'perl_sync_dist', 0)
  572. execute "syn sync maxlines=" . perl_sync_dist
  573. else
  574. syn sync maxlines=100
  575. endif
  576. syn sync match perlSyncPOD grouphere perlPOD "^=pod"
  577. syn sync match perlSyncPOD grouphere perlPOD "^=head"
  578. syn sync match perlSyncPOD grouphere perlPOD "^=item"
  579. syn sync match perlSyncPOD grouphere NONE "^=cut"
  580. let b:current_syntax = "perl"
  581. let &cpo = s:cpo_save
  582. unlet s:cpo_save
  583. " XXX Change to sts=4:sw=4
  584. " vim:ts=8:sts=2:sw=2:expandtab:ft=vim