xref: /vim-8.2.3635/runtime/syntax/perl.vim (revision f4cd3e80)
1" Vim syntax file
2" Language:	Perl
3" Maintainer:	Nick Hibma <[email protected]>
4" Last Change:	2005 October 18
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,@Spell,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,@Spell,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" contains=@Spell fold
60  else
61    syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Spell
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\|END\|CHECK\|INIT\>" 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\+\(\(attributes\|autouse\|base\|big\(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\|fields\|filetest\|if\|integer\|less\|lib\|locale\|open\|ops\|overload\|re\|sigtrap\|sort\|strict\|subs\|threads\(::shared\)\=\|utf8\|vars\|vmsish\|warnings\(::register\)\=\)\>\)\="
112
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
121if !exists("perl_no_semi_keywords")
122  syn keyword perlStatementScope	import
123  syn keyword perlStatementNew		new
124  syn keyword perlStatementCarp		carp confess croak
125endif
126syn keyword perlTodo			TODO TBD FIXME XXX contained
127
128" Perl Identifiers.
129"
130" Should be cleaned up to better handle identifiers in particular situations
131" (in hash keys for example)
132"
133" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
134" We do not process complex things such as @{${"foo"}}. Too complicated, and
135" too slow. And what is after the -> is *not* considered as part of the
136" variable - there again, too complicated and too slow.
137
138" Special variables first ($^A, ...) and ($|, $', ...)
139syn match  perlVarPlain		 "$^[ADEFHILMOPSTWX]\="
140syn match  perlVarPlain		 "$[\\\"\[\]'&`+*.,;=%~?@$<>(-]"
141syn match  perlVarPlain		 "$\(0\|[1-9]\d*\)"
142" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
143syn match  perlVarPlain		 "$:[^:]"
144" These variables are not recognized within matches.
145syn match  perlVarNotInMatches	 "$[|)]"
146" This variable is not recognized within matches delimited by '/'.
147syn match  perlVarSlash		 "$/"
148" This variable is not recognized within matches delimited by '!'.
149syn match  perlVarBang		 "$!"
150
151" And plain identifiers
152syn match  perlPackageRef	 "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
153
154" FIXME value between {} should be marked as string. is treated as such by Perl.
155" At the moment it is marked as something greyish instead of read. Probably todo
156" with transparency. Or maybe we should handle the bare word in that case. or make it into
157
158if !exists("perl_no_scope_in_variables")
159  syn match  perlVarPlain	"\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
160  syn match  perlFunctionName	"\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
161else
162  syn match  perlVarPlain	"\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
163  syn match  perlFunctionName	"\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
164endif
165
166if !exists("perl_no_extended_vars")
167  syn cluster perlExpr		contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBang,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
168  syn region perlVarBlock	matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
169  syn region perlVarBlock	matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
170  syn match  perlVarPlain	"\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
171  syn region perlVarMember	matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
172  syn match  perlVarSimpleMember	"\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
173  syn match  perlVarSimpleMemberName	"\I\i*" contained
174  syn region perlVarMember	matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
175  syn match  perlMethod		"\(->\)\I\i*" contained
176endif
177
178" File Descriptors
179syn match  perlFiledescRead	"[<]\h\w\+[>]"
180
181syn match  perlFiledescStatementComma	"(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
182syn match  perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^,[:space:]]"me=e-1 transparent contained contains=perlFiledescStatement
183
184syn match  perlFiledescStatement	"\u\w*" contained
185
186" Special characters in strings and matches
187syn match  perlSpecialString	"\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
188syn match  perlSpecialStringU	"\\['\\]" contained
189syn match  perlSpecialMatch	"{\d\+\(,\d*\)\=}" contained
190syn match  perlSpecialMatch	"\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
191syn match  perlSpecialMatch	"[+*()?.]" contained
192syn match  perlSpecialMatch	"(?[#:=!]" contained
193syn match  perlSpecialMatch	"(?<[=!]" contained
194syn match  perlSpecialMatch	"(?[imsx]\+)" contained
195" FIXME the line below does not work. It should mark end of line and
196" begin of line as perlSpecial.
197" syn match perlSpecialBEOM    "^\^\|\$$" contained
198
199" Possible errors
200"
201" Highlight lines with only whitespace (only in blank delimited here documents) as errors
202syn match  perlNotEmptyLine	"^\s\+$" contained
203" Highlight '} else if (...) {', it should be '} else { if (...) { ' or
204" '} elsif (...) {'.
205"syn keyword perlElseIfError	if contained
206
207" Variable interpolation
208"
209" These items are interpolated inside "" strings and similar constructs.
210syn cluster perlInterpDQ	contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBang,perlVarBlock
211" These items are interpolated inside '' strings and similar constructs.
212syn cluster perlInterpSQ	contains=perlSpecialStringU
213" These items are interpolated inside m// matches and s/// substitutions.
214syn cluster perlInterpSlash	contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
215" These items are interpolated inside m## matches and s### substitutions.
216syn cluster perlInterpMatch	contains=@perlInterpSlash,perlVarSlash,perlVarBang
217
218" Shell commands
219syn region  perlShellCommand	matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
220
221" Constants
222"
223" Numbers
224syn match  perlNumber	"[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
225syn match  perlFloat	"[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
226syn match  perlFloat	"[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
227syn match  perlFloat	"[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\="
228
229
230" Simple version of searches and matches
231" caters for m//, m##, m{} and m[] (and the !/ variant)
232syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
233syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
234syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
235syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch
236
237" A special case for m!!x which allows for comments and extra whitespace in the pattern
238syn region perlMatch	matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment
239
240" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
241" cases as the / is used in so many other ways, but these should be the most obvious ones.
242syn 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/[^=[:space:][:digit:]$@%&]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
243
244
245" Substitutions
246" caters for s///, s### and s[][]
247" perlMatch is the first part, perlSubstitution* is the substitution part
248syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
249syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s"+  end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
250syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
251syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
252syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
253syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
254syn region perlSubstitutionSQ		matchgroup=perlMatchStartEnd start=+'+  end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
255syn region perlSubstitutionDQ		matchgroup=perlMatchStartEnd start=+"+  end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
256syn region perlSubstitutionSlash	matchgroup=perlMatchStartEnd start=+/+  end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
257syn region perlSubstitutionHash		matchgroup=perlMatchStartEnd start=+#+  end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
258syn region perlSubstitutionBracket	matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
259syn region perlSubstitutionCurly	matchgroup=perlMatchStartEnd start=+{+  end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
260
261" A special case for s!!!x which allows for comments and extra whitespace in the pattern
262syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
263syn region perlSubstitutionPling	matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
264
265" Substitutions
266" caters for tr///, tr### and tr[][]
267" perlMatch is the first part, perlTranslation* is the second, translator part.
268syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
269syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
270syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
271syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
272syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
273syn region perlMatch	matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
274syn region perlTranslationSQ		matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
275syn region perlTranslationDQ		matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
276syn region perlTranslationSlash		matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
277syn region perlTranslationHash		matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
278syn region perlTranslationBracket	matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
279syn region perlTranslationCurly		matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
280
281
282" The => operator forces a bareword to the left of it to be interpreted as
283" a string
284syn match  perlString "\<\I\i*\s*=>"me=e-2
285
286" Strings and q, qq, qw and qr expressions
287
288" Parentheses in qq()
289syn region perlParens	start=+(+ end=+)+ contained transparent contains=perlParens,@perlStringSQ
290
291syn region perlStringUnexpanded	matchgroup=perlStringStartEnd start="'" end="'" contains=@Spell,@perlInterpSQ
292syn region perlString		matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@Spell,@perlInterpDQ
293syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
294syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
295syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlParens
296syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
297syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
298syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
299syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
300syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlParens
301syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
302syn region perlQQ		matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
303syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw#+  end=+#+ contains=@perlInterpSQ
304syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw|+  end=+|+ contains=@perlInterpSQ
305syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw(+  end=+)+ contains=@perlInterpSQ,perlParens
306syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw{+  end=+}+ contains=@perlInterpSQ
307syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qw/+  end=+/+ contains=@perlInterpSQ
308syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr#+  end=+#[imosx]*+ contains=@perlInterpMatch
309syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr|+  end=+|[imosx]*+ contains=@perlInterpMatch
310syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr(+  end=+)[imosx]*+ contains=@perlInterpMatch
311syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr{+  end=+}[imosx]*+ contains=@perlInterpMatch
312syn region perlQQ		matchgroup=perlStringStartEnd start=+\<qr/+  end=+/[imosx]*+ contains=@perlInterpSlash
313
314" Constructs such as print <<EOF [...] EOF, 'here' documents
315"
316if version >= 600
317  " XXX Any statements after the identifier are in perlString colour (i.e.
318  " 'if $a' in 'print <<EOF if $a').
319  if exists("perl_fold")
320    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+    end=+^\z1$+ contains=@perlInterpDQ fold
321    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
322    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
323    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*""+         end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine fold
324    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*''+         end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine fold
325    syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
326  else
327    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+    end=+^\z1$+ contains=@perlInterpDQ
328    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
329    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
330    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*""+         end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine
331    syn region perlHereDoc	matchgroup=perlStringStartEnd start=+<<\s*''+         end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine
332    syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
333  endif
334else
335  syn match perlUntilEOFStart	"<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
336  syn match perlUntilEOFStart	"<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
337  syn match perlUntilEOFStart	"<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
338  syn match perlUntilEOFStart	"<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
339  syn match perlUntilEOFStart	"<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
340  syn region perlUntilEOFDQ	matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
341  syn region perlUntilEOFSQ	matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
342  syn region perlUntilEmptySQ	matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
343  syn region perlUntilEmptyDQ	matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
344  syn match perlHereIdentifier	"<<EOF"
345  syn region perlAutoload	matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
346endif
347
348
349" Class declarations
350"
351syn match  perlPackageDecl	"^\s*\<package\s\+\S\+" contains=perlStatementPackage
352syn keyword perlStatementPackage	package contained
353
354" Functions
355"       sub [name] [(prototype)] {
356"
357syn region perlFunction		start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
358syn keyword perlStatementSub	sub contained
359
360syn match  perlFunctionPrototype	"([^)]*)" contained
361if !exists("perl_no_scope_in_variables")
362   syn match  perlFunctionPRef	"\h\w*::" contained
363   syn match  perlFunctionName	"\h\w*[^:]" contained
364else
365   syn match  perlFunctionName	"\h[[:alnum:]_:]*" contained
366endif
367
368
369" All other # are comments, except ^#!
370syn match  perlComment		"#.*" contains=@Spell,perlTodo
371syn match  perlSharpBang	"^#!.*"
372
373" Formats
374syn region perlFormat		matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
375syn match  perlFormatName	"format\s\+\k\+\s*="lc=7,me=e-1 contained
376syn match  perlFormatField	"[@^][|<>~]\+\(\.\.\.\)\=" contained
377syn match  perlFormatField	"[@^]#[#.]*" contained
378syn match  perlFormatField	"@\*" contained
379syn match  perlFormatField	"@[^A-Za-z_|<>~#*]"me=e-1 contained
380syn match  perlFormatField	"@$" contained
381
382" __END__ and __DATA__ clauses
383if exists("perl_fold")
384  syntax region perlDATA		start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
385else
386  syntax region perlDATA		start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
387endif
388
389
390"
391" Folding
392
393if exists("perl_fold")
394  syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="\n\+package"me=s-1 transparent fold keepend
395  syn region perlSubFold     start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend
396  syn region perlBEGINENDFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
397
398  if exists("perl_fold_blocks")
399    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*$" start="\z(\s*\)else\s*{\s*$" end="^\z1}\s*;\=$" transparent fold keepend
400    syn region perlIfFold start="^\z(\s*\)do\(\s*{\)\=\s*$" end="^\z1}\s*while" end="^\z1}\s*;\=$" transparent fold keepend
401  endif
402
403  setlocal foldmethod=syntax
404  syn sync fromstart
405else
406  " fromstart above seems to set minlines even if perl_fold is not set.
407  syn sync minlines=0
408endif
409
410
411if version >= 508 || !exists("did_perl_syn_inits")
412  if version < 508
413    let did_perl_syn_inits = 1
414    command -nargs=+ HiLink hi link <args>
415  else
416    command -nargs=+ HiLink hi def link <args>
417  endif
418
419  " The default highlighting.
420  HiLink perlSharpBang		PreProc
421  HiLink perlControl		PreProc
422  HiLink perlInclude		Include
423  HiLink perlSpecial		Special
424  HiLink perlString		String
425  HiLink perlCharacter		Character
426  HiLink perlNumber		Number
427  HiLink perlFloat		Float
428  HiLink perlType		Type
429  HiLink perlIdentifier		Identifier
430  HiLink perlLabel		Label
431  HiLink perlStatement		Statement
432  HiLink perlConditional	Conditional
433  HiLink perlRepeat		Repeat
434  HiLink perlOperator		Operator
435  HiLink perlFunction		Function
436  HiLink perlFunctionPrototype	perlFunction
437  HiLink perlComment		Comment
438  HiLink perlTodo		Todo
439  if exists("perl_string_as_statement")
440    HiLink perlStringStartEnd	perlStatement
441  else
442    HiLink perlStringStartEnd	perlString
443  endif
444  HiLink perlList		perlStatement
445  HiLink perlMisc		perlStatement
446  HiLink perlVarPlain		perlIdentifier
447  HiLink perlFiledescRead	perlIdentifier
448  HiLink perlFiledescStatement	perlIdentifier
449  HiLink perlVarSimpleMember	perlIdentifier
450  HiLink perlVarSimpleMemberName perlString
451  HiLink perlVarNotInMatches	perlIdentifier
452  HiLink perlVarSlash		perlIdentifier
453  HiLink perlVarBang		perlIdentifier
454  HiLink perlQQ			perlString
455  if version >= 600
456    HiLink perlHereDoc		perlString
457  else
458    HiLink perlHereIdentifier	perlStringStartEnd
459    HiLink perlUntilEOFDQ	perlString
460    HiLink perlUntilEOFSQ	perlString
461    HiLink perlUntilEmptyDQ	perlString
462    HiLink perlUntilEmptySQ	perlString
463    HiLink perlUntilEOF		perlString
464  endif
465  HiLink perlStringUnexpanded	perlString
466  HiLink perlSubstitutionSQ	perlString
467  HiLink perlSubstitutionDQ	perlString
468  HiLink perlSubstitutionSlash	perlString
469  HiLink perlSubstitutionHash	perlString
470  HiLink perlSubstitutionBracket perlString
471  HiLink perlSubstitutionCurly 	perlString
472  HiLink perlSubstitutionPling	perlString
473  HiLink perlTranslationSlash	perlString
474  HiLink perlTranslationHash	perlString
475  HiLink perlTranslationBracket	perlString
476  HiLink perlTranslationCurly	perlString
477  HiLink perlMatch		perlString
478  HiLink perlMatchStartEnd	perlStatement
479  HiLink perlFormatName		perlIdentifier
480  HiLink perlFormatField	perlString
481  HiLink perlPackageDecl	perlType
482  HiLink perlStorageClass	perlType
483  HiLink perlPackageRef		perlType
484  HiLink perlStatementPackage	perlStatement
485  HiLink perlStatementSub	perlStatement
486  HiLink perlStatementStorage	perlStatement
487  HiLink perlStatementControl	perlStatement
488  HiLink perlStatementScalar	perlStatement
489  HiLink perlStatementRegexp	perlStatement
490  HiLink perlStatementNumeric	perlStatement
491  HiLink perlStatementList	perlStatement
492  HiLink perlStatementHash	perlStatement
493  HiLink perlStatementIOfunc	perlStatement
494  HiLink perlStatementFiledesc	perlStatement
495  HiLink perlStatementVector	perlStatement
496  HiLink perlStatementFiles	perlStatement
497  HiLink perlStatementFlow	perlStatement
498  HiLink perlStatementScope	perlStatement
499  HiLink perlStatementInclude	perlInclude
500  HiLink perlStatementProc	perlStatement
501  HiLink perlStatementSocket	perlStatement
502  HiLink perlStatementIPC	perlStatement
503  HiLink perlStatementNetwork	perlStatement
504  HiLink perlStatementPword	perlStatement
505  HiLink perlStatementTime	perlStatement
506  HiLink perlStatementMisc	perlStatement
507  HiLink perlStatementNew	perlStatement
508  HiLink perlFunctionName	perlIdentifier
509  HiLink perlMethod		perlIdentifier
510  HiLink perlFunctionPRef	perlType
511  HiLink perlPOD		perlComment
512  HiLink perlShellCommand	perlString
513  HiLink perlSpecialAscii	perlSpecial
514  HiLink perlSpecialDollar	perlSpecial
515  HiLink perlSpecialString	perlSpecial
516  HiLink perlSpecialStringU	perlSpecial
517  HiLink perlSpecialMatch	perlSpecial
518  HiLink perlSpecialBEOM	perlSpecial
519  HiLink perlDATA		perlComment
520
521  HiLink perlParens		Error
522
523  " Possible errors
524  HiLink perlNotEmptyLine	Error
525  HiLink perlElseIfError	Error
526
527  delcommand HiLink
528endif
529
530" Syncing to speed up processing
531"
532if !exists("perl_no_sync_on_sub")
533  syn sync match perlSync	grouphere NONE "^\s*\<package\s"
534  syn sync match perlSync	grouphere perlFunction "^\s*\<sub\s"
535  syn sync match perlSync	grouphere NONE "^}"
536endif
537
538if !exists("perl_no_sync_on_global_var")
539  syn sync match perlSync	grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
540  syn sync match perlSync	grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
541endif
542
543if exists("perl_sync_dist")
544  execute "syn sync maxlines=" . perl_sync_dist
545else
546  syn sync maxlines=100
547endif
548
549syn sync match perlSyncPOD	grouphere perlPOD "^=pod"
550syn sync match perlSyncPOD	grouphere perlPOD "^=head"
551syn sync match perlSyncPOD	grouphere perlPOD "^=item"
552syn sync match perlSyncPOD	grouphere NONE "^=cut"
553
554let b:current_syntax = "perl"
555
556" vim: ts=8
557