blob: ff566e1687fc48fa339f4617a6cdf55bff32235c [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 Moolenaara5792f52005-11-23 21:25:05 +00004" Last Change: 2005 October 18
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")
Bram Moolenaara5792f52005-11-23 21:25:05 +000050 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000051 syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold
52 else
Bram Moolenaara5792f52005-11-23 21:25:05 +000053 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +000054 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")
Bram Moolenaara5792f52005-11-23 21:25:05 +000059 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Spell fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000060 else
Bram Moolenaara5792f52005-11-23 21:25:05 +000061 syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000062 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 Moolenaara5792f52005-11-23 21:25:05 +000090 " if BEGIN/END is a keyword the perlBEGINENDFold does not work
91 syn match perlControl "\<BEGIN\|END\|CHECK\|INIT\>" 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
Bram Moolenaara5792f52005-11-23 21:25:05 +0000111syn match perlStatementInclude "\<\(use\|no\)\s\+\(\(attributes\|autouse\|base\|big\(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\|fields\|filetest\|if\|integer\|less\|lib\|locale\|open\|ops\|overload\|re\|sigtrap\|sort\|strict\|subs\|threads\(::shared\)\=\|utf8\|vars\|vmsish\|warnings\(::register\)\=\)\>\)\="
112
Bram Moolenaar071d4272004-06-13 20:20:40 +0000113syn 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
Bram Moolenaara5792f52005-11-23 21:25:05 +0000121if !exists("perl_no_semi_keywords")
122 syn keyword perlStatementScope import
123 syn keyword perlStatementNew new
124 syn keyword perlStatementCarp carp confess croak
125endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000126syn keyword perlTodo TODO TBD FIXME XXX contained
127
128" Perl Identifiers.
129"
130" Should be cleaned up to better handle identifiers in particular situations
131" (in hash keys for example)
132"
133" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
134" We do not process complex things such as @{${"foo"}}. Too complicated, and
135" too slow. And what is after the -> is *not* considered as part of the
136" variable - there again, too complicated and too slow.
137
138" Special variables first ($^A, ...) and ($|, $', ...)
139syn match perlVarPlain "$^[ADEFHILMOPSTWX]\="
Bram Moolenaara5792f52005-11-23 21:25:05 +0000140syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~?@$<>(-]"
141syn match perlVarPlain "$\(0\|[1-9]\d*\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
143syn match perlVarPlain "$:[^:]"
144" These variables are not recognized within matches.
145syn match perlVarNotInMatches "$[|)]"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000146" This variable is not recognized within matches delimited by '/'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147syn match perlVarSlash "$/"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000148" This variable is not recognized within matches delimited by '!'.
149syn match perlVarBang "$!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150
151" And plain identifiers
152syn match perlPackageRef "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
153
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154" FIXME value between {} should be marked as string. is treated as such by Perl.
155" At the moment it is marked as something greyish instead of read. Probably todo
156" with transparency. Or maybe we should handle the bare word in that case. or make it into
157
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000158if !exists("perl_no_scope_in_variables")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159 syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
160 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
161else
162 syn match perlVarPlain "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
163 syn match perlFunctionName "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
164endif
165
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000166if !exists("perl_no_extended_vars")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000167 syn cluster perlExpr contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBang,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168 syn region perlVarBlock matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
169 syn region perlVarBlock matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
170 syn match perlVarPlain "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
171 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
172 syn match perlVarSimpleMember "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
173 syn match perlVarSimpleMemberName "\I\i*" contained
174 syn region perlVarMember matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
175 syn match perlMethod "\(->\)\I\i*" contained
176endif
177
178" File Descriptors
179syn match perlFiledescRead "[<]\h\w\+[>]"
180
181syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
Bram Moolenaara5792f52005-11-23 21:25:05 +0000182syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^,[:space:]]"me=e-1 transparent contained contains=perlFiledescStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183
184syn match perlFiledescStatement "\u\w*" contained
185
186" Special characters in strings and matches
187syn match perlSpecialString "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
188syn match perlSpecialStringU "\\['\\]" contained
Bram Moolenaara5792f52005-11-23 21:25:05 +0000189syn match perlSpecialMatch "{\d\+\(,\d*\)\=}" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190syn match perlSpecialMatch "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
191syn match perlSpecialMatch "[+*()?.]" contained
192syn match perlSpecialMatch "(?[#:=!]" contained
Bram Moolenaara5792f52005-11-23 21:25:05 +0000193syn match perlSpecialMatch "(?<[=!]" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194syn match perlSpecialMatch "(?[imsx]\+)" contained
195" FIXME the line below does not work. It should mark end of line and
196" begin of line as perlSpecial.
197" syn match perlSpecialBEOM "^\^\|\$$" contained
198
199" Possible errors
200"
201" Highlight lines with only whitespace (only in blank delimited here documents) as errors
202syn match perlNotEmptyLine "^\s\+$" contained
203" Highlight '} else if (...) {', it should be '} else { if (...) { ' or
204" '} elsif (...) {'.
205"syn keyword perlElseIfError if contained
206
207" Variable interpolation
208"
209" These items are interpolated inside "" strings and similar constructs.
Bram Moolenaara5792f52005-11-23 21:25:05 +0000210syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBang,perlVarBlock
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211" These items are interpolated inside '' strings and similar constructs.
212syn cluster perlInterpSQ contains=perlSpecialStringU
213" These items are interpolated inside m// matches and s/// substitutions.
214syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
215" These items are interpolated inside m## matches and s### substitutions.
Bram Moolenaara5792f52005-11-23 21:25:05 +0000216syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash,perlVarBang
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217
218" Shell commands
219syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
220
221" Constants
222"
223" Numbers
224syn match perlNumber "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
225syn match perlFloat "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
226syn match perlFloat "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
227syn match perlFloat "[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\="
228
229
230" Simple version of searches and matches
231" caters for m//, m##, m{} and m[] (and the !/ variant)
232syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
233syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
234syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
235syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch
236
237" A special case for m!!x which allows for comments and extra whitespace in the pattern
238syn region perlMatch matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment
239
240" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
241" cases as the / is used in so many other ways, but these should be the most obvious ones.
Bram Moolenaara5792f52005-11-23 21:25:05 +0000242syn 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/[^=[:space:][:digit:]$@%&]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
Bram Moolenaar071d4272004-06-13 20:20:40 +0000243
244
245" Substitutions
246" caters for s///, s### and s[][]
247" perlMatch is the first part, perlSubstitution* is the substitution part
248syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
249syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
250syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
251syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
252syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
253syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
254syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
255syn region perlSubstitutionDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
256syn region perlSubstitutionSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
257syn region perlSubstitutionHash matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
258syn region perlSubstitutionBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
259syn region perlSubstitutionCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
260
Bram Moolenaara5792f52005-11-23 21:25:05 +0000261" A special case for s!!!x which allows for comments and extra whitespace in the pattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262syn region perlMatch matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
263syn region perlSubstitutionPling matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
264
265" Substitutions
266" caters for tr///, tr### and tr[][]
267" perlMatch is the first part, perlTranslation* is the second, translator part.
268syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
269syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
270syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
271syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
272syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
273syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
274syn region perlTranslationSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
275syn region perlTranslationDQ matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
276syn region perlTranslationSlash matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
277syn region perlTranslationHash matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
278syn region perlTranslationBracket matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
279syn region perlTranslationCurly matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
280
281
282" The => operator forces a bareword to the left of it to be interpreted as
283" a string
284syn match perlString "\<\I\i*\s*=>"me=e-2
285
286" Strings and q, qq, qw and qr expressions
287
Bram Moolenaara5792f52005-11-23 21:25:05 +0000288" Parentheses in qq()
289syn region perlParens start=+(+ end=+)+ contained transparent contains=perlParens,@perlStringSQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290
Bram Moolenaara5792f52005-11-23 21:25:05 +0000291syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@Spell,@perlInterpSQ
292syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@Spell,@perlInterpDQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293syn region perlQQ matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
294syn region perlQQ matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
Bram Moolenaara5792f52005-11-23 21:25:05 +0000295syn region perlQQ matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlParens
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
298syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
299syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
Bram Moolenaara5792f52005-11-23 21:25:05 +0000300syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlParens
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
302syn region perlQQ matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
303syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw#+ end=+#+ contains=@perlInterpSQ
304syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw|+ end=+|+ contains=@perlInterpSQ
Bram Moolenaara5792f52005-11-23 21:25:05 +0000305syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw(+ end=+)+ contains=@perlInterpSQ,perlParens
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw{+ end=+}+ contains=@perlInterpSQ
307syn region perlQQ matchgroup=perlStringStartEnd start=+\<qw/+ end=+/+ contains=@perlInterpSQ
308syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr#+ end=+#[imosx]*+ contains=@perlInterpMatch
309syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr|+ end=+|[imosx]*+ contains=@perlInterpMatch
310syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr(+ end=+)[imosx]*+ contains=@perlInterpMatch
311syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr{+ end=+}[imosx]*+ contains=@perlInterpMatch
312syn region perlQQ matchgroup=perlStringStartEnd start=+\<qr/+ end=+/[imosx]*+ contains=@perlInterpSlash
313
314" Constructs such as print <<EOF [...] EOF, 'here' documents
315"
316if version >= 600
317 " XXX Any statements after the identifier are in perlString colour (i.e.
318 " 'if $a' in 'print <<EOF if $a').
319 if exists("perl_fold")
320 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ fold
321 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
322 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
323 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold
324 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold
325 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
326 else
327 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+^\z1$+ contains=@perlInterpDQ
328 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
329 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
330 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine
331 syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine
332 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
333 endif
334else
335 syn match perlUntilEOFStart "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
336 syn match perlUntilEOFStart "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
337 syn match perlUntilEOFStart "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
338 syn match perlUntilEOFStart "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
339 syn match perlUntilEOFStart "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
340 syn region perlUntilEOFDQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
341 syn region perlUntilEOFSQ matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
342 syn region perlUntilEmptySQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
343 syn region perlUntilEmptyDQ matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
344 syn match perlHereIdentifier "<<EOF"
345 syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
346endif
347
348
349" Class declarations
350"
351syn match perlPackageDecl "^\s*\<package\s\+\S\+" contains=perlStatementPackage
352syn keyword perlStatementPackage package contained
353
354" Functions
355" sub [name] [(prototype)] {
356"
357syn region perlFunction start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
358syn keyword perlStatementSub sub contained
359
360syn match perlFunctionPrototype "([^)]*)" contained
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361if !exists("perl_no_scope_in_variables")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362 syn match perlFunctionPRef "\h\w*::" contained
363 syn match perlFunctionName "\h\w*[^:]" contained
364else
365 syn match perlFunctionName "\h[[:alnum:]_:]*" contained
366endif
367
368
369" All other # are comments, except ^#!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000370syn match perlComment "#.*" contains=@Spell,perlTodo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371syn match perlSharpBang "^#!.*"
372
373" Formats
374syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
375syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
376syn match perlFormatField "[@^][|<>~]\+\(\.\.\.\)\=" contained
377syn match perlFormatField "[@^]#[#.]*" contained
378syn match perlFormatField "@\*" contained
379syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
380syn match perlFormatField "@$" contained
381
382" __END__ and __DATA__ clauses
383if exists("perl_fold")
384 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
385else
386 syntax region perlDATA start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
387endif
388
389
390"
391" Folding
392
393if exists("perl_fold")
394 syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="\n\+package"me=s-1 transparent fold keepend
395 syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000396 syn region perlBEGINENDFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397
398 if exists("perl_fold_blocks")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000399 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*$" start="\z(\s*\)else\s*{\s*$" end="^\z1}\s*;\=$" transparent fold keepend
400 syn region perlIfFold start="^\z(\s*\)do\(\s*{\)\=\s*$" end="^\z1}\s*while" end="^\z1}\s*;\=$" transparent fold keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000401 endif
402
403 setlocal foldmethod=syntax
404 syn sync fromstart
405else
406 " fromstart above seems to set minlines even if perl_fold is not set.
407 syn sync minlines=0
408endif
409
410
411if version >= 508 || !exists("did_perl_syn_inits")
412 if version < 508
413 let did_perl_syn_inits = 1
414 command -nargs=+ HiLink hi link <args>
415 else
416 command -nargs=+ HiLink hi def link <args>
417 endif
418
419 " The default highlighting.
420 HiLink perlSharpBang PreProc
421 HiLink perlControl PreProc
422 HiLink perlInclude Include
423 HiLink perlSpecial Special
424 HiLink perlString String
425 HiLink perlCharacter Character
426 HiLink perlNumber Number
427 HiLink perlFloat Float
428 HiLink perlType Type
429 HiLink perlIdentifier Identifier
430 HiLink perlLabel Label
431 HiLink perlStatement Statement
432 HiLink perlConditional Conditional
433 HiLink perlRepeat Repeat
434 HiLink perlOperator Operator
435 HiLink perlFunction Function
436 HiLink perlFunctionPrototype perlFunction
437 HiLink perlComment Comment
438 HiLink perlTodo Todo
439 if exists("perl_string_as_statement")
440 HiLink perlStringStartEnd perlStatement
441 else
442 HiLink perlStringStartEnd perlString
443 endif
444 HiLink perlList perlStatement
445 HiLink perlMisc perlStatement
446 HiLink perlVarPlain perlIdentifier
447 HiLink perlFiledescRead perlIdentifier
448 HiLink perlFiledescStatement perlIdentifier
449 HiLink perlVarSimpleMember perlIdentifier
450 HiLink perlVarSimpleMemberName perlString
451 HiLink perlVarNotInMatches perlIdentifier
452 HiLink perlVarSlash perlIdentifier
Bram Moolenaara5792f52005-11-23 21:25:05 +0000453 HiLink perlVarBang perlIdentifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454 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
Bram Moolenaara5792f52005-11-23 21:25:05 +0000463 HiLink perlUntilEOF perlString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464 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
Bram Moolenaara5792f52005-11-23 21:25:05 +0000499 HiLink perlStatementInclude perlInclude
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500 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
Bram Moolenaara5792f52005-11-23 21:25:05 +0000520
521 HiLink perlParens Error
522
Bram Moolenaar071d4272004-06-13 20:20:40 +0000523 " Possible errors
524 HiLink perlNotEmptyLine Error
525 HiLink perlElseIfError Error
526
527 delcommand HiLink
528endif
529
530" Syncing to speed up processing
531"
532if !exists("perl_no_sync_on_sub")
533 syn sync match perlSync grouphere NONE "^\s*\<package\s"
534 syn sync match perlSync grouphere perlFunction "^\s*\<sub\s"
535 syn sync match perlSync grouphere NONE "^}"
536endif
537
538if !exists("perl_no_sync_on_global_var")
539 syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
540 syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
541endif
542
543if exists("perl_sync_dist")
544 execute "syn sync maxlines=" . perl_sync_dist
545else
546 syn sync maxlines=100
547endif
548
549syn sync match perlSyncPOD grouphere perlPOD "^=pod"
550syn sync match perlSyncPOD grouphere perlPOD "^=head"
551syn sync match perlSyncPOD grouphere perlPOD "^=item"
552syn sync match perlSyncPOD grouphere NONE "^=cut"
553
554let b:current_syntax = "perl"
555
556" vim: ts=8