blob: 59611b66a48764614684d06ef530fb6eaa339056 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +01002" Language: Perl
Bram Moolenaar543b7ef2013-06-01 14:50:56 +02003" Maintainer: vim-perl <vim-perl@googlegroups.com>
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +01004" Homepage: https://github.com/vim-perl/vim-perl
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02005" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +01006" License: Vim License (see :help license)
7" Last Change: 2021 Oct 7
Bram Moolenaar543b7ef2013-06-01 14:50:56 +02008" 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>
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +010014" Doug Kearns <dougkearns@gmail.com>
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020015" and many others.
Bram Moolenaar071d4272004-06-13 20:20:40 +000016"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020017" Please download the most recent version first, before mailing
Bram Moolenaar071d4272004-06-13 20:20:40 +000018" any comments.
Bram Moolenaar071d4272004-06-13 20:20:40 +000019"
Bram Moolenaar071d4272004-06-13 20:20:40 +000020" The following parameters are available for tuning the
21" perl syntax highlighting, with defaults given:
22"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020023" let perl_include_pod = 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +020024" unlet perl_no_scope_in_variables
25" unlet perl_no_extended_vars
Bram Moolenaar071d4272004-06-13 20:20:40 +000026" 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
Bram Moolenaare2db6952013-07-24 19:53:36 +020032" unlet perl_nofold_packages
Bram Moolenaar37c64c72017-09-19 22:06:03 +020033" unlet perl_nofold_subs
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020034" unlet perl_fold_anonymous_subs
Bram Moolenaar37c64c72017-09-19 22:06:03 +020035" unlet perl_no_subprototype_error
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
Bram Moolenaarf3549812010-08-13 12:09:22 +020037if exists("b:current_syntax")
Bram Moolenaar00a927d2010-05-14 23:24:24 +020038 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000039endif
40
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020041let s:cpo_save = &cpo
42set cpo&vim
43
Bram Moolenaar071d4272004-06-13 20:20:40 +000044" POD starts with ^=<word> and ends with ^=cut
45
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +010046if get(g:, 'perl_include_pod', 1)
Bram Moolenaar071d4272004-06-13 20:20:40 +000047 " Include a while extra syntax file
48 syn include @Pod syntax/pod.vim
49 unlet b:current_syntax
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +010050 if get(g:, 'perl_fold', 1)
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020051 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend
52 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend
Bram Moolenaar071d4272004-06-13 20:20:40 +000053 else
Bram Moolenaara5792f52005-11-23 21:25:05 +000054 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +000055 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
56 endif
57else
58 " Use only the bare minimum of rules
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +010059 if get(g:, 'perl_fold', 1)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000060 syn region perlPOD start="^=[a-z]" end="^=cut" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000061 else
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000062 syn region perlPOD start="^=[a-z]" end="^=cut"
Bram Moolenaar071d4272004-06-13 20:20:40 +000063 endif
64endif
65
66
Bram Moolenaar00a927d2010-05-14 23:24:24 +020067syn cluster perlTop contains=TOP
Bram Moolenaar00a927d2010-05-14 23:24:24 +020068
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020069syn region perlBraces start="{" end="}" transparent extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +020070
Bram Moolenaar071d4272004-06-13 20:20:40 +000071" All keywords
72"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020073syn match perlConditional "\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020074syn match perlConditional "\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
Bram Moolenaar00a927d2010-05-14 23:24:24 +020075syn match perlRepeat "\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
76syn match perlOperator "\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020077" for some reason, adding this as the nextgroup for perlControl fixes BEGIN
78" folding issues...
79syn match perlFakeGroup "" contained
80syn match perlControl "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +000081
Bram Moolenaar00a927d2010-05-14 23:24:24 +020082syn match perlStatementStorage "\<\%(my\|our\|local\|state\)\>"
83syn match perlStatementControl "\<\%(return\|last\|next\|redo\|goto\|break\)\>"
Bram Moolenaar37c64c72017-09-19 22:06:03 +020084syn match perlStatementScalar "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020085syn match perlStatementRegexp "\<\%(pos\|quotemeta\|split\|study\)\>"
86syn match perlStatementNumeric "\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
87syn match perlStatementList "\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
88syn match perlStatementHash "\<\%(delete\|each\|exists\|keys\|values\)\>"
89syn match perlStatementIOfunc "\<\%(syscall\|dbmopen\|dbmclose\)\>"
90syn match perlStatementFiledesc "\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
91syn match perlStatementFiledesc "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
92syn match perlStatementVector "\<vec\>"
93syn match perlStatementFiles "\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
94syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
Bram Moolenaar37c64c72017-09-19 22:06:03 +020095syn match perlStatementFlow "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
96syn match perlStatementInclude "\<\%(require\|import\|unimport\)\>"
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +010097syn 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\)\=\)\>\)\="
Bram Moolenaar00a927d2010-05-14 23:24:24 +020098syn match perlStatementProc "\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
Bram Moolenaare2db6952013-07-24 19:53:36 +020099syn match perlStatementSocket "\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200100syn match perlStatementIPC "\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
101syn match perlStatementNetwork "\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
102syn match perlStatementPword "\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
103syn match perlStatementTime "\<\%(gmtime\|localtime\|time\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104
Bram Moolenaare2db6952013-07-24 19:53:36 +0200105syn match perlStatementMisc "\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000106
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200107syn keyword perlTodo TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200108
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200109syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200110
111syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112
113" Perl Identifiers.
114"
115" Should be cleaned up to better handle identifiers in particular situations
116" (in hash keys for example)
117"
118" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
119" We do not process complex things such as @{${"foo"}}. Too complicated, and
120" too slow. And what is after the -> is *not* considered as part of the
121" variable - there again, too complicated and too slow.
122
123" Special variables first ($^A, ...) and ($|, $', ...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200124syn match perlVarPlain "$^[ACDEFHILMNOPRSTVWX]\="
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000125syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200126syn match perlVarPlain "@[-+]"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200127syn match perlVarPlain "$\%(0\|[1-9]\d*\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200129syn match perlVarPlain "$::\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130" These variables are not recognized within matches.
131syn match perlVarNotInMatches "$[|)]"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000132" This variable is not recognized within matches delimited by m//.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133syn match perlVarSlash "$/"
134
135" And plain identifiers
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200136syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200138" To not highlight packages in variables as a scope reference - i.e. in
139" $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"
140" If you don't want complex things like @{${"foo"}} to be processed,
141" just set the variable "perl_no_extended_vars"...
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000142
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100143if !get(g:, 'perl_no_scope_in_variables', 0)
144 syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
145 syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
146 syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100148 syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
149 syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
150 syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151endif
152
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200153syn match perlVarPlain2 "%[-+]"
154
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100155if !get(g:, 'perl_no_extended_vars', 0)
156 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
157 syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
158 syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
159 syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
160 syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
161 syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
162 syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
163 syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
164 syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
165 syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
166 syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contains=perlVarSimpleMemberName contained extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000167 syn match perlVarSimpleMemberName "\I\i*" contained
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100168 syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
169 syn match perlPackageConst "__PACKAGE__" nextgroup=perlPostDeref
170 syn match perlPostDeref "->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
171 syn region perlPostDeref start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
172 syn region perlPostDeref matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" keepend extend contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000173endif
174
175" File Descriptors
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200176syn match perlFiledescRead "<\h\w*>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200178syn match perlFiledescStatementComma "(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
179syn match perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200181syn match perlFiledescStatement "\<\u\w*\>" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182
183" Special characters in strings and matches
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200184syn match perlSpecialString "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200185syn match perlSpecialStringU2 "\\." extend contained contains=NONE
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200186syn match perlSpecialStringU "\\\\" contained
187syn match perlSpecialMatch "\\[1-9]" contained extend
188syn match perlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
189syn match perlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained
190syn match perlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200191syn match perlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000192syn match perlSpecialMatch "[+*()?.]" contained
193syn match perlSpecialMatch "(?[#:=!]" contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200194syn match perlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained
195syn match perlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained
196syn match perlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained
197syn match perlSpecialMatch "(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000198
199" Possible errors
200"
201" Highlight lines with only whitespace (only in blank delimited here documents) as errors
202syn match perlNotEmptyLine "^\s\+$" contained
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200203" Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
204syn match perlElseIfError "else\_s*if" containedin=perlConditional
205syn keyword perlElseIfError elseif containedin=perlConditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000206
207" Variable interpolation
208"
209" These items are interpolated inside "" strings and similar constructs.
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000210syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211" These items are interpolated inside '' strings and similar constructs.
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200212syn cluster perlInterpSQ contains=perlSpecialStringU,perlSpecialStringU2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213" These items are interpolated inside m// matches and s/// substitutions.
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200214syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215" These items are interpolated inside m## matches and s### substitutions.
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000216syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217
218" Shell commands
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200219syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
221" Constants
222"
223" Numbers
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100224syn case ignore
225syn match perlNumber "\<\%(0\|[1-9]\%(_\=\d\)*\)\>"
226syn match perlNumber "\<0\%(x\x\%(_\=\x\)*\|b[01]\%(_\=[01]\)*\|o\=\%(_\=\o\)*\)\>"
227syn match perlFloat "\<\d\%(_\=\d\)*e[-+]\=\d\%(_\=\d\)*"
228syn match perlFloat "\<\d\%(_\=\d\)*\.\%(\d\%(_\=\d\)*\)\=\%(e[-+]\=\d\%(_\=\d\)*\)\="
229syn match perlFloat "\.\d\%(_\=\d\)*\%(e[-+]\=\d\%(_\=\d\)*\)\="
230syn match perlFloat "\<0x\x\%(_\=\x\)*p[-+]\=\d\%(_\=\d\)*"
231syn match perlFloat "\<0x\x\%(_\=\x\)*\.\%(\x\%(_\=\x\)*\)\=\%(p[-+]\=\d\%(_\=\d\)*\)\="
232syn match perlFloat "\<0x\.\x\%(_\=\x\)*\%(p[-+]\=\d\%(_\=\d\)*\)\="
233syn case match
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200234
235syn match perlString "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
236syn match perlVStringV "\<v" contained
237
238
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200239syn region perlParensSQ start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
240syn region perlBracketsSQ start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
241syn region perlBracesSQ start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
242syn region perlAnglesSQ start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200243
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200244syn region perlParensDQ start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
245syn region perlBracketsDQ start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
246syn region perlBracesDQ start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
247syn region perlAnglesDQ start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
249
250" Simple version of searches and matches
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100251syn match perlMatchModifiers "[msixpadluncgo]\+" contained
252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
254syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlMatchModifiers
255syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlMatchModifiers
256syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlMatchModifiers
257syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ extend nextgroup=perlMatchModifiers
258syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ keepend extend nextgroup=perlMatchModifiers
259syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ keepend extend nextgroup=perlMatchModifiers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260
261" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
262" cases as the / is used in so many other ways, but these should be the most obvious ones.
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100263syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264
265
266" Substitutions
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267" perlMatch is the first part, perlSubstitution* is the substitution part
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100268syn match perlSubstitutionModifiers "[msixpadluncgero]\+" contained
Bram Moolenaare2db6952013-07-24 19:53:36 +0200269syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
270syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
274syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
275syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200276syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100277syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1+ keepend contained contains=@perlInterpDQ extend nextgroup=perlSubstitutionModifiers
278syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contained contains=@perlInterpDQ,perlParensDQ keepend extend nextgroup=perlSubstitutionModifiers
279syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend nextgroup=perlSubstitutionModifiers
280syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend nextgroup=perlSubstitutionModifiers
281syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend nextgroup=perlSubstitutionModifiers
282syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'+ contained contains=@perlInterpSQ keepend extend nextgroup=perlSubstitutionModifiers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200284" Translations
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285" perlMatch is the first part, perlTranslation* is the second, translator part.
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100286syn match perlTranslationModifiers "[cdsr]\+" contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200287syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
288syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
289syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
290syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
291syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
292syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100293syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1+ contained nextgroup=perlTranslationModifiers
294syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contains=perlParensSQ contained nextgroup=perlTranslationModifiers
295syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contains=perlBracketsSQ contained nextgroup=perlTranslationModifiers
296syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contains=perlBracesSQ contained nextgroup=perlTranslationModifiers
297syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contains=perlAnglesSQ contained nextgroup=perlTranslationModifiers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298
299
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300" Strings and q, qq, qw and qr expressions
301
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200302syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
303syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ keepend extend
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100304syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
305syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
306syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
307syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
308syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
309syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200311syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
312syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
313syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
314syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
315syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
316syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200317
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100318syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
319syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+ end=+#+ contains=@perlInterpSQ keepend extend
320syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
321syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
322syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
323syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200324
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100325syn match perlQRModifiers "[msixpadluno]\+" contained
326syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
327syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlQRModifiers
328syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
329syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlQRModifiers
330syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlQRModifiers
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200331
332" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100333syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend nextgroup=perlQRModifiers
334syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend nextgroup=perlQRModifiers
335syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend nextgroup=perlQRModifiers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336
337" Constructs such as print <<EOF [...] EOF, 'here' documents
338"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200339" XXX Any statements after the identifier are in perlString colour (i.e.
340" 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
341" seems due to the 'auto-extending nature' of regions.
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100342" XXX Indented heredocs are not perfect - they sometimes seem to take a moment
343" to update if switched from double to single quotes and vice versa.
344"
345" Note: bare delimiters such as << to mean <<"" are not supported. These are a
346" fatal error since 5.28 and, apparently, a rarely used feature.
347
348syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\I\i*+ end=+$+ contains=@perlTop oneline
349syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\\\I\i*+ end=+$+ contains=@perlTop oneline
350syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*"[^\\"]*\%(\\.[^\\"]*\)*"+ end=+$+ contains=@perlTop oneline
351syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*'[^\\']*\%(\\.[^\\']*\)*'+ end=+$+ contains=@perlTop oneline
352syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*`[^\\`]*\%(\\.[^\\`]*\)*`+ end=+$+ contains=@perlTop oneline
353syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*""+ end=+$+ contains=@perlTop oneline
354syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*''+ end=+$+ contains=@perlTop oneline
355syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*``+ end=+$+ contains=@perlTop oneline
356
357if get(g:, 'perl_fold', 0)
358 syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
359 syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200360 syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
361 syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100362 syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
363 syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
364 syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
365 syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100367 syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
368 syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200369 syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
370 syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100371 syn region perlHereDoc start=+<<\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
372 syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
373 syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
374 syn region perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
375endif
376
377if get(g:, 'perl_fold', 0)
378 syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
379 syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
380 syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
381 syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
382 syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
383 syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
384 syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
385 syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
386else
387 syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
388 syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
389 syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
390 syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
391 syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
392 syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
393 syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
394 syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000395endif
396
397
398" Class declarations
399"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200400syn match perlPackageDecl "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
Bram Moolenaar071d4272004-06-13 20:20:40 +0000401syn keyword perlStatementPackage package contained
402
403" Functions
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200404if get(g:, "perl_sub_signatures", 0)
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100405 syn match perlSubSignature "\s*([^)]*)" contained extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200406else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100407 syn match perlSubPrototype "\s*([\\$@%&*\[\];]*)" contained extend
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200408endif
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100409syn match perlSubAttribute "\s*:\s*\h\w*\%(([^)]*)\|\)" contained extend
410syn match perlSubName "\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\s*" contained extend
411syn region perlSubDeclaration start="" end="[;{]" contains=perlSubName,perlSubPrototype,perlSubAttribute,perlSubSignature,perlComment contained transparent
412syn match perlFunction "\<sub\>\_s*" nextgroup=perlSubDeclaration
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200413
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200414" The => operator forces a bareword to the left of it to be interpreted as
415" a string
416syn match perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
417
Bram Moolenaar071d4272004-06-13 20:20:40 +0000418" All other # are comments, except ^#!
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200419syn match perlComment "#.*" contains=perlTodo,@Spell extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420syn match perlSharpBang "^#!.*"
421
422" Formats
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000423syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200425syn match perlFormatField "[@^][|<>~]\+\%(\.\.\.\)\=" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426syn match perlFormatField "[@^]#[#.]*" contained
427syn match perlFormatField "@\*" contained
428syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
429syn match perlFormatField "@$" contained
430
431" __END__ and __DATA__ clauses
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100432
433" Vim excludes empty syn-region end lines from the fold region. This is
434" probably a bug and means a DATA section ending with an empty line does not
435" have that final line included in the fold.
436"
437" As a workaround we exploit an unterminated syntax region here with an end
438" pattern that will (probably) never match. This forces all lines to be
439" included in the fold region. Of course, if it does match then there's
440" nothing to work around as it is a non-empty line.
441"
442" This problem also exists with empty string delimited heredocs but there's no
443" known workaround for that case.
444if get(g:, 'perl_fold', 0)
445 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="VIM_PERL_EOF\%$" contains=perlPOD,@perlDATA fold
446 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="VIM_PERL_EOF\%$" contains=perlPOD,@perlDATA fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100448 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="\%$" contains=perlPOD,@perlDATA
449 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="\%$" contains=perlPOD,@perlDATA
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450endif
451
Bram Moolenaarf3549812010-08-13 12:09:22 +0200452"
453" Folding
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100454if get(g:, 'perl_fold', 0)
Bram Moolenaarf3549812010-08-13 12:09:22 +0200455 " Note: this bit must come before the actual highlighting of the "package"
456 " keyword, otherwise this will screw up Pod lines that match /^package/
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100457 if !get(g:, 'perl_nofold_packages', 0)
Bram Moolenaarf3549812010-08-13 12:09:22 +0200458 syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100459 syn region perlPackageFold start="^\z(\s*\)package\s*\S\+\s*{" end="^\z1}" transparent fold keepend
Bram Moolenaarf3549812010-08-13 12:09:22 +0200460 endif
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100461 if !get(g:, 'perl_nofold_subs', 0)
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200462 if get(g:, "perl_fold_anonymous_subs", 0)
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100463 " EXPLANATION:
464 " \<sub\> - "sub" keyword
465 " \_[^;{]* - any characters, including new line, but not ";" or "{", zero or more times
466 " \%(([\\$@%&*\[\];]*)\)\= - prototype definition, \$@%&*[]; characters between (), zero or 1 times
467 " \_[^;]* - any characters, including new line, but not ";" or "{", zero or more times
468 " { - start subroutine block
469 syn region perlSubFold start="\<sub\>\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;{]*{" end="}" transparent fold keepend extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200470 else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100471 " EXPLANATION:
472 " same, as above, but first non-space character after "sub" keyword must
473 " be [A-Za-z_]
474 syn region perlSubFold start="\<sub\>\s*\h\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;]*{" end="}" transparent fold keepend extend
475 endif
476
477 syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>\_s*{" end="}" transparent fold keepend
478 endif
479
480 if get(g:, 'perl_fold_blocks', 0)
481 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
482
483 " TODO this is works incorrectly
484 syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
485 else
486 if get(g:, 'perl_fold_do_blocks', 0)
487 syn region perlDoBlockDeclaration start="" end="{" contains=perlComment contained transparent
488 syn match perlOperator "\<do\>\_s*" nextgroup=perlDoBlockDeclaration
489
490 syn region perlDoBlockFold start="\<do\>\_[^{]*{" end="}" transparent fold keepend extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200491 endif
Bram Moolenaarf3549812010-08-13 12:09:22 +0200492 endif
493
Bram Moolenaarf3549812010-08-13 12:09:22 +0200494 syn sync fromstart
495else
496 " fromstart above seems to set minlines even if perl_fold is not set.
497 syn sync minlines=0
498endif
499
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200500" NOTE: If you're linking new highlight groups to perlString, please also put
501" them into b:match_skip in ftplugin/perl.vim.
502
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200503" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200504hi def link perlSharpBang PreProc
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100505hi def link perlControl PreProc
506hi def link perlInclude Include
507hi def link perlSpecial Special
508hi def link perlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200509hi def link perlCharacter Character
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100510hi def link perlNumber Number
511hi def link perlFloat Float
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200512hi def link perlType Type
513hi def link perlIdentifier Identifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100514hi def link perlLabel Label
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200515hi def link perlStatement Statement
516hi def link perlConditional Conditional
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100517hi def link perlRepeat Repeat
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200518hi def link perlOperator Operator
519hi def link perlFunction Keyword
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100520hi def link perlSubName Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200521hi def link perlSubPrototype Type
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100522hi def link perlSubSignature Type
523hi def link perlSubAttribute PreProc
524hi def link perlComment Comment
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200525hi def link perlTodo Todo
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100526if get(g:, 'perl_string_as_statement', 0)
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200527 hi def link perlStringStartEnd perlStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000528else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200529 hi def link perlStringStartEnd perlString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000530endif
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200531hi def link perlVStringV perlStringStartEnd
532hi def link perlList perlStatement
533hi def link perlMisc perlStatement
534hi def link perlVarPlain perlIdentifier
535hi def link perlVarPlain2 perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100536hi def link perlArrow perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200537hi def link perlFiledescRead perlIdentifier
538hi def link perlFiledescStatement perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100539hi def link perlVarSimpleMember perlIdentifier
540hi def link perlVarSimpleMemberName perlString
541hi def link perlVarNotInMatches perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200542hi def link perlVarSlash perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100543hi def link perlQ perlString
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200544hi def link perlQQ perlString
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100545hi def link perlQW perlString
546hi def link perlQR perlString
547hi def link perlMatchModifiers perlMatchStartEnd
548hi def link perlSubstitutionModifiers perlMatchStartEnd
549hi def link perlTranslationModifiers perlMatchStartEnd
550hi def link perlQRModifiers perlStringStartEnd
551hi def link perlHereDoc perlString
552hi def link perlIndentedHereDoc perlString
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200553hi def link perlStringUnexpanded perlString
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100554hi def link perlSubstitutionSQ perlString
555hi def link perlSubstitutionGQQ perlString
556hi def link perlTranslationGQ perlString
557hi def link perlMatch perlString
558hi def link perlMatchStartEnd perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200559hi def link perlFormatName perlIdentifier
560hi def link perlFormatField perlString
561hi def link perlPackageDecl perlType
562hi def link perlStorageClass perlType
563hi def link perlPackageRef perlType
564hi def link perlStatementPackage perlStatement
565hi def link perlStatementStorage perlStatement
566hi def link perlStatementControl perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100567hi def link perlStatementScalar perlStatement
568hi def link perlStatementRegexp perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200569hi def link perlStatementNumeric perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100570hi def link perlStatementList perlStatement
571hi def link perlStatementHash perlStatement
572hi def link perlStatementIOfunc perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200573hi def link perlStatementFiledesc perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100574hi def link perlStatementVector perlStatement
575hi def link perlStatementFiles perlStatement
576hi def link perlStatementFlow perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200577hi def link perlStatementInclude perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100578hi def link perlStatementProc perlStatement
579hi def link perlStatementSocket perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200580hi def link perlStatementIPC perlStatement
581hi def link perlStatementNetwork perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100582hi def link perlStatementPword perlStatement
583hi def link perlStatementTime perlStatement
584hi def link perlStatementMisc perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200585hi def link perlStatementIndirObj perlStatement
586hi def link perlFunctionName perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100587hi def link perlMethod perlIdentifier
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200588hi def link perlPostDeref perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200589hi def link perlFunctionPRef perlType
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100590
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200591if !get(g:, 'perl_include_pod', 1)
592 hi def link perlPOD perlComment
593endif
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200594hi def link perlShellCommand perlString
595hi def link perlSpecialAscii perlSpecial
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100596hi def link perlSpecialDollar perlSpecial
597hi def link perlSpecialString perlSpecial
598hi def link perlSpecialStringU perlSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200599hi def link perlSpecialMatch perlSpecial
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100600hi def link perlEND perlComment
601hi def link perlENDStart perlEND
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200602hi def link perlDATA perlComment
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100603hi def link perlDATAStart perlDATA
Bram Moolenaar071d4272004-06-13 20:20:40 +0000604
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200605" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100606" I had to remove the transparent property from the following regions
607" in order to get them to highlight correctly. Feel free to remove
608" these and reinstate the transparent property if you know how.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200609hi def link perlParensSQ perlString
610hi def link perlBracketsSQ perlString
611hi def link perlBracesSQ perlString
612hi def link perlAnglesSQ perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200613
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200614hi def link perlParensDQ perlString
615hi def link perlBracketsDQ perlString
616hi def link perlBracesDQ perlString
617hi def link perlAnglesDQ perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200618
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200619hi def link perlSpecialStringU2 perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200620
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200621" Possible errors
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200622hi def link perlNotEmptyLine Error
623hi def link perlElseIfError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000624
Bram Moolenaar071d4272004-06-13 20:20:40 +0000625" Syncing to speed up processing
626"
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100627if !get(g:, 'perl_no_sync_on_sub', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000628 syn sync match perlSync grouphere NONE "^\s*\<package\s"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200629 syn sync match perlSync grouphere NONE "^\s*\<sub\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000630 syn sync match perlSync grouphere NONE "^}"
631endif
632
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100633if !get(g:, 'perl_no_sync_on_global_var', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000634 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
635 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
636endif
637
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100638if get(g:, 'perl_sync_dist', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000639 execute "syn sync maxlines=" . perl_sync_dist
640else
641 syn sync maxlines=100
642endif
643
644syn sync match perlSyncPOD grouphere perlPOD "^=pod"
645syn sync match perlSyncPOD grouphere perlPOD "^=head"
646syn sync match perlSyncPOD grouphere perlPOD "^=item"
647syn sync match perlSyncPOD grouphere NONE "^=cut"
648
649let b:current_syntax = "perl"
650
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200651let &cpo = s:cpo_save
652unlet s:cpo_save
653
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200654" XXX Change to sts=4:sw=4
655" vim:ts=8:sts=2:sw=2:expandtab:ft=vim