blob: 73f967a183e42a16f5d7920e900b8b9fb89d76f2 [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)
Bram Moolenaard592deb2022-06-17 15:42:40 +01007" Last Change: 2022 Jun 13
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)
Bram Moolenaard592deb2022-06-17 15:42:40 +0100445 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
446 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447else
Bram Moolenaard592deb2022-06-17 15:42:40 +0100448 syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="\%$" contains=@perlDATA
449 syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="\%$" contains=@perlDATA
450endif
451
452" TODO: generalise this to allow other filetypes
453if get(g:, 'perl_highlight_data', 0)
454 syn cluster perlDATA add=perlPOD
455else
456 syn cluster perlDATA remove=perlPOD
Bram Moolenaar071d4272004-06-13 20:20:40 +0000457endif
458
Bram Moolenaarf3549812010-08-13 12:09:22 +0200459"
460" Folding
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100461if get(g:, 'perl_fold', 0)
Bram Moolenaarf3549812010-08-13 12:09:22 +0200462 " Note: this bit must come before the actual highlighting of the "package"
463 " keyword, otherwise this will screw up Pod lines that match /^package/
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100464 if !get(g:, 'perl_nofold_packages', 0)
Bram Moolenaarf3549812010-08-13 12:09:22 +0200465 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 +0100466 syn region perlPackageFold start="^\z(\s*\)package\s*\S\+\s*{" end="^\z1}" transparent fold keepend
Bram Moolenaarf3549812010-08-13 12:09:22 +0200467 endif
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100468 if !get(g:, 'perl_nofold_subs', 0)
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200469 if get(g:, "perl_fold_anonymous_subs", 0)
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100470 " EXPLANATION:
471 " \<sub\> - "sub" keyword
472 " \_[^;{]* - any characters, including new line, but not ";" or "{", zero or more times
473 " \%(([\\$@%&*\[\];]*)\)\= - prototype definition, \$@%&*[]; characters between (), zero or 1 times
474 " \_[^;]* - any characters, including new line, but not ";" or "{", zero or more times
475 " { - start subroutine block
476 syn region perlSubFold start="\<sub\>\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;{]*{" end="}" transparent fold keepend extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200477 else
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100478 " EXPLANATION:
479 " same, as above, but first non-space character after "sub" keyword must
480 " be [A-Za-z_]
481 syn region perlSubFold start="\<sub\>\s*\h\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;]*{" end="}" transparent fold keepend extend
482 endif
483
484 syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>\_s*{" end="}" transparent fold keepend
485 endif
486
487 if get(g:, 'perl_fold_blocks', 0)
488 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
489
490 " TODO this is works incorrectly
491 syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
492 else
493 if get(g:, 'perl_fold_do_blocks', 0)
494 syn region perlDoBlockDeclaration start="" end="{" contains=perlComment contained transparent
495 syn match perlOperator "\<do\>\_s*" nextgroup=perlDoBlockDeclaration
496
497 syn region perlDoBlockFold start="\<do\>\_[^{]*{" end="}" transparent fold keepend extend
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200498 endif
Bram Moolenaarf3549812010-08-13 12:09:22 +0200499 endif
500
Bram Moolenaarf3549812010-08-13 12:09:22 +0200501 syn sync fromstart
502else
503 " fromstart above seems to set minlines even if perl_fold is not set.
504 syn sync minlines=0
505endif
506
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200507" NOTE: If you're linking new highlight groups to perlString, please also put
508" them into b:match_skip in ftplugin/perl.vim.
509
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200510" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200511hi def link perlSharpBang PreProc
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100512hi def link perlControl PreProc
513hi def link perlInclude Include
514hi def link perlSpecial Special
515hi def link perlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200516hi def link perlCharacter Character
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100517hi def link perlNumber Number
518hi def link perlFloat Float
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200519hi def link perlType Type
520hi def link perlIdentifier Identifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100521hi def link perlLabel Label
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200522hi def link perlStatement Statement
523hi def link perlConditional Conditional
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100524hi def link perlRepeat Repeat
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200525hi def link perlOperator Operator
526hi def link perlFunction Keyword
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100527hi def link perlSubName Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200528hi def link perlSubPrototype Type
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100529hi def link perlSubSignature Type
530hi def link perlSubAttribute PreProc
531hi def link perlComment Comment
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200532hi def link perlTodo Todo
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100533if get(g:, 'perl_string_as_statement', 0)
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200534 hi def link perlStringStartEnd perlStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200536 hi def link perlStringStartEnd perlString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000537endif
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200538hi def link perlVStringV perlStringStartEnd
539hi def link perlList perlStatement
540hi def link perlMisc perlStatement
541hi def link perlVarPlain perlIdentifier
542hi def link perlVarPlain2 perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100543hi def link perlArrow perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200544hi def link perlFiledescRead perlIdentifier
545hi def link perlFiledescStatement perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100546hi def link perlVarSimpleMember perlIdentifier
547hi def link perlVarSimpleMemberName perlString
548hi def link perlVarNotInMatches perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200549hi def link perlVarSlash perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100550hi def link perlQ perlString
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200551hi def link perlQQ perlString
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100552hi def link perlQW perlString
553hi def link perlQR perlString
554hi def link perlMatchModifiers perlMatchStartEnd
555hi def link perlSubstitutionModifiers perlMatchStartEnd
556hi def link perlTranslationModifiers perlMatchStartEnd
557hi def link perlQRModifiers perlStringStartEnd
558hi def link perlHereDoc perlString
559hi def link perlIndentedHereDoc perlString
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200560hi def link perlStringUnexpanded perlString
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100561hi def link perlSubstitutionSQ perlString
562hi def link perlSubstitutionGQQ perlString
563hi def link perlTranslationGQ perlString
564hi def link perlMatch perlString
565hi def link perlMatchStartEnd perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200566hi def link perlFormatName perlIdentifier
567hi def link perlFormatField perlString
568hi def link perlPackageDecl perlType
569hi def link perlStorageClass perlType
570hi def link perlPackageRef perlType
571hi def link perlStatementPackage perlStatement
572hi def link perlStatementStorage perlStatement
573hi def link perlStatementControl perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100574hi def link perlStatementScalar perlStatement
575hi def link perlStatementRegexp perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200576hi def link perlStatementNumeric perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100577hi def link perlStatementList perlStatement
578hi def link perlStatementHash perlStatement
579hi def link perlStatementIOfunc perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200580hi def link perlStatementFiledesc perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100581hi def link perlStatementVector perlStatement
582hi def link perlStatementFiles perlStatement
583hi def link perlStatementFlow perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200584hi def link perlStatementInclude perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100585hi def link perlStatementProc perlStatement
586hi def link perlStatementSocket perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200587hi def link perlStatementIPC perlStatement
588hi def link perlStatementNetwork perlStatement
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100589hi def link perlStatementPword perlStatement
590hi def link perlStatementTime perlStatement
591hi def link perlStatementMisc perlStatement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200592hi def link perlStatementIndirObj perlStatement
593hi def link perlFunctionName perlIdentifier
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100594hi def link perlMethod perlIdentifier
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200595hi def link perlPostDeref perlIdentifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200596hi def link perlFunctionPRef perlType
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100597
Bram Moolenaar37c64c72017-09-19 22:06:03 +0200598if !get(g:, 'perl_include_pod', 1)
599 hi def link perlPOD perlComment
600endif
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200601hi def link perlShellCommand perlString
602hi def link perlSpecialAscii perlSpecial
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100603hi def link perlSpecialDollar perlSpecial
604hi def link perlSpecialString perlSpecial
605hi def link perlSpecialStringU perlSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200606hi def link perlSpecialMatch perlSpecial
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100607hi def link perlEND perlComment
608hi def link perlENDStart perlEND
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200609hi def link perlDATA perlComment
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100610hi def link perlDATAStart perlDATA
Bram Moolenaar071d4272004-06-13 20:20:40 +0000611
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200612" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100613" I had to remove the transparent property from the following regions
614" in order to get them to highlight correctly. Feel free to remove
615" these and reinstate the transparent property if you know how.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200616hi def link perlParensSQ perlString
617hi def link perlBracketsSQ perlString
618hi def link perlBracesSQ perlString
619hi def link perlAnglesSQ perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200620
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200621hi def link perlParensDQ perlString
622hi def link perlBracketsDQ perlString
623hi def link perlBracesDQ perlString
624hi def link perlAnglesDQ perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200625
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200626hi def link perlSpecialStringU2 perlString
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200627
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200628" Possible errors
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200629hi def link perlNotEmptyLine Error
630hi def link perlElseIfError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631
Bram Moolenaar071d4272004-06-13 20:20:40 +0000632" Syncing to speed up processing
633"
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100634if !get(g:, 'perl_no_sync_on_sub', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000635 syn sync match perlSync grouphere NONE "^\s*\<package\s"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200636 syn sync match perlSync grouphere NONE "^\s*\<sub\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000637 syn sync match perlSync grouphere NONE "^}"
638endif
639
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100640if !get(g:, 'perl_no_sync_on_global_var', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000641 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
642 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
643endif
644
Bram Moolenaar8c1b8cb2022-06-14 17:41:28 +0100645if get(g:, 'perl_sync_dist', 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000646 execute "syn sync maxlines=" . perl_sync_dist
647else
648 syn sync maxlines=100
649endif
650
651syn sync match perlSyncPOD grouphere perlPOD "^=pod"
652syn sync match perlSyncPOD grouphere perlPOD "^=head"
653syn sync match perlSyncPOD grouphere perlPOD "^=item"
654syn sync match perlSyncPOD grouphere NONE "^=cut"
655
656let b:current_syntax = "perl"
657
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200658let &cpo = s:cpo_save
659unlet s:cpo_save
660
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200661" XXX Change to sts=4:sw=4
662" vim:ts=8:sts=2:sw=2:expandtab:ft=vim