blob: ae1fa8b19196cfb9f75748f9377ec1843c178675 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Fortran95 (and Fortran90, Fortran77, F and elf90)
3" Version: 0.86
4" URL: http://www.unb.ca/chem/ajit/syntax/fortran.vim
5" Last Change: 2003 Mar. 12
6" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
7" Usage: Do :help fortran-syntax from Vim
8" Credits:
9" Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and
10" Preben Guldberg. Useful suggestions were made by: Andrej Panjkov,
11" Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
12" Walter Dieudonné, Alexander Wagner, Roman Bertle, Charles Rendleman,
13" and Andrew Griffiths. For instructions on use, do :help fortran from vim
14
15" For version 5.x: Clear all syntax items
16" For version 6.x: Quit if a syntax file is already loaded
17if version < 600
18 syntax clear
19elseif exists("b:current_syntax")
20 finish
21endif
22
23" let b:fortran_dialect = fortran_dialect if set correctly by user
24if exists("fortran_dialect")
25 if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
26 let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
27 else
28 echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
29 let b:fortran_dialect = "unknown"
30 endif
31else
32 let b:fortran_dialect = "unknown"
33endif
34
35" fortran_dialect not set or set incorrectly by user,
36if b:fortran_dialect == "unknown"
37 " set b:fortran_dialect from directive in first three lines of file
38 let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
39 if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
40 let b:fortran_dialect = "F"
41 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
42 let b:fortran_dialect = "elf"
43 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
44 let b:fortran_dialect = "f90"
45 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
46 let b:fortran_dialect = "f95"
47 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
48 let b:fortran_dialect = "f77"
49 else
50 " no directive found, so assume f95
51 let b:fortran_dialect = "f95"
52 endif
53 unlet b:fortran_retype
54endif
55
56" Choose between fixed and free source form if this hasn't been done yet
57if !exists("b:fortran_fixed_source")
58 if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
59 " elf and F require free source form
60 let b:fortran_fixed_source = 0
61 elseif b:fortran_dialect == "f77"
62 " f77 requires fixed source form
63 let b:fortran_fixed_source = 1
64 elseif exists("fortran_free_source")
65 " User guarantees free source form for all f90 and f95 files
66 let b:fortran_fixed_source = 0
67 elseif exists("fortran_fixed_source")
68 " User guarantees fixed source form for all f90 and f95 files
69 let b:fortran_fixed_source = 1
70 else
71 " f90 and f95 allow both fixed and free source form.
72 " Assume fixed source form unless signs of free source form
73 " are detected in the first five columns of the first b:lmax lines.
74 " Detection becomes more accurate and time-consuming if more lines
75 " are checked. Increase the limit below if you keep lots of comments at
76 " the very top of each file and you have a fast computer.
77 let b:lmax = 25
78 if ( b:lmax > line("$") )
79 let b:lmax = line("$")
80 endif
81 let b:fortran_fixed_source = 1
82 let b:ln=1
83 while b:ln <= b:lmax
84 let b:test = strpart(getline(b:ln),0,5)
85 if b:test[0] !~ '[Cc*!#]' && b:test !~ '^ \+[!#]' && b:test =~ '[^ 0-9\t]'
86 let b:fortran_fixed_source = 0
87 break
88 endif
89 let b:ln = b:ln + 1
90 endwhile
91 unlet b:lmax b:ln b:test
92 endif
93endif
94
95syn case ignore
96
97if b:fortran_dialect == "f77"
98 syn match fortranIdentifier "\<\a\(\a\|\d\)*\>" contains=fortranSerialNumber
99else
100 syn match fortran90Identifier "\<\a\w*\>" contains=fortranSerialNumber
101 if version >= 600
102 if b:fortran_fixed_source == 1
103 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
104 else
105 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
106 endif
107 if exists("fortran_more_precise")
108 syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
109 syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
110 syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
111 endif
112 else
113 if b:fortran_fixed_source == 1
114 syn match fortranConstructName "^\s\{6,}\a\w*\s*:"
115 else
116 syn match fortranConstructName "^\s*\a\w*\s*:"
117 endif
118 endif
119endif
120
121syn match fortranUnitHeader "\<end\>"
122
123syn keyword fortranType character complex integer
124syn keyword fortranType intrinsic
125syn match fortranType "\<implicit\>"
126syn keyword fortranStructure dimension
127syn keyword fortranStorageClass parameter save
128syn match fortranUnitHeader "\<subroutine\>"
129syn keyword fortranCall call
130syn match fortranUnitHeader "\<function\>"
131syn match fortranUnitHeader "\<program\>"
132syn keyword fortranStatement return stop
133syn keyword fortranConditional else then
134syn match fortranConditional "\<if\>"
135syn match fortranRepeat "\<do\>"
136
137syn keyword fortranTodo contained todo fixme
138
139"Catch errors caused by too many right parentheses
140syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded
141syn match fortranParenError ")"
142
143syn match fortranOperator "\.\s*n\=eqv\s*\."
144syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
145syn match fortranOperator "\(+\|-\|/\|\*\)"
146
147syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
148
149syn keyword fortranReadWrite backspace close inquire open rewind endfile
150syn keyword fortranReadWrite read write print
151
152"If tabs are allowed then the left margin checks do not work
153if exists("fortran_have_tabs")
154 syn match fortranTab "\t" transparent
155else
156 syn match fortranTab "\t"
157endif
158
159syn keyword fortranIO unit file iostat access blank fmt form
160syn keyword fortranIO recl status exist opened number named name
161syn keyword fortranIO sequential direct rec
162syn keyword fortranIO formatted unformatted nextrec
163
164syn keyword fortran66Intrinsic cabs ccos cexp clog csin csqrt
165syn keyword fortran66Intrinsic dacos dasin datan datan2 dcos dcosh
166syn keyword fortran66Intrinsic ddim dexp dint dlog dlog10 dmod dabs
167syn keyword fortran66Intrinsic dnint dsign dsin dsinh dsqrt dtan
168syn keyword fortran66Intrinsic dtanh iabs idim idnint isign idint ifix
169syn keyword fortran66Intrinsic amax0 amax1 dmax1 max0 max1
170syn keyword fortran66Intrinsic amin0 amin1 dmin1 min0 min1
171syn keyword fortran66Intrinsic amod float sngl alog alog10
172
173" Intrinsics provided by some vendors
174syn keyword fortranExtraIntrinsic cdabs cdcos cdexp cdlog cdsin cdsqrt
175syn keyword fortranExtraIntrinsic cqabs cqcos cqexp cqlog cqsin cqsqrt
176syn keyword fortranExtraIntrinsic qacos qasin qatan qatan2 qcos qcosh
177syn keyword fortranExtraIntrinsic qdim qexp iqint qlog qlog10 qmod qabs
178syn keyword fortranExtraIntrinsic qnint qsign qsin qsinh qsqrt qtan
179syn keyword fortranExtraIntrinsic qtanh qmax1 qmin1
180syn keyword fortranExtraIntrinsic dimag qimag dcmplx qcmplx dconjg qconjg
181syn keyword fortranExtraIntrinsic gamma dgamma qgamma algama dlgama qlgama
182syn keyword fortranExtraIntrinsic erf derf qerf erfc derfc qerfc
183syn keyword fortranExtraIntrinsic dfloat
184
185syn keyword fortran77Intrinsic abs acos aimag aint anint asin atan atan2
186syn keyword fortran77Intrinsic cos sin tan sinh cosh tanh exp log log10
187syn keyword fortran77Intrinsic sign sqrt int cmplx nint min max conjg
188syn keyword fortran77Intrinsic char ichar index
189syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
190syn match fortran77Intrinsic "\<real\s*("me=s+4
191syn match fortranType "\<implicit\s\+real"
192syn match fortranType "^\s*real\>"
193syn match fortran90Intrinsic "\<logical\s*("me=s+7
194syn match fortranType "\<implicit\s\+logical"
195syn match fortranType "^\s*logical\>"
196
197"Numbers of various sorts
198" Integers
199syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
200" floating point number, without a decimal point
201syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
202" floating point number, starting with a decimal point
203syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
204" floating point number, no digits after decimal
205syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
206" floating point number, D or Q exponents
207syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
208" floating point number
209syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
210" Numbers in formats
211syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
212syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
213syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
214syn match fortranFormatSpec display "\d\+x\>"
215" The next match cannot be used because it would pick up identifiers as well
216" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
217
218" Numbers as labels
219syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
220syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
221syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
222syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
223syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
224
225if version >= 600 && exists("fortran_more_precise")
226 " Numbers as targets
227 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
228 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
229 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
230endif
231
232syn keyword fortranTypeEx external
233syn keyword fortranIOEx format
234syn keyword fortranStatementEx continue
235syn match fortranStatementEx "\<go\s*to\>"
236syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
237syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
238syn keyword fortranStatementOb assign pause to
239
240if b:fortran_dialect != "f77"
241
242 syn keyword fortranType type none
243
244 syn keyword fortranStructure private public intent optional
245 syn keyword fortranStructure pointer target allocatable
246 syn keyword fortranStorageClass in out
247 syn match fortranStorageClass "\<kind\s*="me=s+4
248 syn match fortranStorageClass "\<len\s*="me=s+3
249
250 syn match fortranUnitHeader "\<module\>"
251 syn keyword fortranUnitHeader use only contains
252 syn keyword fortranUnitHeader result operator assignment
253 syn match fortranUnitHeader "\<interface\>"
254 syn match fortranUnitHeader "\<recursive\>"
255 syn keyword fortranStatement allocate deallocate nullify cycle exit
256 syn match fortranConditional "\<select\>"
257 syn keyword fortranConditional case default where elsewhere
258
259 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
260 syn match fortranOperator "=>"
261
262 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
263 syn keyword fortranIO pad position action delim readwrite
264 syn keyword fortranIO eor advance nml
265
266 syn keyword fortran90Intrinsic adjustl adjustr all allocated any
267 syn keyword fortran90Intrinsic associated bit_size btest ceiling
268 syn keyword fortran90Intrinsic count cshift date_and_time
269 syn keyword fortran90Intrinsic digits dot_product eoshift epsilon exponent
270 syn keyword fortran90Intrinsic floor fraction huge iand ibclr ibits ibset ieor
271 syn keyword fortran90Intrinsic ior ishft ishftc lbound len_trim
272 syn keyword fortran90Intrinsic matmul maxexponent maxloc maxval merge
273 syn keyword fortran90Intrinsic minexponent minloc minval modulo mvbits nearest
274 syn keyword fortran90Intrinsic pack present product radix random_number
275 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
276 syn keyword fortran90Intrinsic random_seed range repeat reshape rrspacing scale
277 syn keyword fortran90Intrinsic selected_int_kind selected_real_kind scan
278 syn keyword fortran90Intrinsic shape size spacing spread set_exponent
279 syn keyword fortran90Intrinsic tiny transpose trim ubound unpack verify
280 syn keyword fortran90Intrinsic precision sum system_clock
281 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
282
283 syn match fortranUnitHeader "\<end\s*function"
284 syn match fortranUnitHeader "\<end\s*interface"
285 syn match fortranUnitHeader "\<end\s*module"
286 syn match fortranUnitHeader "\<end\s*program"
287 syn match fortranUnitHeader "\<end\s*subroutine"
288 syn match fortranRepeat "\<end\s*do"
289 syn match fortranConditional "\<end\s*where"
290 syn match fortranConditional "\<select\s*case"
291 syn match fortranConditional "\<end\s*select"
292 syn match fortranType "\<end\s*type"
293 syn match fortranType "\<in\s*out"
294
295 syn keyword fortranUnitHeaderEx procedure
296 syn keyword fortranIOEx namelist
297 syn keyword fortranConditionalEx while
298 syn keyword fortran90IntrinsicEx achar iachar transfer
299
300 syn keyword fortranInclude include
301 syn keyword fortran90StorageClassR sequence
302endif
303
304syn match fortranConditional "\<end\s*if"
305syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
306syn match fortranConditional "\<else\s*if"
307
308syn keyword fortranUnitHeaderR entry
309syn match fortranTypeR display "double\s\+precision"
310syn match fortranTypeR display "double\s\+complex"
311syn match fortranUnitHeaderR display "block\s\+data"
312syn keyword fortranStorageClassR common equivalence data
313syn keyword fortran77IntrinsicR dble dprod
314syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
315syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
316
317if b:fortran_dialect == "f95"
318 syn keyword fortranRepeat forall
319 syn match fortranRepeat "\<end\s*forall"
320 syn keyword fortran95Intrinsic null cpu_time
321 syn match fortranType "\<elemental\>"
322 syn match fortranType "\<pure\>"
323 if exists("fortran_more_precise")
324 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
325 endif
326endif
327
328syn cluster fortranCommentGroup contains=fortranTodo
329
330if (b:fortran_fixed_source == 1)
331 if !exists("fortran_have_tabs")
332 "Flag items beyond column 72
333 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
334 "Flag left margin errors
335 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
336 syn match fortranLabelError "^.\{4}\d\S"
337 endif
338 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup
339 syn match fortranLeftMargin transparent "^ \{5}"
340 syn match fortranContinueMark display "^.\{5}\S"lc=5
341else
342 syn match fortranContinueMark display "&"
343endif
344
345if b:fortran_dialect != "f77"
346 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup
347endif
348
349"cpp is often used with Fortran
350syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
351syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
352syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
353syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
354syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
355syn match cIncluded contained "<[^>]*>"
356syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
357
358"Synchronising limits assume that comment and continuation lines are not mixed
359if (b:fortran_fixed_source == 0)
360 syn sync linecont "&" maxlines=40
361else
362 syn sync minlines=20
363endif
364
365if version >= 600 && exists("fortran_fold")
366
367 syn sync fromstart
368 if (b:fortran_fixed_source == 1)
369 syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
370 syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
371 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
372 syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
373 syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
374 syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
375 else
376 syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
377 syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
378 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
379 syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
380 syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
381 syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
382 endif
383
384 if exists("fortran_fold_conditionals")
385 if (b:fortran_fixed_source == 1)
386 syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
387 syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
388 syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
389 syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
390 else
391 syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
392 syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
393 syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
394 syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
395 endif
396 endif
397
398 if exists("fortran_fold_multilinecomments")
399 if (b:fortran_fixed_source == 1)
400 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
401 else
402 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
403 endif
404 endif
405endif
406
407" Define the default highlighting.
408" For version 5.7 and earlier: only when not done already
409" For version 5.8 and later: only when an item doesn't have highlighting yet
410if version >= 508 || !exists("did_fortran_syn_inits")
411 if version < 508
412 let did_fortran_syn_inits = 1
413 command -nargs=+ HiLink hi link <args>
414 else
415 command -nargs=+ HiLink hi def link <args>
416 endif
417
418 " The default highlighting differs for each dialect.
419 " Transparent groups:
420 " fortranParen, fortranLeftMargin
421 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
422 " fortranBlockData
423 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
424 " fortranMultiCommentLines
425 HiLink fortranStatement Statement
426 HiLink fortranConstructName Special
427 HiLink fortranConditional Conditional
428 HiLink fortranRepeat Repeat
429 HiLink fortranTodo Todo
430 HiLink fortranContinueMark Todo
431 HiLink fortranString String
432 HiLink fortranNumber Number
433 HiLink fortranOperator Operator
434 HiLink fortranBoolean Boolean
435 HiLink fortranLabelError Error
436 HiLink fortranObsolete Todo
437 HiLink fortranType Type
438 HiLink fortranStructure Type
439 HiLink fortranStorageClass StorageClass
440 HiLink fortranCall fortranUnitHeader
441 HiLink fortranUnitHeader fortranPreCondit
442 HiLink fortranReadWrite fortran90Intrinsic
443 HiLink fortranIO fortran90Intrinsic
444 HiLink fortran95Intrinsic fortran90Intrinsic
445 HiLink fortran77Intrinsic fortran90Intrinsic
446 HiLink fortran90Intrinsic Special
447
448 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
449 HiLink fortranStatementOb fortranObsolete
450 HiLink fortran66Intrinsic fortranObsolete
451 HiLink fortran77IntrinsicR fortranObsolete
452 HiLink fortranUnitHeaderR fortranObsolete
453 HiLink fortranTypeR fortranObsolete
454 HiLink fortranStorageClassR fortranObsolete
455 HiLink fortran90StorageClassR fortranObsolete
456 HiLink fortran77OperatorR fortranObsolete
457 HiLink fortranInclude fortranObsolete
458 else
459 HiLink fortranStatementOb Statement
460 HiLink fortran66Intrinsic fortran90Intrinsic
461 HiLink fortran77IntrinsicR fortran90Intrinsic
462 HiLink fortranUnitHeaderR fortranPreCondit
463 HiLink fortranTypeR fortranType
464 HiLink fortranStorageClassR fortranStorageClass
465 HiLink fortran77OperatorR fortranOperator
466 HiLink fortranInclude Include
467 HiLink fortran90StorageClassR fortranStorageClass
468 endif
469
470 if ( b:fortran_dialect == "F" )
471 HiLink fortranLabelNumber fortranObsolete
472 HiLink fortranTarget fortranObsolete
473 HiLink fortranFormatSpec fortranObsolete
474 HiLink fortranFloatDExp fortranObsolete
475 HiLink fortranFloatNoDec fortranObsolete
476 HiLink fortranFloatIniDec fortranObsolete
477 HiLink fortranFloatEndDec fortranObsolete
478 HiLink fortranTypeEx fortranObsolete
479 HiLink fortranIOEx fortranObsolete
480 HiLink fortranStatementEx fortranObsolete
481 HiLink fortranStringEx fortranObsolete
482 HiLink fortran77IntrinsicEx fortranObsolete
483 HiLink fortranUnitHeaderEx fortranObsolete
484 HiLink fortranConditionalEx fortranObsolete
485 HiLink fortran90IntrinsicEx fortranObsolete
486 else
487 HiLink fortranLabelNumber Special
488 HiLink fortranTarget Special
489 HiLink fortranFormatSpec Identifier
490 HiLink fortranFloatDExp fortranFloat
491 HiLink fortranFloatNoDec fortranFloat
492 HiLink fortranFloatIniDec fortranFloat
493 HiLink fortranFloatEndDec fortranFloat
494 HiLink fortranTypeEx fortranType
495 HiLink fortranIOEx fortranIO
496 HiLink fortranStatementEx fortranStatement
497 HiLink fortranStringEx fortranString
498 HiLink fortran77IntrinsicEx fortran90Intrinsic
499 HiLink fortranUnitHeaderEx fortranUnitHeader
500 HiLink fortranConditionalEx fortranConditional
501 HiLink fortran90IntrinsicEx fortran90Intrinsic
502 endif
503
504 HiLink fortranFloat Float
505 HiLink fortran90Identifier fortranIdentifier
506 "Uncomment the next line if you want all fortran variables to be highlighted
507 "HiLink fortranIdentifier Identifier
508 HiLink fortranPreCondit PreCondit
509 HiLink fortranInclude Include
510 HiLink cIncluded fortranString
511 HiLink cInclude Include
512 HiLink cPreProc PreProc
513 HiLink cPreCondit PreCondit
514 HiLink fortranParenError Error
515 HiLink fortranComment Comment
516 HiLink fortranSerialNumber Todo
517 HiLink fortranTab Error
518 " Vendor extensions
519 HiLink fortranExtraIntrinsic Special
520
521 delcommand HiLink
522endif
523
524let b:current_syntax = "fortran"
525
526" vim: ts=8 tw=132