blob: 438872918ceae4efaddc6b7bf768b6f4ba43b5c2 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Perl
3" Maintainer: Nick Hibma <n_hibma@van-laarhoven.org>
4" Last Change: 2004 May 16
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 <niania@netsurf.org>
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_want_scope_in_variables
21" unlet perl_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" To highlight packages in variables as a scope reference - i.e. in $pack::var,
151" pack:: is a scope, just set "perl_want_scope_in_variables"
152" If you *want* complex things like @{${"foo"}} to be processed,
153" just set the variable "perl_extended_vars"...
154
155" FIXME value between {} should be marked as string. is treated as such by Perl.
156" At the moment it is marked as something greyish instead of read. Probably todo
157" with transparency. Or maybe we should handle the bare word in that case. or make it into
158
159if exists("perl_want_scope_in_variables")
160 syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
161 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
162else
163 syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
164 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
165endif
166
167if exists("perl_extended_vars")
168 syn cluster perlExpr contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
169 syn region perlVarBlock matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
170 syn region perlVarBlock matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
171 syn match perlVarPlain "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
172 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
173 syn match perlVarSimpleMember "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
174 syn match perlVarSimpleMemberName "\I\i*" contained
175 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
176 syn match perlMethod "\(->\)\I\i*" contained
177endif
178
179" File Descriptors
180syn match perlFiledescRead "[<]\h\w\+[>]"
181
182syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
183syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
184
185syn match perlFiledescStatement "\u\w*" contained
186
187" Special characters in strings and matches
188syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
189syn match perlSpecialStringU "\\['\\]" contained
190syn match perlSpecialMatch "{\d\(,\d\)\=}" 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,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
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.
242"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
243syn 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
244
245
246" Substitutions
247" caters for s///, s### and s[][]
248" perlMatch is the first part, perlSubstitution* is the substitution part
249syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
250syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
251syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
254syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
255syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
256syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
257syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
258syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
259syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
260syn region perlSubstitutionCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
261
262" A special case for m!!x which allows for comments and extra whitespace in the pattern
263syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
264syn region perlSubstitutionPling matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
265
266" Substitutions
267" caters for tr///, tr### and tr[][]
268" perlMatch is the first part, perlTranslation* is the second, translator part.
269syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
270syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
274syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
275syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
276syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
277syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
278syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
279syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
280syn region perlTranslationCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
281
282
283" The => operator forces a bareword to the left of it to be interpreted as
284" a string
285syn match perlString "\<\I\i*\s*=>"me=e-2
286
287" Strings and q, qq, qw and qr expressions
288
289" Brackets in qq()
290syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
291
292syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
293syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ
294syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
295syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
296syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
297syn region perlQQ matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
298syn region perlQQ matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
299syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
300syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
301syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
302syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
303syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
304syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ
305syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ
306syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlBrackets
307syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ
308syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ
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=@perlInterpMatch
313syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash
314
315" Constructs such as print <<EOF [...] EOF, 'here' documents
316"
317if version >= 600
318 " XXX Any statements after the identifier are in perlString colour (i.e.
319 " 'if $a' in 'print <<EOF if $a').
320 if exists("perl_fold")
321 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ fold
322 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
323 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
324 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold
325 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold
326 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
327 else
328 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ
329 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
330 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
331 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine
332 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine
333 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
334 endif
335else
336 syn match perlUntilEOFStart "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
337 syn match perlUntilEOFStart "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
338 syn match perlUntilEOFStart "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
339 syn match perlUntilEOFStart "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
340 syn match perlUntilEOFStart "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
341 syn region perlUntilEOFDQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
342 syn region perlUntilEOFSQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
343 syn region perlUntilEmptySQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
344 syn region perlUntilEmptyDQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
345 syn match perlHereIdentifier "<<EOF"
346 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
347endif
348
349
350" Class declarations
351"
352syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage
353syn keyword perlStatementPackage package contained
354
355" Functions
356" sub [name] [(prototype)] {
357"
358syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
359syn keyword perlStatementSub sub contained
360
361syn match perlFunctionPrototype "([^)]*)" contained
362if exists("perl_want_scope_in_variables")
363 syn match perlFunctionPRef "\h\w*::" contained
364 syn match perlFunctionName "\h\w*[^:]" contained
365else
366 syn match perlFunctionName "\h[[:alnum:]_:]*" contained
367endif
368
369
370" All other # are comments, except ^#!
371syn match perlComment "#.*" contains=perlTodo
372syn match perlSharpBang "^#!.*"
373
374" Formats
375syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
376syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
377syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained
378syn match perlFormatField "[@^]#[#.]*" contained
379syn match perlFormatField "@\*" contained
380syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
381syn match perlFormatField "@$" contained
382
383" __END__ and __DATA__ clauses
384if exists("perl_fold")
385 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
386else
387 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
388endif
389
390
391"
392" Folding
393
394if exists("perl_fold")
395 syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="\n\+package"me=s-1 transparent fold keepend
396 syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend
397 syn region perlBEGINENDFold start="^\z(\s*\)\<\(BEGIN\|END\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
398
399 if exists("perl_fold_blocks")
400 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
401 syn region perlIfFold start="^\z(\s*\)do\s*{\s*$" end="^\z1}\s*while" end="^\z1}\s*;\=$" transparent fold keepend
402 endif
403
404 setlocal foldmethod=syntax
405 syn sync fromstart
406else
407 " fromstart above seems to set minlines even if perl_fold is not set.
408 syn sync minlines=0
409endif
410
411
412if version >= 508 || !exists("did_perl_syn_inits")
413 if version < 508
414 let did_perl_syn_inits = 1
415 command -nargs=+ HiLink hi link <args>
416 else
417 command -nargs=+ HiLink hi def link <args>
418 endif
419
420 " The default highlighting.
421 HiLink perlSharpBang PreProc
422 HiLink perlControl PreProc
423 HiLink perlInclude Include
424 HiLink perlSpecial Special
425 HiLink perlString String
426 HiLink perlCharacter Character
427 HiLink perlNumber Number
428 HiLink perlFloat Float
429 HiLink perlType Type
430 HiLink perlIdentifier Identifier
431 HiLink perlLabel Label
432 HiLink perlStatement Statement
433 HiLink perlConditional Conditional
434 HiLink perlRepeat Repeat
435 HiLink perlOperator Operator
436 HiLink perlFunction Function
437 HiLink perlFunctionPrototype perlFunction
438 HiLink perlComment Comment
439 HiLink perlTodo Todo
440 if exists("perl_string_as_statement")
441 HiLink perlStringStartEnd perlStatement
442 else
443 HiLink perlStringStartEnd perlString
444 endif
445 HiLink perlList perlStatement
446 HiLink perlMisc perlStatement
447 HiLink perlVarPlain perlIdentifier
448 HiLink perlFiledescRead perlIdentifier
449 HiLink perlFiledescStatement perlIdentifier
450 HiLink perlVarSimpleMember perlIdentifier
451 HiLink perlVarSimpleMemberName perlString
452 HiLink perlVarNotInMatches perlIdentifier
453 HiLink perlVarSlash 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 perlStatement
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 perlBrackets 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