blob: 327cc11fd858f39b868abe6623d6bfe7d84e0d56 [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>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00004" Last Change: 2004 Aug 29
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" 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
Bram Moolenaard4755bb2004-09-02 19:12:26 +000020" unlet perl_no_scope_in_variables
21" unlet perl_no_extended_vars
Bram Moolenaar071d4272004-06-13 20:20:40 +000022" 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150" 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
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000154if !exists("perl_no_scope_in_variables")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000155 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
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000162if !exists("perl_no_extended_vars")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163 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
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000357if !exists("perl_no_scope_in_variables")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358 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