blob: fb9195a773706dae9ba8ccc3aa79490006db6a7c [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Perl
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +00003" Maintainer: Nick Hibma <nick@van-laarhoven.org>
4" Last Change: 2006 November 23
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 Moolenaardd2a3cd2007-05-05 17:10:09 +000020" unlet perl_want_scope_in_variables
21" unlet perl_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
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000028" let perl_nofold_packages = 1
29" let perl_nofold_subs = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000030
31" Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file
32" was already loaded (6.x).
33if version < 600
34 syntax clear
35elseif exists("b:current_syntax")
36 finish
37endif
38
39" Unset perl_fold if it set but vim doesn't support it.
40if version < 600 && exists("perl_fold")
41 unlet perl_fold
42endif
43
44
45" POD starts with ^=<word> and ends with ^=cut
46
47if exists("perl_include_pod")
48 " Include a while extra syntax file
49 syn include @Pod syntax/pod.vim
50 unlet b:current_syntax
51 if exists("perl_fold")
Bram Moolenaara5792f52005-11-23 21:25:05 +000052 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000053 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold
54 else
Bram Moolenaara5792f52005-11-23 21:25:05 +000055 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +000056 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
57 endif
58else
59 " Use only the bare minimum of rules
60 if exists("perl_fold")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000061 syn region perlPOD start="^=[a-z]" end="^=cut" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000062 else
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000063 syn region perlPOD start="^=[a-z]" end="^=cut"
Bram Moolenaar071d4272004-06-13 20:20:40 +000064 endif
65endif
66
67
68" All keywords
69"
70if exists("perl_fold") && exists("perl_fold_blocks")
71 syn match perlConditional "\<if\>"
72 syn match perlConditional "\<elsif\>"
73 syn match perlConditional "\<unless\>"
74 syn match perlConditional "\<else\>" nextgroup=perlElseIfError skipwhite skipnl skipempty
75else
76 syn keyword perlConditional if elsif unless
77 syn keyword perlConditional else nextgroup=perlElseIfError skipwhite skipnl skipempty
78endif
79syn keyword perlConditional switch eq ne gt lt ge le cmp not and or xor err
80if exists("perl_fold") && exists("perl_fold_blocks")
81 syn match perlRepeat "\<while\>"
82 syn match perlRepeat "\<for\>"
83 syn match perlRepeat "\<foreach\>"
84 syn match perlRepeat "\<do\>"
85 syn match perlRepeat "\<until\>"
86 syn match perlRepeat "\<continue\>"
87else
88 syn keyword perlRepeat while for foreach do until continue
89endif
90syn keyword perlOperator defined undef and or not bless ref
91if exists("perl_fold")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000092 " if BEGIN/END would be a keyword the perlBEGINENDFold does not work
93 syn match perlControl "\<BEGIN\|CHECK\|INIT\|END\>" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000094else
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +000095 syn keyword perlControl BEGIN END CHECK INIT
Bram Moolenaar071d4272004-06-13 20:20:40 +000096endif
97
98syn keyword perlStatementStorage my local our
99syn keyword perlStatementControl goto return last next redo
100syn keyword perlStatementScalar chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst
101syn keyword perlStatementRegexp pos quotemeta split study
102syn keyword perlStatementNumeric abs atan2 cos exp hex int log oct rand sin sqrt srand
103syn keyword perlStatementList splice unshift shift push pop split join reverse grep map sort unpack
104syn keyword perlStatementHash each exists keys values tie tied untie
105syn keyword perlStatementIOfunc carp confess croak dbmclose dbmopen die syscall
106syn keyword perlStatementFiledesc binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite
107syn keyword perlStatementFiledesc fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite
108syn keyword perlStatementVector pack vec
109syn keyword perlStatementFiles chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime
110syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
111syn keyword perlStatementFlow caller die dump eval exit wantarray
112syn keyword perlStatementInclude require
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000113syn match perlStatementInclude "\<\(use\|no\)\s\+\(\(integer\|strict\|lib\|sigtrap\|subs\|vars\|warnings\|utf8\|byte\|base\|fields\)\>\)\="
114syn keyword perlStatementScope import
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn keyword perlStatementProc alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid
116syn keyword perlStatementSocket accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
117syn keyword perlStatementIPC msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
118syn keyword perlStatementNetwork endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
119syn keyword perlStatementPword getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent
120syn keyword perlStatementTime gmtime localtime time times
121
122syn keyword perlStatementMisc warn formline reset scalar delete prototype lock
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000123syn keyword perlStatementNew new
124
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125syn keyword perlTodo TODO TBD FIXME XXX contained
126
127" Perl Identifiers.
128"
129" Should be cleaned up to better handle identifiers in particular situations
130" (in hash keys for example)
131"
132" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
133" We do not process complex things such as @{${"foo"}}. Too complicated, and
134" too slow. And what is after the -> is *not* considered as part of the
135" variable - there again, too complicated and too slow.
136
137" Special variables first ($^A, ...) and ($|, $', ...)
138syn match perlVarPlain "$^[ADEFHILMOPSTWX]\="
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000139syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
140syn match perlVarPlain "$\(0\|[1-9][0-9]*\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
142syn match perlVarPlain "$:[^:]"
143" These variables are not recognized within matches.
144syn match perlVarNotInMatches "$[|)]"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000145" This variable is not recognized within matches delimited by m//.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146syn match perlVarSlash "$/"
147
148" And plain identifiers
149syn match perlPackageRef "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
150
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000151" To highlight packages in variables as a scope reference - i.e. in $pack::var,
152" pack:: is a scope, just set "perl_want_scope_in_variables"
153" If you *want* complex things like @{${"foo"}} to be processed,
154" just set the variable "perl_extended_vars"...
155
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156" FIXME value between {} should be marked as string. is treated as such by Perl.
157" At the moment it is marked as something greyish instead of read. Probably todo
158" with transparency. Or maybe we should handle the bare word in that case. or make it into
159
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000160if exists("perl_want_scope_in_variables")
161 syn match perlVarPlain "\\\=\([@$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
162 syn match perlVarPlain2 "\\\=%\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
164else
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000165 syn match perlVarPlain "\\\=\([@$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
166 syn match perlVarPlain2 "\\\=%\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000167 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
168endif
169
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000170if exists("perl_extended_vars")
171 syn cluster perlExpr contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172 syn region perlVarBlock matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
173 syn region perlVarBlock matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
174 syn match perlVarPlain "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
175 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
176 syn match perlVarSimpleMember "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
177 syn match perlVarSimpleMemberName "\I\i*" contained
178 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
179 syn match perlMethod "\(->\)\I\i*" contained
180endif
181
182" File Descriptors
183syn match perlFiledescRead "[<]\h\w\+[>]"
184
185syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000186syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187
188syn match perlFiledescStatement "\u\w*" contained
189
190" Special characters in strings and matches
191syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
192syn match perlSpecialStringU "\\['\\]" contained
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000193syn match perlSpecialMatch "{\d\+\(,\(\d\+\)\=\)\=}" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194syn match perlSpecialMatch "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
195syn match perlSpecialMatch "[+*()?.]" contained
196syn match perlSpecialMatch "(?[#:=!]" contained
197syn match perlSpecialMatch "(?[imsx]\+)" contained
198" FIXME the line below does not work. It should mark end of line and
199" begin of line as perlSpecial.
200" syn match perlSpecialBEOM "^\^\|\$$" contained
201
202" Possible errors
203"
204" Highlight lines with only whitespace (only in blank delimited here documents) as errors
205syn match perlNotEmptyLine "^\s\+$" contained
206" Highlight '} else if (...) {', it should be '} else { if (...) { ' or
207" '} elsif (...) {'.
208"syn keyword perlElseIfError if contained
209
210" Variable interpolation
211"
212" These items are interpolated inside "" strings and similar constructs.
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000213syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
Bram Moolenaar071d4272004-06-13 20:20:40 +0000214" These items are interpolated inside '' strings and similar constructs.
215syn cluster perlInterpSQ contains=perlSpecialStringU
216" These items are interpolated inside m// matches and s/// substitutions.
217syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
218" These items are interpolated inside m## matches and s### substitutions.
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000219syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
221" Shell commands
222syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
223
224" Constants
225"
226" Numbers
227syn match perlNumber "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
228syn match perlFloat "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
229syn match perlFloat "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
230syn match perlFloat "[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\="
231
232
233" Simple version of searches and matches
234" caters for m//, m##, m{} and m[] (and the !/ variant)
235syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
236syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
237syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
238syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch
239
240" A special case for m!!x which allows for comments and extra whitespace in the pattern
241syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment
242
243" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
244" cases as the / is used in so many other ways, but these should be the most obvious ones.
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000245syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246
247
248" Substitutions
249" caters for s///, s### and s[][]
250" perlMatch is the first part, perlSubstitution* is the substitution part
251syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
254syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
255syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
256syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
257syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
258syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
259syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
260syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
261syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
262syn region perlSubstitutionCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
263
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000264" A special case for m!!x which allows for comments and extra whitespace in the pattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
266syn region perlSubstitutionPling matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
267
268" Substitutions
269" caters for tr///, tr### and tr[][]
270" perlMatch is the first part, perlTranslation* is the second, translator part.
271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
274syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
275syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
276syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
277syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
278syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
279syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
280syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
281syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
282syn region perlTranslationCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
283
284
285" The => operator forces a bareword to the left of it to be interpreted as
286" a string
287syn match perlString "\<\I\i*\s*=>"me=e-2
288
289" Strings and q, qq, qw and qr expressions
290
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000291" Brackets in qq()
292syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000294syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
295syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
297syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000298syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299syn region perlQQ matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
300syn region perlQQ matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
301syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
302syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000303syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
305syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
306syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ
307syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000308syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlBrackets
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ
310syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ
311syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr#+ end=+#[imosx]*+ contains=@perlInterpMatch
312syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr|+ end=+|[imosx]*+ contains=@perlInterpMatch
313syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr(+ end=+)[imosx]*+ contains=@perlInterpMatch
314syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr{+ end=+}[imosx]*+ contains=@perlInterpMatch
315syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash
316
317" Constructs such as print <<EOF [...] EOF, 'here' documents
318"
319if version >= 600
320 " XXX Any statements after the identifier are in perlString colour (i.e.
321 " 'if $a' in 'print <<EOF if $a').
322 if exists("perl_fold")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000323 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\).*+ end=+^\z1$+ contains=@perlInterpDQ fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000324 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
325 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000326 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold
327 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
329 else
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000330 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
332 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000333 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine
334 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
336 endif
337else
338 syn match perlUntilEOFStart "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
339 syn match perlUntilEOFStart "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
340 syn match perlUntilEOFStart "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
341 syn match perlUntilEOFStart "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
342 syn match perlUntilEOFStart "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
343 syn region perlUntilEOFDQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
344 syn region perlUntilEOFSQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
345 syn region perlUntilEmptySQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
346 syn region perlUntilEmptyDQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
347 syn match perlHereIdentifier "<<EOF"
348 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
349endif
350
351
352" Class declarations
353"
354syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage
355syn keyword perlStatementPackage package contained
356
357" Functions
358" sub [name] [(prototype)] {
359"
360syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
361syn keyword perlStatementSub sub contained
362
363syn match perlFunctionPrototype "([^)]*)" contained
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000364if exists("perl_want_scope_in_variables")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365 syn match perlFunctionPRef "\h\w*::" contained
366 syn match perlFunctionName "\h\w*[^:]" contained
367else
368 syn match perlFunctionName "\h[[:alnum:]_:]*" contained
369endif
370
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371" All other # are comments, except ^#!
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000372syn match perlComment "#.*" contains=perlTodo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373syn match perlSharpBang "^#!.*"
374
375" Formats
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000376syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
378syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained
379syn match perlFormatField "[@^]#[#.]*" contained
380syn match perlFormatField "@\*" contained
381syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
382syn match perlFormatField "@$" contained
383
384" __END__ and __DATA__ clauses
385if exists("perl_fold")
386 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
387else
388 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
389endif
390
391
392"
393" Folding
394
395if exists("perl_fold")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000396 if !exists("perl_nofold_packages")
397 syn region perlPackageFold start="^package \S\+;\s*\(#.*\)\=$" end="^1;\s*\(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
398 endif
399 if !exists("perl_nofold_subs")
400 syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\(#.*\)\=$" transparent fold keepend
401 syn region perlSubFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
402 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000403
404 if exists("perl_fold_blocks")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000405 syn region perlBlockFold start="^\z(\s*\)\(if\|elsif\|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
406 syn region perlBlockFold start="^\z(\s*\)\(do\|else\)\(\s*{\)\=\s*\(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\(#.*\)\=$" transparent fold keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000407 endif
408
409 setlocal foldmethod=syntax
410 syn sync fromstart
411else
412 " fromstart above seems to set minlines even if perl_fold is not set.
413 syn sync minlines=0
414endif
415
416
417if version >= 508 || !exists("did_perl_syn_inits")
418 if version < 508
419 let did_perl_syn_inits = 1
420 command -nargs=+ HiLink hi link <args>
421 else
422 command -nargs=+ HiLink hi def link <args>
423 endif
424
425 " The default highlighting.
426 HiLink perlSharpBang PreProc
427 HiLink perlControl PreProc
428 HiLink perlInclude Include
429 HiLink perlSpecial Special
430 HiLink perlString String
431 HiLink perlCharacter Character
432 HiLink perlNumber Number
433 HiLink perlFloat Float
434 HiLink perlType Type
435 HiLink perlIdentifier Identifier
436 HiLink perlLabel Label
437 HiLink perlStatement Statement
438 HiLink perlConditional Conditional
439 HiLink perlRepeat Repeat
440 HiLink perlOperator Operator
441 HiLink perlFunction Function
442 HiLink perlFunctionPrototype perlFunction
443 HiLink perlComment Comment
444 HiLink perlTodo Todo
445 if exists("perl_string_as_statement")
446 HiLink perlStringStartEnd perlStatement
447 else
448 HiLink perlStringStartEnd perlString
449 endif
450 HiLink perlList perlStatement
451 HiLink perlMisc perlStatement
452 HiLink perlVarPlain perlIdentifier
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000453 HiLink perlVarPlain2 perlIdentifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454 HiLink perlFiledescRead perlIdentifier
455 HiLink perlFiledescStatement perlIdentifier
456 HiLink perlVarSimpleMember perlIdentifier
457 HiLink perlVarSimpleMemberName perlString
458 HiLink perlVarNotInMatches perlIdentifier
459 HiLink perlVarSlash perlIdentifier
460 HiLink perlQQ perlString
461 if version >= 600
462 HiLink perlHereDoc perlString
463 else
464 HiLink perlHereIdentifier perlStringStartEnd
465 HiLink perlUntilEOFDQ perlString
466 HiLink perlUntilEOFSQ perlString
467 HiLink perlUntilEmptyDQ perlString
468 HiLink perlUntilEmptySQ perlString
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000469 HiLink perlUntilEOF perlString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470 endif
471 HiLink perlStringUnexpanded perlString
472 HiLink perlSubstitutionSQ perlString
473 HiLink perlSubstitutionDQ perlString
474 HiLink perlSubstitutionSlash perlString
475 HiLink perlSubstitutionHash perlString
476 HiLink perlSubstitutionBracket perlString
477 HiLink perlSubstitutionCurly perlString
478 HiLink perlSubstitutionPling perlString
479 HiLink perlTranslationSlash perlString
480 HiLink perlTranslationHash perlString
481 HiLink perlTranslationBracket perlString
482 HiLink perlTranslationCurly perlString
483 HiLink perlMatch perlString
484 HiLink perlMatchStartEnd perlStatement
485 HiLink perlFormatName perlIdentifier
486 HiLink perlFormatField perlString
487 HiLink perlPackageDecl perlType
488 HiLink perlStorageClass perlType
489 HiLink perlPackageRef perlType
490 HiLink perlStatementPackage perlStatement
491 HiLink perlStatementSub perlStatement
492 HiLink perlStatementStorage perlStatement
493 HiLink perlStatementControl perlStatement
494 HiLink perlStatementScalar perlStatement
495 HiLink perlStatementRegexp perlStatement
496 HiLink perlStatementNumeric perlStatement
497 HiLink perlStatementList perlStatement
498 HiLink perlStatementHash perlStatement
499 HiLink perlStatementIOfunc perlStatement
500 HiLink perlStatementFiledesc perlStatement
501 HiLink perlStatementVector perlStatement
502 HiLink perlStatementFiles perlStatement
503 HiLink perlStatementFlow perlStatement
504 HiLink perlStatementScope perlStatement
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000505 HiLink perlStatementInclude perlStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506 HiLink perlStatementProc perlStatement
507 HiLink perlStatementSocket perlStatement
508 HiLink perlStatementIPC perlStatement
509 HiLink perlStatementNetwork perlStatement
510 HiLink perlStatementPword perlStatement
511 HiLink perlStatementTime perlStatement
512 HiLink perlStatementMisc perlStatement
513 HiLink perlStatementNew perlStatement
514 HiLink perlFunctionName perlIdentifier
515 HiLink perlMethod perlIdentifier
516 HiLink perlFunctionPRef perlType
517 HiLink perlPOD perlComment
518 HiLink perlShellCommand perlString
519 HiLink perlSpecialAscii perlSpecial
520 HiLink perlSpecialDollar perlSpecial
521 HiLink perlSpecialString perlSpecial
522 HiLink perlSpecialStringU perlSpecial
523 HiLink perlSpecialMatch perlSpecial
524 HiLink perlSpecialBEOM perlSpecial
525 HiLink perlDATA perlComment
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000526
527 HiLink perlBrackets Error
528
Bram Moolenaar071d4272004-06-13 20:20:40 +0000529 " Possible errors
530 HiLink perlNotEmptyLine Error
531 HiLink perlElseIfError Error
532
533 delcommand HiLink
534endif
535
536" Syncing to speed up processing
537"
538if !exists("perl_no_sync_on_sub")
539 syn sync match perlSync grouphere NONE "^\s*\<package\s"
540 syn sync match perlSync grouphere perlFunction "^\s*\<sub\s"
541 syn sync match perlSync grouphere NONE "^}"
542endif
543
544if !exists("perl_no_sync_on_global_var")
545 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
546 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
547endif
548
549if exists("perl_sync_dist")
550 execute "syn sync maxlines=" . perl_sync_dist
551else
552 syn sync maxlines=100
553endif
554
555syn sync match perlSyncPOD grouphere perlPOD "^=pod"
556syn sync match perlSyncPOD grouphere perlPOD "^=head"
557syn sync match perlSyncPOD grouphere perlPOD "^=item"
558syn sync match perlSyncPOD grouphere NONE "^=cut"
559
560let b:current_syntax = "perl"
561
562" vim: ts=8