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