xref: /vim-8.2.3635/runtime/syntax/perl.vim (revision 2c7f8c57)
1071d4279SBram Moolenaar" Vim syntax file
200a927d6SBram Moolenaar" Language:      Perl 5
3543b7ef7SBram Moolenaar" Maintainer:    vim-perl <[email protected]>
4*2c7f8c57SBram Moolenaar" Homepage:      https://github.com/vim-perl/vim-perl/tree/master
5*2c7f8c57SBram Moolenaar" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
6*2c7f8c57SBram Moolenaar" Last Change:   2020 Apr 15
700a927d6SBram Moolenaar" Contributors:  Andy Lester <[email protected]>
800a927d6SBram Moolenaar"                Hinrik Örn Sigurðsson <[email protected]>
900a927d6SBram Moolenaar"                Lukas Mai <l.mai.web.de>
1000a927d6SBram Moolenaar"                Nick Hibma <[email protected]>
1100a927d6SBram Moolenaar"                Sonia Heimann <[email protected]>
12543b7ef7SBram Moolenaar"                Rob Hoelz <[email protected]>
1300a927d6SBram Moolenaar"                and many others.
14071d4279SBram Moolenaar"
15543b7ef7SBram Moolenaar" Please download the most recent version first, before mailing
16071d4279SBram Moolenaar" any comments.
17071d4279SBram Moolenaar"
18071d4279SBram Moolenaar" The following parameters are available for tuning the
19071d4279SBram Moolenaar" perl syntax highlighting, with defaults given:
20071d4279SBram Moolenaar"
21543b7ef7SBram Moolenaar" let perl_include_pod = 1
2200a927d6SBram Moolenaar" unlet perl_no_scope_in_variables
2300a927d6SBram Moolenaar" unlet perl_no_extended_vars
24071d4279SBram Moolenaar" unlet perl_string_as_statement
25071d4279SBram Moolenaar" unlet perl_no_sync_on_sub
26071d4279SBram Moolenaar" unlet perl_no_sync_on_global_var
27071d4279SBram Moolenaar" let perl_sync_dist = 100
28071d4279SBram Moolenaar" unlet perl_fold
29071d4279SBram Moolenaar" unlet perl_fold_blocks
30e2db695dSBram Moolenaar" unlet perl_nofold_packages
3137c64c78SBram Moolenaar" unlet perl_nofold_subs
32543b7ef7SBram Moolenaar" unlet perl_fold_anonymous_subs
3337c64c78SBram Moolenaar" unlet perl_no_subprototype_error
34071d4279SBram Moolenaar
35f354981dSBram Moolenaarif exists("b:current_syntax")
3600a927d6SBram Moolenaar  finish
37071d4279SBram Moolenaarendif
38071d4279SBram Moolenaar
39543b7ef7SBram Moolenaarlet s:cpo_save = &cpo
40543b7ef7SBram Moolenaarset cpo&vim
41543b7ef7SBram Moolenaar
42071d4279SBram Moolenaar" POD starts with ^=<word> and ends with ^=cut
43071d4279SBram Moolenaar
44543b7ef7SBram Moolenaarif !exists("perl_include_pod") || perl_include_pod == 1
45071d4279SBram Moolenaar  " Include a while extra syntax file
46071d4279SBram Moolenaar  syn include @Pod syntax/pod.vim
47071d4279SBram Moolenaar  unlet b:current_syntax
48071d4279SBram Moolenaar  if exists("perl_fold")
49543b7ef7SBram Moolenaar    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend
50543b7ef7SBram Moolenaar    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend
51071d4279SBram Moolenaar  else
52a5792f58SBram Moolenaar    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
53071d4279SBram Moolenaar    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
54071d4279SBram Moolenaar  endif
55071d4279SBram Moolenaarelse
56071d4279SBram Moolenaar  " Use only the bare minimum of rules
57071d4279SBram Moolenaar  if exists("perl_fold")
58dd2a3cdaSBram Moolenaar    syn region perlPOD start="^=[a-z]" end="^=cut" fold
59071d4279SBram Moolenaar  else
60dd2a3cdaSBram Moolenaar    syn region perlPOD start="^=[a-z]" end="^=cut"
61071d4279SBram Moolenaar  endif
62071d4279SBram Moolenaarendif
63071d4279SBram Moolenaar
64071d4279SBram Moolenaar
6500a927d6SBram Moolenaarsyn cluster perlTop		contains=TOP
6600a927d6SBram Moolenaar
679d98fe9cSBram Moolenaarsyn region perlBraces start="{" end="}" transparent extend
6800a927d6SBram Moolenaar
69071d4279SBram Moolenaar" All keywords
70071d4279SBram Moolenaar"
7100a927d6SBram Moolenaarsyn match perlConditional		"\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
72543b7ef7SBram Moolenaarsyn match perlConditional		"\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
7300a927d6SBram Moolenaarsyn match perlRepeat			"\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
7400a927d6SBram Moolenaarsyn match perlOperator			"\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"
75543b7ef7SBram Moolenaar" for some reason, adding this as the nextgroup for perlControl fixes BEGIN
76543b7ef7SBram Moolenaar" folding issues...
77543b7ef7SBram Moolenaarsyn match perlFakeGroup 		"" contained
78543b7ef7SBram Moolenaarsyn match perlControl			"\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
79071d4279SBram Moolenaar
8000a927d6SBram Moolenaarsyn match perlStatementStorage		"\<\%(my\|our\|local\|state\)\>"
8100a927d6SBram Moolenaarsyn match perlStatementControl		"\<\%(return\|last\|next\|redo\|goto\|break\)\>"
8237c64c78SBram Moolenaarsyn match perlStatementScalar		"\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
8300a927d6SBram Moolenaarsyn match perlStatementRegexp		"\<\%(pos\|quotemeta\|split\|study\)\>"
8400a927d6SBram Moolenaarsyn match perlStatementNumeric		"\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
8500a927d6SBram Moolenaarsyn match perlStatementList		"\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
8600a927d6SBram Moolenaarsyn match perlStatementHash		"\<\%(delete\|each\|exists\|keys\|values\)\>"
8700a927d6SBram Moolenaarsyn match perlStatementIOfunc		"\<\%(syscall\|dbmopen\|dbmclose\)\>"
8800a927d6SBram Moolenaarsyn match perlStatementFiledesc		"\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
8900a927d6SBram Moolenaarsyn match perlStatementFiledesc		"\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
9000a927d6SBram Moolenaarsyn match perlStatementVector		"\<vec\>"
9100a927d6SBram Moolenaarsyn match perlStatementFiles		"\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
92071d4279SBram Moolenaarsyn match perlStatementFiles		"-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
9337c64c78SBram Moolenaarsyn match perlStatementFlow		"\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
9437c64c78SBram Moolenaarsyn match perlStatementInclude		"\<\%(require\|import\|unimport\)\>"
9537c64c78SBram Moolenaarsyn match perlStatementInclude		"\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\%(::warnings\)\=\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|open\|ops\|overload\|overloading\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="
9600a927d6SBram Moolenaarsyn match perlStatementProc		"\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
97e2db695dSBram Moolenaarsyn match perlStatementSocket		"\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
9800a927d6SBram Moolenaarsyn match perlStatementIPC		"\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
9900a927d6SBram Moolenaarsyn match perlStatementNetwork		"\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
10000a927d6SBram Moolenaarsyn match perlStatementPword		"\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
10100a927d6SBram Moolenaarsyn match perlStatementTime		"\<\%(gmtime\|localtime\|time\)\>"
102071d4279SBram Moolenaar
103e2db695dSBram Moolenaarsyn match perlStatementMisc		"\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
104dd2a3cdaSBram Moolenaar
105543b7ef7SBram Moolenaarsyn keyword perlTodo			TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
10600a927d6SBram Moolenaar
10737c64c78SBram Moolenaarsyn region perlStatementIndirObjWrap   matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
10800a927d6SBram Moolenaar
10900a927d6SBram Moolenaarsyn match perlLabel      "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
110071d4279SBram Moolenaar
111071d4279SBram Moolenaar" Perl Identifiers.
112071d4279SBram Moolenaar"
113071d4279SBram Moolenaar" Should be cleaned up to better handle identifiers in particular situations
114071d4279SBram Moolenaar" (in hash keys for example)
115071d4279SBram Moolenaar"
116071d4279SBram Moolenaar" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
117071d4279SBram Moolenaar" We do not process complex things such as @{${"foo"}}. Too complicated, and
118071d4279SBram Moolenaar" too slow. And what is after the -> is *not* considered as part of the
119071d4279SBram Moolenaar" variable - there again, too complicated and too slow.
120071d4279SBram Moolenaar
121071d4279SBram Moolenaar" Special variables first ($^A, ...) and ($|, $', ...)
12200a927d6SBram Moolenaarsyn match  perlVarPlain		 "$^[ACDEFHILMNOPRSTVWX]\="
123dd2a3cdaSBram Moolenaarsyn match  perlVarPlain		 "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
12437c64c78SBram Moolenaarsyn match  perlVarPlain		 "@[-+]"
12500a927d6SBram Moolenaarsyn match  perlVarPlain		 "$\%(0\|[1-9]\d*\)"
126071d4279SBram Moolenaar" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
12700a927d6SBram Moolenaarsyn match  perlVarPlain		 "$::\@!"
128071d4279SBram Moolenaar" These variables are not recognized within matches.
129071d4279SBram Moolenaarsyn match  perlVarNotInMatches	 "$[|)]"
130dd2a3cdaSBram Moolenaar" This variable is not recognized within matches delimited by m//.
131071d4279SBram Moolenaarsyn match  perlVarSlash		 "$/"
132071d4279SBram Moolenaar
133071d4279SBram Moolenaar" And plain identifiers
13400a927d6SBram Moolenaarsyn match  perlPackageRef	 "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
135071d4279SBram Moolenaar
13600a927d6SBram Moolenaar" To not highlight packages in variables as a scope reference - i.e. in
13700a927d6SBram Moolenaar" $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"
13800a927d6SBram Moolenaar" If you don't want complex things like @{${"foo"}} to be processed,
13900a927d6SBram Moolenaar" just set the variable "perl_no_extended_vars"...
140dd2a3cdaSBram Moolenaar
14100a927d6SBram Moolenaarif !exists("perl_no_scope_in_variables")
14237c64c78SBram Moolenaar  syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
14337c64c78SBram Moolenaar  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
14437c64c78SBram Moolenaar  syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
145071d4279SBram Moolenaarelse
14637c64c78SBram Moolenaar  syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
14737c64c78SBram Moolenaar  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
14837c64c78SBram Moolenaar  syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
149071d4279SBram Moolenaarendif
150071d4279SBram Moolenaar
15137c64c78SBram Moolenaarsyn match  perlVarPlain2	 "%[-+]"
15237c64c78SBram Moolenaar
15300a927d6SBram Moolenaarif !exists("perl_no_extended_vars")
154e2db695dSBram Moolenaar  syn cluster perlExpr		contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ,perlArrow,perlBraces
15537c64c78SBram Moolenaar  syn region perlArrow		matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
15637c64c78SBram Moolenaar  syn region perlArrow		matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
15737c64c78SBram Moolenaar  syn region perlArrow		matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
15837c64c78SBram Moolenaar  syn match  perlArrow		"->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
15937c64c78SBram Moolenaar  syn region perlArrow		matchgroup=perlArrow start="->\s*\$*\I\i*\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
16037c64c78SBram Moolenaar  syn region perlVarBlock	matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16137c64c78SBram Moolenaar  syn region perlVarBlock2	matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16237c64c78SBram Moolenaar  syn match  perlVarPlain2	"[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16337c64c78SBram Moolenaar  syn match  perlVarPlain	"\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16437c64c78SBram Moolenaar  syn region perlVarMember	matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16537c64c78SBram Moolenaar  syn match  perlVarSimpleMember	"\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contains=perlVarSimpleMemberName contained extend
166071d4279SBram Moolenaar  syn match  perlVarSimpleMemberName	"\I\i*" contained
16737c64c78SBram Moolenaar  syn region perlVarMember	matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
16837c64c78SBram Moolenaar  syn match perlPackageConst	"__PACKAGE__" nextgroup=perlMethod,perlPostDeref
16937c64c78SBram Moolenaar  syn match  perlMethod		"->\$*\I\i*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
17037c64c78SBram Moolenaar  syn match  perlPostDeref	"->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
17137c64c78SBram Moolenaar  syn region  perlPostDeref	start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
17237c64c78SBram Moolenaar  syn region  perlPostDeref	matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
173071d4279SBram Moolenaarendif
174071d4279SBram Moolenaar
175071d4279SBram Moolenaar" File Descriptors
17600a927d6SBram Moolenaarsyn match  perlFiledescRead	"<\h\w*>"
177071d4279SBram Moolenaar
17837c64c78SBram Moolenaarsyn match  perlFiledescStatementComma	"(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
17937c64c78SBram Moolenaarsyn match  perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
180071d4279SBram Moolenaar
18137c64c78SBram Moolenaarsyn match  perlFiledescStatement	"\<\u\w*\>" contained
182071d4279SBram Moolenaar
183071d4279SBram Moolenaar" Special characters in strings and matches
18400a927d6SBram Moolenaarsyn match  perlSpecialString	"\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
185543b7ef7SBram Moolenaarsyn match  perlSpecialStringU2	"\\." extend contained contains=NONE
18600a927d6SBram Moolenaarsyn match  perlSpecialStringU	"\\\\" contained
18700a927d6SBram Moolenaarsyn match  perlSpecialMatch	"\\[1-9]" contained extend
18800a927d6SBram Moolenaarsyn match  perlSpecialMatch	"\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
18900a927d6SBram Moolenaarsyn match  perlSpecialMatch	"\\k\%(<\h\w*>\|'\h\w*'\)" contained
19000a927d6SBram Moolenaarsyn match  perlSpecialMatch	"{\d\+\%(,\%(\d\+\)\=\)\=}" contained
191543b7ef7SBram Moolenaarsyn match  perlSpecialMatch	"\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
192071d4279SBram Moolenaarsyn match  perlSpecialMatch	"[+*()?.]" contained
193071d4279SBram Moolenaarsyn match  perlSpecialMatch	"(?[#:=!]" contained
19400a927d6SBram Moolenaarsyn match  perlSpecialMatch	"(?[impsx]*\%(-[imsx]\+\)\=)" contained
19500a927d6SBram Moolenaarsyn match  perlSpecialMatch	"(?\%([-+]\=\d\+\|R\))" contained
19600a927d6SBram Moolenaarsyn match  perlSpecialMatch	"(?\%(&\|P[>=]\)\h\w*)" contained
19700a927d6SBram Moolenaarsyn match  perlSpecialMatch	"(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained
198071d4279SBram Moolenaar
199071d4279SBram Moolenaar" Possible errors
200071d4279SBram Moolenaar"
201071d4279SBram Moolenaar" Highlight lines with only whitespace (only in blank delimited here documents) as errors
202071d4279SBram Moolenaarsyn match  perlNotEmptyLine	"^\s\+$" contained
203543b7ef7SBram Moolenaar" Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
204543b7ef7SBram Moolenaarsyn match perlElseIfError	"else\_s*if" containedin=perlConditional
205543b7ef7SBram Moolenaarsyn keyword perlElseIfError	elseif containedin=perlConditional
206071d4279SBram Moolenaar
207071d4279SBram Moolenaar" Variable interpolation
208071d4279SBram Moolenaar"
209071d4279SBram Moolenaar" These items are interpolated inside "" strings and similar constructs.
210dd2a3cdaSBram Moolenaarsyn cluster perlInterpDQ	contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
211071d4279SBram Moolenaar" These items are interpolated inside '' strings and similar constructs.
21200a927d6SBram Moolenaarsyn cluster perlInterpSQ	contains=perlSpecialStringU,perlSpecialStringU2
213071d4279SBram Moolenaar" These items are interpolated inside m// matches and s/// substitutions.
21400a927d6SBram Moolenaarsyn cluster perlInterpSlash	contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
215071d4279SBram Moolenaar" These items are interpolated inside m## matches and s### substitutions.
216dd2a3cdaSBram Moolenaarsyn cluster perlInterpMatch	contains=@perlInterpSlash,perlVarSlash
217071d4279SBram Moolenaar
218071d4279SBram Moolenaar" Shell commands
21900a927d6SBram Moolenaarsyn region  perlShellCommand	matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
220071d4279SBram Moolenaar
221071d4279SBram Moolenaar" Constants
222071d4279SBram Moolenaar"
223071d4279SBram Moolenaar" Numbers
22400a927d6SBram Moolenaarsyn match  perlNumber	"\<\%(0\%(x\x[[:xdigit:]_]*\|b[01][01_]*\|\o[0-7_]*\|\)\|[1-9][[:digit:]_]*\)\>"
22500a927d6SBram Moolenaarsyn match  perlFloat	"\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
22600a927d6SBram Moolenaarsyn match  perlFloat	"\<\d[[:digit:]_]*\.[[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
227e2db695dSBram Moolenaarsyn match  perlFloat    "\.[[:digit:]][[:digit:]_]*\%([eE][\-+]\=\d\+\)\="
22800a927d6SBram Moolenaar
22900a927d6SBram Moolenaarsyn match  perlString	"\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
23000a927d6SBram Moolenaarsyn match  perlVStringV	"\<v" contained
23100a927d6SBram Moolenaar
23200a927d6SBram Moolenaar
233543b7ef7SBram Moolenaarsyn region perlParensSQ		start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
234543b7ef7SBram Moolenaarsyn region perlBracketsSQ	start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
235543b7ef7SBram Moolenaarsyn region perlBracesSQ		start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
236543b7ef7SBram Moolenaarsyn region perlAnglesSQ		start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
23700a927d6SBram Moolenaar
238543b7ef7SBram Moolenaarsyn region perlParensDQ		start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
239543b7ef7SBram Moolenaarsyn region perlBracketsDQ	start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
240543b7ef7SBram Moolenaarsyn region perlBracesDQ		start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
241543b7ef7SBram Moolenaarsyn region perlAnglesDQ		start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
242071d4279SBram Moolenaar
243071d4279SBram Moolenaar
244071d4279SBram Moolenaar" Simple version of searches and matches
24537c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
24637c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
24737c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'[msixpodualgcn]*+ contains=@perlInterpSQ keepend extend
24837c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash keepend extend
24937c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)[msixpodualgcn]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
25037c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}[msixpodualgcn]*+ contains=@perlInterpMatch,perlBracesDQ extend
25137c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>[msixpodualgcn]*+ contains=@perlInterpMatch,perlAnglesDQ keepend extend
25237c64c78SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\][msixpodualgcn]*+ contains=@perlInterpMatch,perlBracketsDQ keepend extend
253071d4279SBram Moolenaar
254071d4279SBram Moolenaar" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
255071d4279SBram Moolenaar" cases as the / is used in so many other ways, but these should be the most obvious ones.
25637c64c78SBram Moolenaarsyn 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=+/[msixpodualgcn]*+ contains=@perlInterpSlash extend
257071d4279SBram Moolenaar
258071d4279SBram Moolenaar
259071d4279SBram Moolenaar" Substitutions
260071d4279SBram Moolenaar" perlMatch is the first part, perlSubstitution* is the substitution part
261e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
262e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
263e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
264e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
265e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
266e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
267e2db695dSBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
268543b7ef7SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
26937c64c78SBram Moolenaarsyn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1[msixpodualgcern]*+ keepend contained contains=@perlInterpDQ extend
27037c64c78SBram Moolenaarsyn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+(+ end=+)[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlParensDQ keepend extend
27137c64c78SBram Moolenaarsyn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+\[+ end=+\][msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend
27237c64c78SBram Moolenaarsyn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+{+ end=+}[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend
27337c64c78SBram Moolenaarsyn region perlSubstitutionGQQ		matchgroup=perlMatchStartEnd start=+<+ end=+>[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend
27437c64c78SBram Moolenaarsyn region perlSubstitutionSQ		matchgroup=perlMatchStartEnd start=+'+  end=+'[msixpodualgcern]*+ contained contains=@perlInterpSQ keepend extend
275071d4279SBram Moolenaar
27600a927d6SBram Moolenaar" Translations
277071d4279SBram Moolenaar" perlMatch is the first part, perlTranslation* is the second, translator part.
27800a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
27900a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
28000a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
28100a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
28200a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
28300a927d6SBram Moolenaarsyn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
284543b7ef7SBram Moolenaarsyn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1[cdsr]*+ contained
285543b7ef7SBram Moolenaarsyn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+(+ end=+)[cdsr]*+ contains=perlParensSQ contained
286543b7ef7SBram Moolenaarsyn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+\[+ end=+\][cdsr]*+ contains=perlBracketsSQ contained
287543b7ef7SBram Moolenaarsyn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+{+ end=+}[cdsr]*+ contains=perlBracesSQ contained
288543b7ef7SBram Moolenaarsyn region perlTranslationGQ		matchgroup=perlMatchStartEnd start=+<+ end=+>[cdsr]*+ contains=perlAnglesSQ contained
289071d4279SBram Moolenaar
290071d4279SBram Moolenaar
291071d4279SBram Moolenaar" Strings and q, qq, qw and qr expressions
292071d4279SBram Moolenaar
293543b7ef7SBram Moolenaarsyn region perlStringUnexpanded	matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
294543b7ef7SBram Moolenaarsyn region perlString		matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ keepend extend
295543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
296543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
297543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
298543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
299543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
300543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
301071d4279SBram Moolenaar
302543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
303543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
304543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
305543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
306543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
307543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
30800a927d6SBram Moolenaar
309543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+  end=+\z1+ contains=@perlInterpSQ keepend extend
310543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+  end=+#+ contains=@perlInterpSQ keepend extend
311543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+  end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
312543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+  end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
313543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+  end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
314543b7ef7SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+  end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
31500a927d6SBram Moolenaar
31637c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+  end=+\z1[imosxdual]*+ contains=@perlInterpMatch keepend extend
31737c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+  end=+/[imosxdual]*+ contains=@perlInterpSlash keepend extend
31837c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+  end=+#[imosxdual]*+ contains=@perlInterpMatch keepend extend
31937c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+  end=+'[imosxdual]*+ contains=@perlInterpSQ keepend extend
32037c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+  end=+)[imosxdual]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
32100a927d6SBram Moolenaar
32200a927d6SBram Moolenaar" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
32337c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+  end=+}[imosxdual]*+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend
32437c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+  end=+>[imosxdual]*+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend
32537c64c78SBram Moolenaarsyn region perlQQ		matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+  end=+\][imosxdual]*+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend
326071d4279SBram Moolenaar
327071d4279SBram Moolenaar" Constructs such as print <<EOF [...] EOF, 'here' documents
328071d4279SBram Moolenaar"
329071d4279SBram Moolenaar" XXX Any statements after the identifier are in perlString colour (i.e.
33000a927d6SBram Moolenaar" 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
33100a927d6SBram Moolenaar" seems due to the 'auto-extending nature' of regions.
33237c64c78SBram Moolenaarsyn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+  end=+$+     contains=@perlTop oneline
33337c64c78SBram Moolenaarsyn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+$+ contains=@perlTop oneline
33437c64c78SBram Moolenaarsyn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+$+ contains=@perlTop oneline
33537c64c78SBram Moolenaarsyn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*""+       end=+$+     contains=@perlTop oneline
33637c64c78SBram Moolenaarsyn region perlHereDocStart	matchgroup=perlStringStartEnd start=+<<\s*''+       end=+$+     contains=@perlTop oneline
337071d4279SBram Moolenaarif exists("perl_fold")
33837c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd      end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
33937c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
34037c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
34137c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*""+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
34237c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*''+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
343543b7ef7SBram Moolenaar  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL fold extend
344071d4279SBram Moolenaarelse
34537c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd      end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
34637c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
34737c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
34837c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*""+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
34937c64c78SBram Moolenaar  syn region perlHereDoc	start=+<<\s*''+ matchgroup=perlStringStartEnd           end=+^$+    contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
35000a927d6SBram Moolenaar  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
351071d4279SBram Moolenaarendif
352071d4279SBram Moolenaar
353071d4279SBram Moolenaar
354071d4279SBram Moolenaar" Class declarations
355071d4279SBram Moolenaar"
35600a927d6SBram Moolenaarsyn match   perlPackageDecl		"\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
357071d4279SBram Moolenaarsyn keyword perlStatementPackage	package contained
358071d4279SBram Moolenaar
359071d4279SBram Moolenaar" Functions
360071d4279SBram Moolenaar"       sub [name] [(prototype)] {
361071d4279SBram Moolenaar"
36200a927d6SBram Moolenaarsyn match perlSubError "[^[:space:];{#]" contained
36300a927d6SBram Moolenaarsyn match perlSubAttributesCont "\h\w*\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained
36400a927d6SBram Moolenaarsyn region perlSubAttributesCont matchgroup=perlSubAttributesCont start="\h\w*(" end=")\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained contains=@perlInterpSQ,perlParensSQ
365543b7ef7SBram Moolenaarsyn cluster perlSubAttrMaybe contains=perlSubAttributesCont,perlSubError,perlFakeGroup
36600a927d6SBram Moolenaarsyn match perlSubAttributes "" contained nextgroup=perlSubError
36700a927d6SBram Moolenaarsyn match perlSubAttributes ":\_s*" contained nextgroup=@perlSubAttrMaybe
36837c64c78SBram Moolenaarif get(g:, "perl_sub_signatures", 0)
36937c64c78SBram Moolenaar    syn match perlSignature +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained
37037c64c78SBram Moolenaarelse
37100a927d6SBram Moolenaar    syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained
37237c64c78SBram Moolenaar    syn match perlSubPrototype +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError
37337c64c78SBram Moolenaarendif
37437c64c78SBram Moolenaar
37537c64c78SBram Moolenaarsyn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlSignature,perlSubAttributes,perlComment
376071d4279SBram Moolenaar
37700a927d6SBram Moolenaarsyn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName
37800a927d6SBram Moolenaar
37900a927d6SBram Moolenaar" The => operator forces a bareword to the left of it to be interpreted as
38000a927d6SBram Moolenaar" a string
38100a927d6SBram Moolenaarsyn match  perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
38200a927d6SBram Moolenaar
383071d4279SBram Moolenaar" All other # are comments, except ^#!
384543b7ef7SBram Moolenaarsyn match  perlComment		"#.*" contains=perlTodo,@Spell extend
385071d4279SBram Moolenaarsyn match  perlSharpBang	"^#!.*"
386071d4279SBram Moolenaar
387071d4279SBram Moolenaar" Formats
388dd2a3cdaSBram Moolenaarsyn region perlFormat		matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
389071d4279SBram Moolenaarsyn match  perlFormatName	"format\s\+\k\+\s*="lc=7,me=e-1 contained
39000a927d6SBram Moolenaarsyn match  perlFormatField	"[@^][|<>~]\+\%(\.\.\.\)\=" contained
391071d4279SBram Moolenaarsyn match  perlFormatField	"[@^]#[#.]*" contained
392071d4279SBram Moolenaarsyn match  perlFormatField	"@\*" contained
393071d4279SBram Moolenaarsyn match  perlFormatField	"@[^A-Za-z_|<>~#*]"me=e-1 contained
394071d4279SBram Moolenaarsyn match  perlFormatField	"@$" contained
395071d4279SBram Moolenaar
396071d4279SBram Moolenaar" __END__ and __DATA__ clauses
397071d4279SBram Moolenaarif exists("perl_fold")
39837c64c78SBram Moolenaar  syntax region perlDATA		start="^__DATA__$" skip="." end="." contains=@perlDATA fold
399543b7ef7SBram Moolenaar  syntax region perlDATA		start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA fold
400071d4279SBram Moolenaarelse
40137c64c78SBram Moolenaar  syntax region perlDATA		start="^__DATA__$" skip="." end="." contains=@perlDATA
402543b7ef7SBram Moolenaar  syntax region perlDATA		start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA
403071d4279SBram Moolenaarendif
404071d4279SBram Moolenaar
405f354981dSBram Moolenaar"
406f354981dSBram Moolenaar" Folding
407f354981dSBram Moolenaar
408f354981dSBram Moolenaarif exists("perl_fold")
409f354981dSBram Moolenaar  " Note: this bit must come before the actual highlighting of the "package"
410f354981dSBram Moolenaar  " keyword, otherwise this will screw up Pod lines that match /^package/
411f354981dSBram Moolenaar  if !exists("perl_nofold_packages")
412f354981dSBram Moolenaar    syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
413f354981dSBram Moolenaar  endif
414f354981dSBram Moolenaar  if !exists("perl_nofold_subs")
41537c64c78SBram Moolenaar    if get(g:, "perl_fold_anonymous_subs", 0)
41637c64c78SBram Moolenaar      syn region perlSubFold start="\<sub\>[^{]*{" end="}" transparent fold keepend extend
417543b7ef7SBram Moolenaar      syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\)\>\s*{" end="}" transparent fold keepend
418543b7ef7SBram Moolenaar    else
419f354981dSBram Moolenaar      syn region perlSubFold     start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\%(#.*\)\=$" transparent fold keepend
420f354981dSBram Moolenaar      syn region perlSubFold start="^\z(\s*\)\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
421f354981dSBram Moolenaar    endif
422543b7ef7SBram Moolenaar  endif
423f354981dSBram Moolenaar
424f354981dSBram Moolenaar  if exists("perl_fold_blocks")
42537c64c78SBram Moolenaar    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
426f354981dSBram Moolenaar    syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
427f354981dSBram Moolenaar  endif
428f354981dSBram Moolenaar
429f354981dSBram Moolenaar  setlocal foldmethod=syntax
430f354981dSBram Moolenaar  syn sync fromstart
431f354981dSBram Moolenaarelse
432f354981dSBram Moolenaar  " fromstart above seems to set minlines even if perl_fold is not set.
433f354981dSBram Moolenaar  syn sync minlines=0
434f354981dSBram Moolenaarendif
435f354981dSBram Moolenaar
436543b7ef7SBram Moolenaar" NOTE: If you're linking new highlight groups to perlString, please also put
437543b7ef7SBram Moolenaar"       them into b:match_skip in ftplugin/perl.vim.
438543b7ef7SBram Moolenaar
439071d4279SBram Moolenaar" The default highlighting.
440f37506f6SBram Moolenaarhi def link perlSharpBang		PreProc
441f37506f6SBram Moolenaarhi def link perlControl		PreProc
442f37506f6SBram Moolenaarhi def link perlInclude		Include
443f37506f6SBram Moolenaarhi def link perlSpecial		Special
444f37506f6SBram Moolenaarhi def link perlString		String
445f37506f6SBram Moolenaarhi def link perlCharacter		Character
446f37506f6SBram Moolenaarhi def link perlNumber		Number
447f37506f6SBram Moolenaarhi def link perlFloat		Float
448f37506f6SBram Moolenaarhi def link perlType			Type
449f37506f6SBram Moolenaarhi def link perlIdentifier		Identifier
450f37506f6SBram Moolenaarhi def link perlLabel		Label
451f37506f6SBram Moolenaarhi def link perlStatement		Statement
452f37506f6SBram Moolenaarhi def link perlConditional		Conditional
453f37506f6SBram Moolenaarhi def link perlRepeat		Repeat
454f37506f6SBram Moolenaarhi def link perlOperator		Operator
455f37506f6SBram Moolenaarhi def link perlFunction		Keyword
456f37506f6SBram Moolenaarhi def link perlSubName		Function
457f37506f6SBram Moolenaarhi def link perlSubPrototype		Type
45837c64c78SBram Moolenaarhi def link perlSignature		Type
459f37506f6SBram Moolenaarhi def link perlSubAttributes	PreProc
460f37506f6SBram Moolenaarhi def link perlSubAttributesCont	perlSubAttributes
461f37506f6SBram Moolenaarhi def link perlComment		Comment
462f37506f6SBram Moolenaarhi def link perlTodo			Todo
463071d4279SBram Moolenaarif exists("perl_string_as_statement")
464f37506f6SBram Moolenaar  hi def link perlStringStartEnd	perlStatement
465071d4279SBram Moolenaarelse
466f37506f6SBram Moolenaar  hi def link perlStringStartEnd	perlString
467071d4279SBram Moolenaarendif
468f37506f6SBram Moolenaarhi def link perlVStringV		perlStringStartEnd
469f37506f6SBram Moolenaarhi def link perlList			perlStatement
470f37506f6SBram Moolenaarhi def link perlMisc			perlStatement
471f37506f6SBram Moolenaarhi def link perlVarPlain		perlIdentifier
472f37506f6SBram Moolenaarhi def link perlVarPlain2		perlIdentifier
473f37506f6SBram Moolenaarhi def link perlArrow		perlIdentifier
474f37506f6SBram Moolenaarhi def link perlFiledescRead		perlIdentifier
475f37506f6SBram Moolenaarhi def link perlFiledescStatement	perlIdentifier
476f37506f6SBram Moolenaarhi def link perlVarSimpleMember	perlIdentifier
477f37506f6SBram Moolenaarhi def link perlVarSimpleMemberName 	perlString
478f37506f6SBram Moolenaarhi def link perlVarNotInMatches	perlIdentifier
479f37506f6SBram Moolenaarhi def link perlVarSlash		perlIdentifier
480f37506f6SBram Moolenaarhi def link perlQQ			perlString
481f37506f6SBram Moolenaarhi def link perlHereDoc		perlString
482f37506f6SBram Moolenaarhi def link perlStringUnexpanded	perlString
483f37506f6SBram Moolenaarhi def link perlSubstitutionSQ	perlString
484f37506f6SBram Moolenaarhi def link perlSubstitutionGQQ	perlString
485f37506f6SBram Moolenaarhi def link perlTranslationGQ	perlString
486f37506f6SBram Moolenaarhi def link perlMatch		perlString
487f37506f6SBram Moolenaarhi def link perlMatchStartEnd	perlStatement
488f37506f6SBram Moolenaarhi def link perlFormatName		perlIdentifier
489f37506f6SBram Moolenaarhi def link perlFormatField		perlString
490f37506f6SBram Moolenaarhi def link perlPackageDecl		perlType
491f37506f6SBram Moolenaarhi def link perlStorageClass		perlType
492f37506f6SBram Moolenaarhi def link perlPackageRef		perlType
493f37506f6SBram Moolenaarhi def link perlStatementPackage	perlStatement
494f37506f6SBram Moolenaarhi def link perlStatementStorage	perlStatement
495f37506f6SBram Moolenaarhi def link perlStatementControl	perlStatement
496f37506f6SBram Moolenaarhi def link perlStatementScalar	perlStatement
497f37506f6SBram Moolenaarhi def link perlStatementRegexp	perlStatement
498f37506f6SBram Moolenaarhi def link perlStatementNumeric	perlStatement
499f37506f6SBram Moolenaarhi def link perlStatementList	perlStatement
500f37506f6SBram Moolenaarhi def link perlStatementHash	perlStatement
501f37506f6SBram Moolenaarhi def link perlStatementIOfunc	perlStatement
502f37506f6SBram Moolenaarhi def link perlStatementFiledesc	perlStatement
503f37506f6SBram Moolenaarhi def link perlStatementVector	perlStatement
504f37506f6SBram Moolenaarhi def link perlStatementFiles	perlStatement
505f37506f6SBram Moolenaarhi def link perlStatementFlow	perlStatement
506f37506f6SBram Moolenaarhi def link perlStatementInclude	perlStatement
507f37506f6SBram Moolenaarhi def link perlStatementProc	perlStatement
508f37506f6SBram Moolenaarhi def link perlStatementSocket	perlStatement
509f37506f6SBram Moolenaarhi def link perlStatementIPC		perlStatement
510f37506f6SBram Moolenaarhi def link perlStatementNetwork	perlStatement
511f37506f6SBram Moolenaarhi def link perlStatementPword	perlStatement
512f37506f6SBram Moolenaarhi def link perlStatementTime	perlStatement
513f37506f6SBram Moolenaarhi def link perlStatementMisc	perlStatement
514f37506f6SBram Moolenaarhi def link perlStatementIndirObj	perlStatement
515f37506f6SBram Moolenaarhi def link perlFunctionName		perlIdentifier
516f37506f6SBram Moolenaarhi def link perlMethod		perlIdentifier
51737c64c78SBram Moolenaarhi def link perlPostDeref		perlIdentifier
518f37506f6SBram Moolenaarhi def link perlFunctionPRef		perlType
51937c64c78SBram Moolenaarif !get(g:, 'perl_include_pod', 1)
520f37506f6SBram Moolenaar  hi def link perlPOD		perlComment
52137c64c78SBram Moolenaarendif
522f37506f6SBram Moolenaarhi def link perlShellCommand		perlString
523f37506f6SBram Moolenaarhi def link perlSpecialAscii		perlSpecial
524f37506f6SBram Moolenaarhi def link perlSpecialDollar	perlSpecial
525f37506f6SBram Moolenaarhi def link perlSpecialString	perlSpecial
526f37506f6SBram Moolenaarhi def link perlSpecialStringU	perlSpecial
527f37506f6SBram Moolenaarhi def link perlSpecialMatch		perlSpecial
528f37506f6SBram Moolenaarhi def link perlDATA			perlComment
529071d4279SBram Moolenaar
530543b7ef7SBram Moolenaar" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
531543b7ef7SBram Moolenaar"       I had to remove the transparent property from the following regions
532543b7ef7SBram Moolenaar"       in order to get them to highlight correctly.  Feel free to remove
533543b7ef7SBram Moolenaar"       these and reinstate the transparent property if you know how.
534f37506f6SBram Moolenaarhi def link perlParensSQ		perlString
535f37506f6SBram Moolenaarhi def link perlBracketsSQ		perlString
536f37506f6SBram Moolenaarhi def link perlBracesSQ		perlString
537f37506f6SBram Moolenaarhi def link perlAnglesSQ		perlString
538543b7ef7SBram Moolenaar
539f37506f6SBram Moolenaarhi def link perlParensDQ		perlString
540f37506f6SBram Moolenaarhi def link perlBracketsDQ		perlString
541f37506f6SBram Moolenaarhi def link perlBracesDQ		perlString
542f37506f6SBram Moolenaarhi def link perlAnglesDQ		perlString
543543b7ef7SBram Moolenaar
544f37506f6SBram Moolenaarhi def link perlSpecialStringU2	perlString
545543b7ef7SBram Moolenaar
546071d4279SBram Moolenaar" Possible errors
547f37506f6SBram Moolenaarhi def link perlNotEmptyLine		Error
548f37506f6SBram Moolenaarhi def link perlElseIfError		Error
549f37506f6SBram Moolenaarhi def link perlSubPrototypeError	Error
550f37506f6SBram Moolenaarhi def link perlSubError		Error
551071d4279SBram Moolenaar
552071d4279SBram Moolenaar" Syncing to speed up processing
553071d4279SBram Moolenaar"
554071d4279SBram Moolenaarif !exists("perl_no_sync_on_sub")
555071d4279SBram Moolenaar  syn sync match perlSync	grouphere NONE "^\s*\<package\s"
55600a927d6SBram Moolenaar  syn sync match perlSync	grouphere NONE "^\s*\<sub\>"
557071d4279SBram Moolenaar  syn sync match perlSync	grouphere NONE "^}"
558071d4279SBram Moolenaarendif
559071d4279SBram Moolenaar
560071d4279SBram Moolenaarif !exists("perl_no_sync_on_global_var")
561071d4279SBram Moolenaar  syn sync match perlSync	grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
562071d4279SBram Moolenaar  syn sync match perlSync	grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
563071d4279SBram Moolenaarendif
564071d4279SBram Moolenaar
565071d4279SBram Moolenaarif exists("perl_sync_dist")
566071d4279SBram Moolenaar  execute "syn sync maxlines=" . perl_sync_dist
567071d4279SBram Moolenaarelse
568071d4279SBram Moolenaar  syn sync maxlines=100
569071d4279SBram Moolenaarendif
570071d4279SBram Moolenaar
571071d4279SBram Moolenaarsyn sync match perlSyncPOD	grouphere perlPOD "^=pod"
572071d4279SBram Moolenaarsyn sync match perlSyncPOD	grouphere perlPOD "^=head"
573071d4279SBram Moolenaarsyn sync match perlSyncPOD	grouphere perlPOD "^=item"
574071d4279SBram Moolenaarsyn sync match perlSyncPOD	grouphere NONE "^=cut"
575071d4279SBram Moolenaar
576071d4279SBram Moolenaarlet b:current_syntax = "perl"
577071d4279SBram Moolenaar
578543b7ef7SBram Moolenaarlet &cpo = s:cpo_save
579543b7ef7SBram Moolenaarunlet s:cpo_save
580543b7ef7SBram Moolenaar
58100a927d6SBram Moolenaar" XXX Change to sts=4:sw=4
58200a927d6SBram Moolenaar" vim:ts=8:sts=2:sw=2:expandtab:ft=vim
583