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