]> ruderich.org/simon Gitweb - config/dotfiles.git/blob - vim/syntax/perl.vim
securemodelines: Allow disabling of the plugin.
[config/dotfiles.git] / vim / syntax / perl.vim
1 " Vim syntax file
2 " Language:     Perl
3 " Maintainer:   Nick Hibma <nick@van-laarhoven.org>
4 " Last Change:  2007 March 13
5 " Location:     http://www.van-laarhoven.org/vim/syntax/perl.vim
6 "
7 " Please download most recent version first before mailing
8 " any comments.
9 " See also the file perl.vim.regression.pl to check whether your
10 " modifications work in the most odd cases
11 " http://www.van-laarhoven.org/vim/syntax/perl.vim.regression.pl
12 "
13 " Original version: Sonia Heimann <niania@netsurf.org>
14 " Thanks to many people for their contribution.
15
16 " The following parameters are available for tuning the
17 " perl syntax highlighting, with defaults given:
18 "
19 " unlet perl_include_pod
20 " unlet perl_want_scope_in_variables
21 " unlet perl_extended_vars
22 " unlet perl_string_as_statement
23 " unlet perl_no_sync_on_sub
24 " unlet perl_no_sync_on_global_var
25 " let perl_sync_dist = 100
26 " unlet perl_fold
27 " unlet perl_fold_blocks
28 " let perl_nofold_packages = 1
29 " let perl_nofold_subs = 1
30
31 " Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file
32 " was already loaded (6.x).
33 if version < 600
34   syntax clear
35 elseif exists("b:current_syntax")
36   finish
37 endif
38
39 " Unset perl_fold if it set but vim doesn't support it.
40 if version < 600 && exists("perl_fold")
41   unlet perl_fold
42 endif
43
44
45 " POD starts with ^=<word> and ends with ^=cut
46
47 if 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")
52     syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold
53     syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold
54   else
55     syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
56     syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
57   endif
58 else
59   " Use only the bare minimum of rules
60   if exists("perl_fold")
61     syn region perlPOD start="^=[a-z]" end="^=cut" fold
62   else
63     syn region perlPOD start="^=[a-z]" end="^=cut"
64   endif
65 endif
66
67
68 " All keywords
69 "
70 if 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
75 else
76   syn keyword perlConditional           if elsif unless
77   syn keyword perlConditional           else nextgroup=perlElseIfError skipwhite skipnl skipempty
78 endif
79 syn keyword perlConditional             switch eq ne gt lt ge le cmp not and or xor err
80 if 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\>"
87 else
88   syn keyword perlRepeat                while for foreach do until continue
89 endif
90 syn keyword perlOperator                defined undef and or not bless ref
91 if exists("perl_fold")
92   " if BEGIN/END would be a keyword the perlBEGINENDFold does not work
93   syn match perlControl                 "\<BEGIN\|CHECK\|INIT\|END\>" contained
94 else
95   syn keyword perlControl               BEGIN END CHECK INIT
96 endif
97
98 syn keyword perlStatementStorage        my local our
99 syn keyword perlStatementControl        goto return last next redo
100 syn keyword perlStatementScalar         chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst
101 syn keyword perlStatementRegexp         pos quotemeta split study
102 syn keyword perlStatementNumeric        abs atan2 cos exp hex int log oct rand sin sqrt srand
103 syn keyword perlStatementList           splice unshift shift push pop split join reverse grep map sort unpack
104 syn keyword perlStatementHash           each exists keys values tie tied untie
105 syn keyword perlStatementIOfunc         carp confess croak dbmclose dbmopen die syscall
106 syn keyword perlStatementFiledesc       binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma skipwhite
107 syn keyword perlStatementFiledesc       fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma skipwhite
108 syn keyword perlStatementVector         pack vec
109 syn keyword perlStatementFiles          chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime
110 syn match   perlStatementFiles          "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
111 syn keyword perlStatementFlow           caller die dump eval exit wantarray
112 syn keyword perlStatementInclude        require
113 syn match   perlStatementInclude        "\<\(use\|no\)\s\+\(\(integer\|strict\|lib\|sigtrap\|subs\|vars\|warnings\|utf8\|byte\|base\|fields\)\>\)\="
114 syn keyword perlStatementScope          import
115 syn keyword perlStatementProc           alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid
116 syn keyword perlStatementSocket         accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
117 syn keyword perlStatementIPC            msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
118 syn keyword perlStatementNetwork        endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
119 syn keyword perlStatementPword          getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent endgrent
120 syn keyword perlStatementTime           gmtime localtime time times
121
122 syn keyword perlStatementMisc           warn formline reset scalar delete prototype lock
123 syn keyword perlStatementNew            new
124
125 syn 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 ($|, $', ...)
138 syn match  perlVarPlain          "$^[ADEFHILMOPSTWX]\="
139 syn match  perlVarPlain          "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
140 syn match  perlVarPlain          "$\(0\|[1-9][0-9]*\)"
141 " Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
142 syn match  perlVarPlain          "$:[^:]"
143 " These variables are not recognized within matches.
144 syn match  perlVarNotInMatches   "$[|)]"
145 " This variable is not recognized within matches delimited by m//.
146 syn match  perlVarSlash          "$/"
147
148 " And plain identifiers
149 syn match  perlPackageRef        "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
150
151 " 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
156 " 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
160 if 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
163   syn match  perlFunctionName   "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
164 else
165   syn match  perlVarPlain       "\\\=\([@$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
166   syn match  perlVarPlain2      "\\\=%\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
167   syn match  perlFunctionName   "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
168 endif
169
170 if 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
172   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
180 endif
181
182 " File Descriptors
183 syn match  perlFiledescRead     "[<]\h\w\+[>]"
184
185 syn match  perlFiledescStatementComma   "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
186 syn match  perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
187
188 syn match  perlFiledescStatement        "\u\w*" contained
189
190 " Special characters in strings and matches
191 syn match  perlSpecialString    "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
192 syn match  perlSpecialStringU   "\\['\\]" contained
193 syn match  perlSpecialMatch     "{\d\+\(,\(\d\+\)\=\)\=}" contained
194 syn match  perlSpecialMatch     "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
195 syn match  perlSpecialMatch     "[+*()?.]" contained
196 syn match  perlSpecialMatch     "(?[#:=!]" contained
197 syn 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
205 syn 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.
213 syn cluster perlInterpDQ        contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock,@Spell
214 " These items are interpolated inside '' strings and similar constructs.
215 syn cluster perlInterpSQ        contains=perlSpecialStringU,@Spell
216 " These items are interpolated inside m// matches and s/// substitutions.
217 syn cluster perlInterpSlash     contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM,@Spell
218 " These items are interpolated inside m## matches and s### substitutions.
219 syn cluster perlInterpMatch     contains=@perlInterpSlash,perlVarSlash,@Spell
220
221 " Shell commands
222 syn region  perlShellCommand    matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
223
224 " Constants
225 "
226 " Numbers
227 syn match  perlNumber   "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
228 syn match  perlFloat    "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
229 syn match  perlFloat    "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
230 syn 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)
235 syn region perlMatch    matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
236 syn region perlMatch    matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
237 syn region perlMatch    matchgroup=perlMatchStartEnd start=+[m!]{+ end=+}[cgimosx]*+ contains=@perlInterpMatch
238 syn 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
241 syn 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.
245 syn region perlMatch    matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^while /+lc=5 start=+[^$@%]\<while /+lc=6 start=+^if /+lc=2 start=+[^$@%]\<if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
246
247
248 " Substitutions
249 " caters for s///, s### and s[][]
250 " perlMatch is the first part, perlSubstitution* is the substitution part
251 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s'+  end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
252 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s"+  end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
253 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s/+  end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
254 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s#+  end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
255 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
256 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
257 syn region perlSubstitutionSQ           matchgroup=perlMatchStartEnd start=+'+  end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
258 syn region perlSubstitutionDQ           matchgroup=perlMatchStartEnd start=+"+  end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
259 syn region perlSubstitutionSlash        matchgroup=perlMatchStartEnd start=+/+  end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
260 syn region perlSubstitutionHash         matchgroup=perlMatchStartEnd start=+#+  end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
261 syn region perlSubstitutionBracket      matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
262 syn region perlSubstitutionCurly        matchgroup=perlMatchStartEnd start=+{+  end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
263
264 " A special case for m!!x which allows for comments and extra whitespace in the pattern
265 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
266 syn 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.
271 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
272 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
273 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
274 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
275 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
276 syn region perlMatch    matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
277 syn region perlTranslationSQ            matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
278 syn region perlTranslationDQ            matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
279 syn region perlTranslationSlash         matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
280 syn region perlTranslationHash          matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
281 syn region perlTranslationBracket       matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
282 syn 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
287 syn match  perlString "\<\I\i*\s*=>"me=e-2
288
289 " Strings and q, qq, qw and qr expressions
290
291 " Brackets in qq()
292 syn region perlBrackets start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
293
294 syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
295 syn region perlString           matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ
296 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
297 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
298 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
299 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
300 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
301 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
302 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
303 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
304 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
305 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
306 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qw#+  end=+#+ contains=@perlInterpSQ
307 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qw|+  end=+|+ contains=@perlInterpSQ
308 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qw(+  end=+)+ contains=@perlInterpSQ,perlBrackets
309 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qw{+  end=+}+ contains=@perlInterpSQ
310 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qw/+  end=+/+ contains=@perlInterpSQ
311 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qr#+  end=+#[imosx]*+ contains=@perlInterpMatch
312 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qr|+  end=+|[imosx]*+ contains=@perlInterpMatch
313 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qr(+  end=+)[imosx]*+ contains=@perlInterpMatch
314 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qr{+  end=+}[imosx]*+ contains=@perlInterpMatch
315 syn region perlQQ               matchgroup=perlStringStartEnd start=+\<qr/+  end=+/[imosx]*+ contains=@perlInterpSlash
316
317 " Constructs such as print <<EOF [...] EOF, 'here' documents
318 "
319 if version >= 600
320   " XXX Any statements after the identifier are in perlString colour (i.e.
321   " 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
322   " seems due to the 'auto-extending nature' of regions.
323   if exists("perl_fold")
324     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\z(\I\i*\).*+    end=+^\z1$+ contains=@perlInterpDQ fold
325     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
326     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
327     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*""+           end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine fold
328     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*''+           end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine fold
329     syn region perlAutoload     matchgroup=perlStringStartEnd start=+<<['"]\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)['"]+ end=+^\z1$+ contains=ALL fold
330   else
331     syn region perlHereDoc1     matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+      end=+^\z1$+ contains=perlhereDocRestOfLine keepend
332     syn region perlhereDocRestOfLine    start=+.+ end=+$+ nextgroup=perlHereDocDocument
333     syn region perlHereDocDocument      start=+.+ end=+.+ contains=@perlInterpDQ
334     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*"\z(.\{-}\)"+ end=+^\z1$+ contains=@perlInterpDQ
335     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*'\z(.\{-}\)'+ end=+^\z1$+ contains=@perlInterpSQ
336     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*""+           end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine
337     syn region perlHereDoc      matchgroup=perlStringStartEnd start=+<<\s*''+           end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine
338     syn region perlAutoload     matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\z(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
339   endif
340 else
341   syn match perlUntilEOFStart   "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
342   syn match perlUntilEOFStart   "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
343   syn match perlUntilEOFStart   "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
344   syn match perlUntilEOFStart   "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
345   syn match perlUntilEOFStart   "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
346   syn region perlUntilEOFDQ     matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
347   syn region perlUntilEOFSQ     matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
348   syn region perlUntilEmptySQ   matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
349   syn region perlUntilEmptyDQ   matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
350   syn match perlHereIdentifier  "<<EOF"
351   syn region perlAutoload       matchgroup=perlStringStartEnd start=+<<\(['"]\|\)\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\(END_\(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)$+ contains=ALL
352 endif
353
354
355 " Class declarations
356 "
357 syn match  perlPackageDecl      "^\s*\<package\s\+\S\+" contains=perlStatementPackage
358 syn keyword perlStatementPackage        package contained
359
360 " Functions
361 "       sub [name] [(prototype)] {
362 "
363 syn region perlFunction         start="\s*\<sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
364 syn keyword perlStatementSub    sub contained
365
366 syn match  perlFunctionPrototype        "([^)]*)" contained
367 if exists("perl_want_scope_in_variables")
368    syn match  perlFunctionPRef  "\h\w*::" contained
369    syn match  perlFunctionName  "\h\w*[^:]" contained
370 else
371    syn match  perlFunctionName  "\h[[:alnum:]_:]*" contained
372 endif
373
374 " All other # are comments, except ^#!
375 syn match  perlComment          "#.*" contains=perlTodo,@Spell
376 syn match  perlSharpBang        "^#!.*"
377
378 " Formats
379 syn region perlFormat           matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
380 syn match  perlFormatName       "format\s\+\k\+\s*="lc=7,me=e-1 contained
381 syn match  perlFormatField      "[@^][|<>~]\+\(\.\.\.\)\=" contained
382 syn match  perlFormatField      "[@^]#[#.]*" contained
383 syn match  perlFormatField      "@\*" contained
384 syn match  perlFormatField      "@[^A-Za-z_|<>~#*]"me=e-1 contained
385 syn match  perlFormatField      "@$" contained
386
387 " __END__ and __DATA__ clauses
388 if exists("perl_fold")
389   syntax region perlDATA                start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA fold
390 else
391   syntax region perlDATA                start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD,@perlDATA
392 endif
393
394
395 "
396 " Folding
397
398 if exists("perl_fold")
399   if !exists("perl_nofold_packages")
400     syn region perlPackageFold start="^package \S\+;\s*\(#.*\)\=$" end="^1;\s*\(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
401   endif
402   if !exists("perl_nofold_subs")
403     syn region perlSubFold     start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\(#.*\)\=$" transparent fold keepend
404     syn region perlSubFold start="^\z(\s*\)\<\(BEGIN\|END\|CHECK\|INIT\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
405   endif
406
407   if exists("perl_fold_blocks")
408     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
409     syn region perlBlockFold start="^\z(\s*\)\(do\|else\)\(\s*{\)\=\s*\(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\(#.*\)\=$" transparent fold keepend
410   endif
411
412   setlocal foldmethod=syntax
413   syn sync fromstart
414 else
415   " fromstart above seems to set minlines even if perl_fold is not set.
416   syn sync minlines=0
417 endif
418
419
420 if version >= 508 || !exists("did_perl_syn_inits")
421   if version < 508
422     let did_perl_syn_inits = 1
423     command -nargs=+ HiLink hi link <args>
424   else
425     command -nargs=+ HiLink hi def link <args>
426   endif
427
428   " The default highlighting.
429   HiLink perlSharpBang          PreProc
430   HiLink perlControl            PreProc
431   HiLink perlInclude            Include
432   HiLink perlSpecial            Special
433   HiLink perlString             String
434   HiLink perlCharacter          Character
435   HiLink perlNumber             Number
436   HiLink perlFloat              Float
437   HiLink perlType               Type
438   HiLink perlIdentifier         Identifier
439   HiLink perlLabel              Label
440   HiLink perlStatement          Statement
441   HiLink perlConditional        Conditional
442   HiLink perlRepeat             Repeat
443   HiLink perlOperator           Operator
444   HiLink perlFunction           Function
445   HiLink perlFunctionPrototype  perlFunction
446   HiLink perlComment            Comment
447   HiLink perlTodo               Todo
448   if exists("perl_string_as_statement")
449     HiLink perlStringStartEnd   perlStatement
450   else
451     HiLink perlStringStartEnd   perlString
452   endif
453   HiLink perlList               perlStatement
454   HiLink perlMisc               perlStatement
455   HiLink perlVarPlain           perlIdentifier
456   HiLink perlVarPlain2          perlIdentifier
457   HiLink perlFiledescRead       perlIdentifier
458   HiLink perlFiledescStatement  perlIdentifier
459   HiLink perlVarSimpleMember    perlIdentifier
460   HiLink perlVarSimpleMemberName perlString
461   HiLink perlVarNotInMatches    perlIdentifier
462   HiLink perlVarSlash           perlIdentifier
463   HiLink perlQQ                 perlString
464   if version >= 600
465     HiLink perlHereDoc          perlString
466   else
467     HiLink perlHereIdentifier   perlStringStartEnd
468     HiLink perlUntilEOFDQ       perlString
469     HiLink perlUntilEOFSQ       perlString
470     HiLink perlUntilEmptyDQ     perlString
471     HiLink perlUntilEmptySQ     perlString
472     HiLink perlUntilEOF         perlString
473   endif
474   HiLink perlStringUnexpanded   perlString
475   HiLink perlSubstitutionSQ     perlString
476   HiLink perlSubstitutionDQ     perlString
477   HiLink perlSubstitutionSlash  perlString
478   HiLink perlSubstitutionHash   perlString
479   HiLink perlSubstitutionBracket perlString
480   HiLink perlSubstitutionCurly  perlString
481   HiLink perlSubstitutionPling  perlString
482   HiLink perlTranslationSlash   perlString
483   HiLink perlTranslationHash    perlString
484   HiLink perlTranslationBracket perlString
485   HiLink perlTranslationCurly   perlString
486   HiLink perlMatch              perlString
487   HiLink perlMatchStartEnd      perlStatement
488   HiLink perlFormatName         perlIdentifier
489   HiLink perlFormatField        perlString
490   HiLink perlPackageDecl        perlType
491   HiLink perlStorageClass       perlType
492   HiLink perlPackageRef         perlType
493   HiLink perlStatementPackage   perlStatement
494   HiLink perlStatementSub       perlStatement
495   HiLink perlStatementStorage   perlStatement
496   HiLink perlStatementControl   perlStatement
497   HiLink perlStatementScalar    perlStatement
498   HiLink perlStatementRegexp    perlStatement
499   HiLink perlStatementNumeric   perlStatement
500   HiLink perlStatementList      perlStatement
501   HiLink perlStatementHash      perlStatement
502   HiLink perlStatementIOfunc    perlStatement
503   HiLink perlStatementFiledesc  perlStatement
504   HiLink perlStatementVector    perlStatement
505   HiLink perlStatementFiles     perlStatement
506   HiLink perlStatementFlow      perlStatement
507   HiLink perlStatementScope     perlStatement
508   HiLink perlStatementInclude   perlStatement
509   HiLink perlStatementProc      perlStatement
510   HiLink perlStatementSocket    perlStatement
511   HiLink perlStatementIPC       perlStatement
512   HiLink perlStatementNetwork   perlStatement
513   HiLink perlStatementPword     perlStatement
514   HiLink perlStatementTime      perlStatement
515   HiLink perlStatementMisc      perlStatement
516   HiLink perlStatementNew       perlStatement
517   HiLink perlFunctionName       perlIdentifier
518   HiLink perlMethod             perlIdentifier
519   HiLink perlFunctionPRef       perlType
520   HiLink perlPOD                perlComment
521   HiLink perlShellCommand       perlString
522   HiLink perlSpecialAscii       perlSpecial
523   HiLink perlSpecialDollar      perlSpecial
524   HiLink perlSpecialString      perlSpecial
525   HiLink perlSpecialStringU     perlSpecial
526   HiLink perlSpecialMatch       perlSpecial
527   HiLink perlSpecialBEOM        perlSpecial
528   HiLink perlDATA               perlComment
529
530   HiLink perlBrackets           Error
531
532   " Possible errors
533   HiLink perlNotEmptyLine       Error
534   HiLink perlElseIfError        Error
535
536   delcommand HiLink
537 endif
538
539 " Syncing to speed up processing
540 "
541 if !exists("perl_no_sync_on_sub")
542   syn sync match perlSync       grouphere NONE "^\s*\<package\s"
543   syn sync match perlSync       grouphere perlFunction "^\s*\<sub\s"
544   syn sync match perlSync       grouphere NONE "^}"
545 endif
546
547 if !exists("perl_no_sync_on_global_var")
548   syn sync match perlSync       grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
549   syn sync match perlSync       grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
550 endif
551
552 if exists("perl_sync_dist")
553   execute "syn sync maxlines=" . perl_sync_dist
554 else
555   syn sync maxlines=100
556 endif
557
558 syn sync match perlSyncPOD      grouphere perlPOD "^=pod"
559 syn sync match perlSyncPOD      grouphere perlPOD "^=head"
560 syn sync match perlSyncPOD      grouphere perlPOD "^=item"
561 syn sync match perlSyncPOD      grouphere NONE "^=cut"
562
563 let b:current_syntax = "perl"
564
565 " vim: ts=8