comparison runtime/syntax/perl.vim @ 7:3fc0f57ecb91 v7.0001

updated for version 7.0001
author vimboss
date Sun, 13 Jun 2004 20:20:40 +0000
parents
children cc049b00ee70
comparison
equal deleted inserted replaced
6:c2daee826b8f 7:3fc0f57ecb91
1 " 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).
31 if version < 600
32 syntax clear
33 elseif exists("b:current_syntax")
34 finish
35 endif
36
37 " Unset perl_fold if it set but vim doesn't support it.
38 if version < 600 && exists("perl_fold")
39 unlet perl_fold
40 endif
41
42
43 " POD starts with ^=<word> and ends with ^=cut
44
45 if 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
56 else
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
63 endif
64
65
66 " All keywords
67 "
68 if 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
73 else
74 syn keyword perlConditional if elsif unless
75 syn keyword perlConditional else nextgroup=perlElseIfError skipwhite skipnl skipempty
76 endif
77 syn keyword perlConditional switch eq ne gt lt ge le cmp not and or xor err
78 if 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\>"
85 else
86 syn keyword perlRepeat while for foreach do until continue
87 endif
88 syn keyword perlOperator defined undef and or not bless ref
89 if 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
93 else
94 syn keyword perlControl BEGIN END
95 endif
96
97 syn keyword perlStatementStorage my local our
98 syn keyword perlStatementControl goto return last next redo
99 syn keyword perlStatementScalar chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst
100 syn keyword perlStatementRegexp pos quotemeta split study
101 syn keyword perlStatementNumeric abs atan2 cos exp hex int log oct rand sin sqrt srand
102 syn keyword perlStatementList splice unshift shift push pop split join reverse grep map sort unpack
103 syn keyword perlStatementHash each exists keys values tie tied untie
104 syn keyword perlStatementIOfunc carp confess croak dbmclose dbmopen die syscall
105 syn keyword perlStatementFiledesc binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite
106 syn keyword perlStatementFiledesc fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite
107 syn keyword perlStatementVector pack vec
108 syn keyword perlStatementFiles chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime
109 syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
110 syn keyword perlStatementFlow caller die dump eval exit wantarray
111 syn keyword perlStatementInclude require
112 syn match perlStatementInclude "\(use\|no\)\s\+\(integer\>\|strict\>\|lib\>\|sigtrap\>\|subs\>\|vars\>\|warnings\>\|utf8\>\|byte\>\)\="
113 syn keyword perlStatementScope import
114 syn keyword perlStatementProc alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid
115 syn keyword perlStatementSocket accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
116 syn keyword perlStatementIPC msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
117 syn keyword perlStatementNetwork endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
118 syn keyword perlStatementPword getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent
119 syn keyword perlStatementTime gmtime localtime time times
120
121 syn keyword perlStatementMisc warn formline reset scalar delete prototype lock
122 syn keyword perlStatementNew new
123
124 syn 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 ($|, $', ...)
137 syn match perlVarPlain "$^[ADEFHILMOPSTWX]\="
138 syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@$<>(-]"
139 syn match perlVarPlain "$\(0\|[1-9][0-9]*\)"
140 " Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
141 syn match perlVarPlain "$:[^:]"
142 " These variables are not recognized within matches.
143 syn match perlVarNotInMatches "$[|)]"
144 " This variable is not recognized within matches delimited by m//.
145 syn match perlVarSlash "$/"
146
147 " And plain identifiers
148 syn 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
159 if 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
162 else
163 syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
164 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
165 endif
166
167 if 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
177 endif
178
179 " File Descriptors
180 syn match perlFiledescRead "[<]\h\w\+[>]"
181
182 syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
183 syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
184
185 syn match perlFiledescStatement "\u\w*" contained
186
187 " Special characters in strings and matches
188 syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
189 syn match perlSpecialStringU "\\['\\]" contained
190 syn match perlSpecialMatch "{\d\(,\d\)\=}" contained
191 syn match perlSpecialMatch "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
192 syn match perlSpecialMatch "[+*()?.]" contained
193 syn match perlSpecialMatch "(?[#:=!]" contained
194 syn 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
202 syn 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.
210 syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
211 " These items are interpolated inside '' strings and similar constructs.
212 syn cluster perlInterpSQ contains=perlSpecialStringU
213 " These items are interpolated inside m// matches and s/// substitutions.
214 syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
215 " These items are interpolated inside m## matches and s### substitutions.
216 syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash
217
218 " Shell commands
219 syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
220
221 " Constants
222 "
223 " Numbers
224 syn match perlNumber "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
225 syn match perlFloat "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
226 syn match perlFloat "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
227 syn 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)
232 syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
233 syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
234 syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
235 syn 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
238 syn 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
243 syn 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
249 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
250 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
251 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
252 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
253 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
254 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
255 syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
256 syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
257 syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
258 syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
259 syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
260 syn 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
263 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
264 syn 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.
269 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
270 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
271 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
272 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
273 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
274 syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
275 syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
276 syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
277 syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
278 syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
279 syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
280 syn 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
285 syn match perlString "\<\I\i*\s*=>"me=e-2
286
287 " Strings and q, qq, qw and qr expressions
288
289 " Brackets in qq()
290 syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
291
292 syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
293 syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ
294 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
295 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
296 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
297 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
298 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
299 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
300 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
301 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
302 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
303 syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
304 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ
305 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ
306 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlBrackets
307 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ
308 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ
309 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr#+ end=+#[imosx]*+ contains=@perlInterpMatch
310 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr|+ end=+|[imosx]*+ contains=@perlInterpMatch
311 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr(+ end=+)[imosx]*+ contains=@perlInterpMatch
312 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr{+ end=+}[imosx]*+ contains=@perlInterpMatch
313 syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash
314
315 " Constructs such as print <<EOF [...] EOF, 'here' documents
316 "
317 if 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
335 else
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
347 endif
348
349
350 " Class declarations
351 "
352 syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage
353 syn keyword perlStatementPackage package contained
354
355 " Functions
356 " sub [name] [(prototype)] {
357 "
358 syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
359 syn keyword perlStatementSub sub contained
360
361 syn match perlFunctionPrototype "([^)]*)" contained
362 if exists("perl_want_scope_in_variables")
363 syn match perlFunctionPRef "\h\w*::" contained
364 syn match perlFunctionName "\h\w*[^:]" contained
365 else
366 syn match perlFunctionName "\h[[:alnum:]_:]*" contained
367 endif
368
369
370 " All other # are comments, except ^#!
371 syn match perlComment "#.*" contains=perlTodo
372 syn match perlSharpBang "^#!.*"
373
374 " Formats
375 syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
376 syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
377 syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained
378 syn match perlFormatField "[@^]#[#.]*" contained
379 syn match perlFormatField "@\*" contained
380 syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
381 syn match perlFormatField "@$" contained
382
383 " __END__ and __DATA__ clauses
384 if exists("perl_fold")
385 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
386 else
387 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
388 endif
389
390
391 "
392 " Folding
393
394 if 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
406 else
407 " fromstart above seems to set minlines even if perl_fold is not set.
408 syn sync minlines=0
409 endif
410
411
412 if 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
528 endif
529
530 " Syncing to speed up processing
531 "
532 if !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 "^}"
536 endif
537
538 if !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*("
541 endif
542
543 if exists("perl_sync_dist")
544 execute "syn sync maxlines=" . perl_sync_dist
545 else
546 syn sync maxlines=100
547 endif
548
549 syn sync match perlSyncPOD grouphere perlPOD "^=pod"
550 syn sync match perlSyncPOD grouphere perlPOD "^=head"
551 syn sync match perlSyncPOD grouphere perlPOD "^=item"
552 syn sync match perlSyncPOD grouphere NONE "^=cut"
553
554 let b:current_syntax = "perl"
555
556 " vim: ts=8