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