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