xref: /vim-8.2.3635/runtime/syntax/perl.vim (revision d5cdbeb8)
1" Vim syntax file
2" Language:	Perl
3" Maintainer:	Nick Hibma <[email protected]>
4" Last Change:	2005 Oct 06
5" Location:	http://www.van-laarhoven.org/vim/syntax/perl.vim
6"
7" Please download most recent version first before mailing
8" any comments.
9" See also the file perl.vim.regression.pl to check whether your
10" modifications work in the most odd cases
11" http://www.van-laarhoven.org/vim/syntax/perl.vim.regression.pl
12"
13" Original version: Sonia Heimann <[email protected]>
14" Thanks to many people for their contribution.
15
16" The following parameters are available for tuning the
17" perl syntax highlighting, with defaults given:
18"
19" unlet perl_include_pod
20" unlet perl_no_scope_in_variables
21" unlet perl_no_extended_vars
22" unlet perl_string_as_statement
23" unlet perl_no_sync_on_sub
24" unlet perl_no_sync_on_global_var
25" let perl_sync_dist = 100
26" unlet perl_fold
27" unlet perl_fold_blocks
28
29" Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file
30" was already loaded (6.x).
31if version < 600
32  syntax clear
33elseif exists("b:current_syntax")
34  finish
35endif
36
37" Unset perl_fold if it set but vim doesn't support it.
38if version < 600 && exists("perl_fold")
39  unlet perl_fold
40endif
41
42
43" POD starts with ^=<word> and ends with ^=cut
44
45if exists("perl_include_pod")
46  " Include a while extra syntax file
47  syn include @Pod syntax/pod.vim
48  unlet b:current_syntax
49  if exists("perl_fold")
50    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend fold
51    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold
52  else
53    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend
54    syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
55  endif
56else
57  " Use only the bare minimum of rules
58  if exists("perl_fold")
59    syn region perlPOD start="^=[a-z]" end="^=cut" fold
60  else
61    syn region perlPOD start="^=[a-z]" end="^=cut"
62  endif
63endif
64
65
66" All keywords
67"
68if exists("perl_fold") && exists("perl_fold_blocks")
69  syn match perlConditional		"\<if\>"
70  syn match perlConditional		"\<elsif\>"
71  syn match perlConditional		"\<unless\>"
72  syn match perlConditional		"\<else\>" nextgroup=perlElseIfError skipwhite skipnl skipempty
73else
74  syn keyword perlConditional		if elsif unless
75  syn keyword perlConditional		else nextgroup=perlElseIfError skipwhite skipnl skipempty
76endif
77syn keyword perlConditional		switch eq ne gt lt ge le cmp not and or xor err
78if exists("perl_fold") && exists("perl_fold_blocks")
79  syn match perlRepeat			"\<while\>"
80  syn match perlRepeat			"\<for\>"
81  syn match perlRepeat			"\<foreach\>"
82  syn match perlRepeat			"\<do\>"
83  syn match perlRepeat			"\<until\>"
84  syn match perlRepeat			"\<continue\>"
85else
86  syn keyword perlRepeat		while for foreach do until continue
87endif
88syn keyword perlOperator		defined undef and or not bless ref
89if exists("perl_fold")
90  " if BEGIN/END would be a keyword the perlBEGINENDFold does not work
91  syn match perlControl			"\<BEGIN\|CHECK\|INIT\|END\>" contained
92else
93  syn keyword perlControl		BEGIN END CHECK INIT
94endif
95
96syn keyword perlStatementStorage	my local our
97syn keyword perlStatementControl	goto return last next redo
98syn keyword perlStatementScalar		chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst
99syn keyword perlStatementRegexp		pos quotemeta split study
100syn keyword perlStatementNumeric	abs atan2 cos exp hex int log oct rand sin sqrt srand
101syn keyword perlStatementList		splice unshift shift push pop split join reverse grep map sort unpack
102syn keyword perlStatementHash		each exists keys values tie tied untie
103syn keyword perlStatementIOfunc		carp confess croak dbmclose dbmopen die syscall
104syn keyword perlStatementFiledesc	binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite
105syn keyword perlStatementFiledesc	fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite
106syn keyword perlStatementVector		pack vec
107syn keyword perlStatementFiles		chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime
108syn match   perlStatementFiles		"-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
109syn keyword perlStatementFlow		caller die dump eval exit wantarray
110syn keyword perlStatementInclude	require
111syn match   perlStatementInclude	"\(use\|no\)\s\+\(integer\>\|strict\>\|lib\>\|sigtrap\>\|subs\>\|vars\>\|warnings\>\|utf8\>\|byte\>\)\="
112syn keyword perlStatementScope		import
113syn keyword perlStatementProc		alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid
114syn keyword perlStatementSocket		accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
115syn keyword perlStatementIPC		msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
116syn keyword perlStatementNetwork	endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
117syn keyword perlStatementPword		getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent
118syn keyword perlStatementTime		gmtime localtime time times
119
120syn keyword perlStatementMisc		warn formline reset scalar delete prototype lock
121syn keyword perlStatementNew		new
122
123syn keyword perlTodo			TODO TBD FIXME XXX contained
124
125" Perl Identifiers.
126"
127" Should be cleaned up to better handle identifiers in particular situations
128" (in hash keys for example)
129"
130" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
131" We do not process complex things such as @{${"foo"}}. Too complicated, and
132" too slow. And what is after the -> is *not* considered as part of the
133" variable - there again, too complicated and too slow.
134
135" Special variables first ($^A, ...) and ($|, $', ...)
136syn match  perlVarPlain		 "$^[ADEFHILMOPSTWX]\="
137syn match  perlVarPlain		 "$[\\\"\[\]'&`+*.,;=%~!?@$<>(-]"
138syn match  perlVarPlain		 "$\(0\|[1-9][0-9]*\)"
139" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
140syn match  perlVarPlain		 "$:[^:]"
141" These variables are not recognized within matches.
142syn match  perlVarNotInMatches	 "$[|)]"
143" This variable is not recognized within matches delimited by m//.
144syn match  perlVarSlash		 "$/"
145
146" And plain identifiers
147syn match  perlPackageRef	 "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
148
149" FIXME value between {} should be marked as string. is treated as such by Perl.
150" At the moment it is marked as something greyish instead of read. Probably todo
151" with transparency. Or maybe we should handle the bare word in that case. or make it into
152
153if !exists("perl_no_scope_in_variables")
154  syn match  perlVarPlain	"\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
155  syn match  perlFunctionName	"\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
156else
157  syn match  perlVarPlain	"\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
158  syn match  perlFunctionName	"\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
159endif
160
161if !exists("perl_no_extended_vars")
162  syn cluster perlExpr		contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
163  syn region perlVarBlock	matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
164  syn region perlVarBlock	matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
165  syn match  perlVarPlain	"\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
166  syn region perlVarMember	matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
167  syn match  perlVarSimpleMember	"\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
168  syn match  perlVarSimpleMemberName	"\I\i*" contained
169  syn region perlVarMember	matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
170  syn match  perlMethod		"\(->\)\I\i*" contained
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	"\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
183syn match  perlSpecialStringU	"\\['\\]" contained
184syn match  perlSpecialMatch	"{\d\+\(,\(\d\+\)\=\)\=}" contained
185syn match  perlSpecialMatch	"\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
186syn match  perlSpecialMatch	"[+*()?.]" contained
187syn match  perlSpecialMatch	"(?[#:=!]" contained
188syn match  perlSpecialMatch	"(?[imsx]\+)" contained
189" FIXME the line below does not work. It should mark end of line and
190" begin of line as perlSpecial.
191" syn match perlSpecialBEOM    "^\^\|\$$" contained
192
193" Possible errors
194"
195" Highlight lines with only whitespace (only in blank delimited here documents) as errors
196syn match  perlNotEmptyLine	"^\s\+$" contained
197" Highlight '} else if (...) {', it should be '} else { if (...) { ' or
198" '} elsif (...) {'.
199"syn keyword perlElseIfError	if contained
200
201" Variable interpolation
202"
203" These items are interpolated inside "" strings and similar constructs.
204syn cluster perlInterpDQ	contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
205" These items are interpolated inside '' strings and similar constructs.
206syn cluster perlInterpSQ	contains=perlSpecialStringU
207" These items are interpolated inside m// matches and s/// substitutions.
208syn cluster perlInterpSlash	contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
209" These items are interpolated inside m## matches and s### substitutions.
210syn cluster perlInterpMatch	contains=@perlInterpSlash,perlVarSlash
211
212" Shell commands
213syn region  perlShellCommand	matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
214
215" Constants
216"
217" Numbers
218syn match  perlNumber	"[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
219syn match  perlFloat	"[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
220syn match  perlFloat	"[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
221syn match  perlFloat	"[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\="
222
223
224" Simple version of searches and matches
225" caters for m//, m##, m{} and m[] (and the !/ variant)
226syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
227syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
228syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
229syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch
230
231" A special case for m!!x which allows for comments and extra whitespace in the pattern
232syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment
233
234" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
235" cases as the / is used in so many other ways, but these should be the most obvious ones.
236"syn region perlMatch	matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^if /+lc=2 start=+[^$@%]if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
237syn region perlMatch	matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^while /+lc=5 start=+[^$@%]while /+lc=6 start=+^if /+lc=2 start=+[^$@%]if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
238
239
240" Substitutions
241" caters for s///, s### and s[][]
242" perlMatch is the first part, perlSubstitution* is the substitution part
243syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
244syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s"+  end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
245syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
246syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
247syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
248syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
249syn region perlSubstitutionSQ		matchgroup=perlMatchStartEnd start=+'+  end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
250syn region perlSubstitutionDQ		matchgroup=perlMatchStartEnd start=+"+  end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
251syn region perlSubstitutionSlash	matchgroup=perlMatchStartEnd start=+/+  end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
252syn region perlSubstitutionHash		matchgroup=perlMatchStartEnd start=+#+  end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
253syn region perlSubstitutionBracket	matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
254syn region perlSubstitutionCurly	matchgroup=perlMatchStartEnd start=+{+  end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
255
256" A special case for m!!x which allows for comments and extra whitespace in the pattern
257syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
258syn region perlSubstitutionPling	matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
259
260" Substitutions
261" caters for tr///, tr### and tr[][]
262" perlMatch is the first part, perlTranslation* is the second, translator part.
263syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
264syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
265syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
266syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
267syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
268syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
269syn region perlTranslationSQ		matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
270syn region perlTranslationDQ		matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
271syn region perlTranslationSlash		matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
272syn region perlTranslationHash		matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
273syn region perlTranslationBracket	matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
274syn region perlTranslationCurly		matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
275
276
277" The => operator forces a bareword to the left of it to be interpreted as
278" a string
279syn match  perlString "\<\I\i*\s*=>"me=e-2
280
281" Strings and q, qq, qw and qr expressions
282
283" Brackets in qq()
284syn region perlBrackets	start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
285
286syn region perlStringUnexpanded	matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
287syn region perlString		matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ
288syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
289syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
290syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
291syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
292syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
293syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
294syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
295syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
296syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
297syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
298syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw#+  end=+#+ contains=@perlInterpSQ
299syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw|+  end=+|+ contains=@perlInterpSQ
300syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw(+  end=+)+ contains=@perlInterpSQ,perlBrackets
301syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw{+  end=+}+ contains=@perlInterpSQ
302syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw/+  end=+/+ contains=@perlInterpSQ
303syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr#+  end=+#[imosx]*+ contains=@perlInterpMatch
304syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr|+  end=+|[imosx]*+ contains=@perlInterpMatch
305syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr(+  end=+)[imosx]*+ contains=@perlInterpMatch
306syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr{+  end=+}[imosx]*+ contains=@perlInterpMatch
307syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr/+  end=+/[imosx]*+ contains=@perlInterpSlash
308
309" Constructs such as print <<EOF [...] EOF, 'here' documents
310"
311if version >= 600
312  " XXX Any statements after the identifier are in perlString colour (i.e.
313  " 'if $a' in 'print <<EOF if $a').
314  if exists("perl_fold")
315    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+    end=+^\z1$+ contains=@perlInterpDQ fold
316    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
317    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
318    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*""+         end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine fold
319    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*''+         end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine fold
320    syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
321  else
322    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+    end=+^\z1$+ contains=@perlInterpDQ
323    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
324    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
325    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*""+         end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine
326    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*''+         end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine
327    syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
328  endif
329else
330  syn match perlUntilEOFStart	"<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
331  syn match perlUntilEOFStart	"<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
332  syn match perlUntilEOFStart	"<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
333  syn match perlUntilEOFStart	"<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
334  syn match perlUntilEOFStart	"<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
335  syn region perlUntilEOFDQ	matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
336  syn region perlUntilEOFSQ	matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
337  syn region perlUntilEmptySQ	matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
338  syn region perlUntilEmptyDQ	matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
339  syn match perlHereIdentifier	"<<EOF"
340  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
341endif
342
343
344" Class declarations
345"
346syn match  perlPackageDecl	"^\s*\<package\s\+\S\+" contains=perlStatementPackage
347syn keyword perlStatementPackage	package contained
348
349" Functions
350"       sub [name] [(prototype)] {
351"
352syn region perlFunction		start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
353syn keyword perlStatementSub	sub contained
354
355syn match  perlFunctionPrototype	"([^)]*)" contained
356if !exists("perl_no_scope_in_variables")
357   syn match  perlFunctionPRef	"\h\w*::" contained
358   syn match  perlFunctionName	"\h\w*[^:]" contained
359else
360   syn match  perlFunctionName	"\h[[:alnum:]_:]*" contained
361endif
362
363
364" All other # are comments, except ^#!
365syn match  perlComment		"#.*" contains=perlTodo
366syn match  perlSharpBang	"^#!.*"
367
368" Formats
369syn region perlFormat		matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
370syn match  perlFormatName	"format\s\+\k\+\s*="lc=7,me=e-1 contained
371syn match  perlFormatField	"[@^][|<>~]\+\(\.\.\.\)\=" contained
372syn match  perlFormatField	"[@^]#[#.]*" contained
373syn match  perlFormatField	"@\*" contained
374syn match  perlFormatField	"@[^A-Za-z_|<>~#*]"me=e-1 contained
375syn match  perlFormatField	"@$" contained
376
377" __END__ and __DATA__ clauses
378if exists("perl_fold")
379  syntax region perlDATA		start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
380else
381  syntax region perlDATA		start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
382endif
383
384
385"
386" Folding
387
388if exists("perl_fold")
389  syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="\n\+package"me=s-1 transparent fold keepend
390  syn region perlSubFold     start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend
391  syn region perlBEGINENDFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
392
393  if exists("perl_fold_blocks")
394    syn region perlIfFold start="^\z(\s*\)\(if\|unless\|for\|while\|until\)\s*(.*)\s*{\s*$" start="^\z(\s*\)foreach\s*\(\(my\|our\)\=\s*\S\+\s*\)\=(.*)\s*{\s*$" end="^\z1}\s*;\=$" transparent fold keepend
395    syn region perlIfFold start="^\z(\s*\)do\s*{\s*$" end="^\z1}\s*while" end="^\z1}\s*;\=$" transparent fold keepend
396  endif
397
398  setlocal foldmethod=syntax
399  syn sync fromstart
400else
401  " fromstart above seems to set minlines even if perl_fold is not set.
402  syn sync minlines=0
403endif
404
405
406if version >= 508 || !exists("did_perl_syn_inits")
407  if version < 508
408    let did_perl_syn_inits = 1
409    command -nargs=+ HiLink hi link <args>
410  else
411    command -nargs=+ HiLink hi def link <args>
412  endif
413
414  " The default highlighting.
415  HiLink perlSharpBang		PreProc
416  HiLink perlControl		PreProc
417  HiLink perlInclude		Include
418  HiLink perlSpecial		Special
419  HiLink perlString		String
420  HiLink perlCharacter		Character
421  HiLink perlNumber		Number
422  HiLink perlFloat		Float
423  HiLink perlType		Type
424  HiLink perlIdentifier		Identifier
425  HiLink perlLabel		Label
426  HiLink perlStatement		Statement
427  HiLink perlConditional	Conditional
428  HiLink perlRepeat		Repeat
429  HiLink perlOperator		Operator
430  HiLink perlFunction		Function
431  HiLink perlFunctionPrototype	perlFunction
432  HiLink perlComment		Comment
433  HiLink perlTodo		Todo
434  if exists("perl_string_as_statement")
435    HiLink perlStringStartEnd	perlStatement
436  else
437    HiLink perlStringStartEnd	perlString
438  endif
439  HiLink perlList		perlStatement
440  HiLink perlMisc		perlStatement
441  HiLink perlVarPlain		perlIdentifier
442  HiLink perlFiledescRead	perlIdentifier
443  HiLink perlFiledescStatement	perlIdentifier
444  HiLink perlVarSimpleMember	perlIdentifier
445  HiLink perlVarSimpleMemberName perlString
446  HiLink perlVarNotInMatches	perlIdentifier
447  HiLink perlVarSlash		perlIdentifier
448  HiLink perlQQ			perlString
449  if version >= 600
450    HiLink perlHereDoc		perlString
451  else
452    HiLink perlHereIdentifier	perlStringStartEnd
453    HiLink perlUntilEOFDQ	perlString
454    HiLink perlUntilEOFSQ	perlString
455    HiLink perlUntilEmptyDQ	perlString
456    HiLink perlUntilEmptySQ	perlString
457    HiLink perlUntilEOF		perlString
458  endif
459  HiLink perlStringUnexpanded	perlString
460  HiLink perlSubstitutionSQ	perlString
461  HiLink perlSubstitutionDQ	perlString
462  HiLink perlSubstitutionSlash	perlString
463  HiLink perlSubstitutionHash	perlString
464  HiLink perlSubstitutionBracket perlString
465  HiLink perlSubstitutionCurly 	perlString
466  HiLink perlSubstitutionPling	perlString
467  HiLink perlTranslationSlash	perlString
468  HiLink perlTranslationHash	perlString
469  HiLink perlTranslationBracket	perlString
470  HiLink perlTranslationCurly	perlString
471  HiLink perlMatch		perlString
472  HiLink perlMatchStartEnd	perlStatement
473  HiLink perlFormatName		perlIdentifier
474  HiLink perlFormatField	perlString
475  HiLink perlPackageDecl	perlType
476  HiLink perlStorageClass	perlType
477  HiLink perlPackageRef		perlType
478  HiLink perlStatementPackage	perlStatement
479  HiLink perlStatementSub	perlStatement
480  HiLink perlStatementStorage	perlStatement
481  HiLink perlStatementControl	perlStatement
482  HiLink perlStatementScalar	perlStatement
483  HiLink perlStatementRegexp	perlStatement
484  HiLink perlStatementNumeric	perlStatement
485  HiLink perlStatementList	perlStatement
486  HiLink perlStatementHash	perlStatement
487  HiLink perlStatementIOfunc	perlStatement
488  HiLink perlStatementFiledesc	perlStatement
489  HiLink perlStatementVector	perlStatement
490  HiLink perlStatementFiles	perlStatement
491  HiLink perlStatementFlow	perlStatement
492  HiLink perlStatementScope	perlStatement
493  HiLink perlStatementInclude	perlStatement
494  HiLink perlStatementProc	perlStatement
495  HiLink perlStatementSocket	perlStatement
496  HiLink perlStatementIPC	perlStatement
497  HiLink perlStatementNetwork	perlStatement
498  HiLink perlStatementPword	perlStatement
499  HiLink perlStatementTime	perlStatement
500  HiLink perlStatementMisc	perlStatement
501  HiLink perlStatementNew	perlStatement
502  HiLink perlFunctionName	perlIdentifier
503  HiLink perlMethod		perlIdentifier
504  HiLink perlFunctionPRef	perlType
505  HiLink perlPOD		perlComment
506  HiLink perlShellCommand	perlString
507  HiLink perlSpecialAscii	perlSpecial
508  HiLink perlSpecialDollar	perlSpecial
509  HiLink perlSpecialString	perlSpecial
510  HiLink perlSpecialStringU	perlSpecial
511  HiLink perlSpecialMatch	perlSpecial
512  HiLink perlSpecialBEOM	perlSpecial
513  HiLink perlDATA		perlComment
514
515  HiLink perlBrackets		Error
516
517  " Possible errors
518  HiLink perlNotEmptyLine	Error
519  HiLink perlElseIfError	Error
520
521  delcommand HiLink
522endif
523
524" Syncing to speed up processing
525"
526if !exists("perl_no_sync_on_sub")
527  syn sync match perlSync	grouphere NONE "^\s*\<package\s"
528  syn sync match perlSync	grouphere perlFunction "^\s*\<sub\s"
529  syn sync match perlSync	grouphere NONE "^}"
530endif
531
532if !exists("perl_no_sync_on_global_var")
533  syn sync match perlSync	grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
534  syn sync match perlSync	grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
535endif
536
537if exists("perl_sync_dist")
538  execute "syn sync maxlines=" . perl_sync_dist
539else
540  syn sync maxlines=100
541endif
542
543syn sync match perlSyncPOD	grouphere perlPOD "^=pod"
544syn sync match perlSyncPOD	grouphere perlPOD "^=head"
545syn sync match perlSyncPOD	grouphere perlPOD "^=item"
546syn sync match perlSyncPOD	grouphere NONE "^=cut"
547
548let b:current_syntax = "perl"
549
550" vim: ts=8
551