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