7

vim syntax highlighting for perl, to use colors instead of \ and "

 1 year ago
source link: https://pastebin.com/yCZ1wkYY
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

vim syntax highlighting for perl, to use colors instead of \ and "

Apr 21st, 2023

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK