blob: 3d323fbb96991ca98fbfb9ce2159960249d15bd2 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Fortran95 (and Fortran90, Fortran77, F and elf90)
Bram Moolenaareb3593b2006-04-22 22:33:57 +00003" Version: 0.88
Bram Moolenaar071d4272004-06-13 20:20:40 +00004" URL: http://www.unb.ca/chem/ajit/syntax/fortran.vim
Bram Moolenaar5c736222010-01-06 20:54:52 +01005" Last Change: 2008 Nov 01
Bram Moolenaar071d4272004-06-13 20:20:40 +00006" 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.
Bram Moolenaar910f66f2006-04-05 20:41:53 +000077 let b:lmax = 250
Bram Moolenaar071d4272004-06-13 20:20:40 +000078 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +000097if b:fortran_dialect !=? "f77"
Bram Moolenaar071d4272004-06-13 20:20:40 +000098 if version >= 600
99 if b:fortran_fixed_source == 1
100 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
101 else
102 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
103 endif
104 if exists("fortran_more_precise")
105 syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
106 syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
107 syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
108 endif
109 else
110 if b:fortran_fixed_source == 1
111 syn match fortranConstructName "^\s\{6,}\a\w*\s*:"
112 else
113 syn match fortranConstructName "^\s*\a\w*\s*:"
114 endif
115 endif
116endif
117
118syn match fortranUnitHeader "\<end\>"
119
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000120syn match fortranType "\<character\>"
121syn match fortranType "\<complex\>"
122syn match fortranType "\<integer\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123syn keyword fortranType intrinsic
124syn match fortranType "\<implicit\>"
125syn keyword fortranStructure dimension
126syn keyword fortranStorageClass parameter save
127syn match fortranUnitHeader "\<subroutine\>"
128syn keyword fortranCall call
129syn match fortranUnitHeader "\<function\>"
130syn match fortranUnitHeader "\<program\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000131syn keyword fortranKeyword return stop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132syn keyword fortranConditional else then
133syn match fortranConditional "\<if\>"
134syn match fortranRepeat "\<do\>"
135
136syn keyword fortranTodo contained todo fixme
137
138"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000139syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140syn match fortranParenError ")"
141
142syn match fortranOperator "\.\s*n\=eqv\s*\."
143syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
144syn match fortranOperator "\(+\|-\|/\|\*\)"
145
146syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
147
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000148syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149
150"If tabs are allowed then the left margin checks do not work
151if exists("fortran_have_tabs")
152 syn match fortranTab "\t" transparent
153else
154 syn match fortranTab "\t"
155endif
156
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000157syn keyword fortranIO access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000159syn keyword fortran66Intrinsic alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
161" Intrinsics provided by some vendors
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000162syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama erf erfc gamma iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000164syn keyword fortran77Intrinsic abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
166syn match fortran77Intrinsic "\<real\s*("me=s+4
167syn match fortranType "\<implicit\s\+real"
168syn match fortranType "^\s*real\>"
169syn match fortran90Intrinsic "\<logical\s*("me=s+7
170syn match fortranType "\<implicit\s\+logical"
171syn match fortranType "^\s*logical\>"
172
173"Numbers of various sorts
174" Integers
175syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
176" floating point number, without a decimal point
177syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
178" floating point number, starting with a decimal point
179syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
180" floating point number, no digits after decimal
181syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
182" floating point number, D or Q exponents
183syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number
185syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" Numbers in formats
187syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
188syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
189syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
190syn match fortranFormatSpec display "\d\+x\>"
191" The next match cannot be used because it would pick up identifiers as well
192" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
193
194" Numbers as labels
195syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
196syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
197syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
198syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
199syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
200
201if version >= 600 && exists("fortran_more_precise")
202 " Numbers as targets
203 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
204 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
205 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
206endif
207
208syn keyword fortranTypeEx external
209syn keyword fortranIOEx format
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000210syn keyword fortranKeywordEx continue
211syn match fortranKeywordEx "\<go\s*to\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
213syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000214syn keyword fortranKeywordOb assign pause to
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215
216if b:fortran_dialect != "f77"
217
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000218 syn match fortranType "\<type\>"
219 syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
221 syn keyword fortranStructure private public intent optional
222 syn keyword fortranStructure pointer target allocatable
223 syn keyword fortranStorageClass in out
224 syn match fortranStorageClass "\<kind\s*="me=s+4
225 syn match fortranStorageClass "\<len\s*="me=s+3
226
227 syn match fortranUnitHeader "\<module\>"
228 syn keyword fortranUnitHeader use only contains
229 syn keyword fortranUnitHeader result operator assignment
230 syn match fortranUnitHeader "\<interface\>"
231 syn match fortranUnitHeader "\<recursive\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000232 syn keyword fortranKeyword allocate deallocate nullify cycle exit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233 syn match fortranConditional "\<select\>"
234 syn keyword fortranConditional case default where elsewhere
235
236 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
237 syn match fortranOperator "=>"
238
239 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
240 syn keyword fortranIO pad position action delim readwrite
241 syn keyword fortranIO eor advance nml
242
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000243 syn keyword fortran90Intrinsic adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack precision present product radix random_number random_seed range repeat reshape rrspacing
244 syn keyword fortran90Intrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
247
248 syn match fortranUnitHeader "\<end\s*function"
249 syn match fortranUnitHeader "\<end\s*interface"
250 syn match fortranUnitHeader "\<end\s*module"
251 syn match fortranUnitHeader "\<end\s*program"
252 syn match fortranUnitHeader "\<end\s*subroutine"
253 syn match fortranRepeat "\<end\s*do"
254 syn match fortranConditional "\<end\s*where"
255 syn match fortranConditional "\<select\s*case"
256 syn match fortranConditional "\<end\s*select"
257 syn match fortranType "\<end\s*type"
258 syn match fortranType "\<in\s*out"
259
260 syn keyword fortranUnitHeaderEx procedure
261 syn keyword fortranIOEx namelist
262 syn keyword fortranConditionalEx while
263 syn keyword fortran90IntrinsicEx achar iachar transfer
264
265 syn keyword fortranInclude include
266 syn keyword fortran90StorageClassR sequence
267endif
268
269syn match fortranConditional "\<end\s*if"
270syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
271syn match fortranConditional "\<else\s*if"
272
273syn keyword fortranUnitHeaderR entry
274syn match fortranTypeR display "double\s\+precision"
275syn match fortranTypeR display "double\s\+complex"
276syn match fortranUnitHeaderR display "block\s\+data"
277syn keyword fortranStorageClassR common equivalence data
278syn keyword fortran77IntrinsicR dble dprod
279syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
280syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
281
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000282if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283 syn keyword fortranRepeat forall
284 syn match fortranRepeat "\<end\s*forall"
285 syn keyword fortran95Intrinsic null cpu_time
286 syn match fortranType "\<elemental\>"
287 syn match fortranType "\<pure\>"
288 if exists("fortran_more_precise")
289 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
290 endif
291endif
292
293syn cluster fortranCommentGroup contains=fortranTodo
294
295if (b:fortran_fixed_source == 1)
296 if !exists("fortran_have_tabs")
297 "Flag items beyond column 72
298 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
299 "Flag left margin errors
300 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
301 syn match fortranLabelError "^.\{4}\d\S"
302 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100303 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304 syn match fortranLeftMargin transparent "^ \{5}"
305 syn match fortranContinueMark display "^.\{5}\S"lc=5
306else
307 syn match fortranContinueMark display "&"
308endif
309
310if b:fortran_dialect != "f77"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000311 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312endif
313
314"cpp is often used with Fortran
315syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
316syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
317syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
318syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
319syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
320syn match cIncluded contained "<[^>]*>"
321syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
322
323"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000324if exists("fortran_fold") || exists("fortran_more_precise")
325 syn sync fromstart
326elseif (b:fortran_fixed_source == 0)
327 syn sync linecont "&" minlines=20
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328else
329 syn sync minlines=20
330endif
331
332if version >= 600 && exists("fortran_fold")
333
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334 if (b:fortran_fixed_source == 1)
335 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
336 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000337 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 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
339 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
340 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
341 else
342 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
343 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000344 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
Bram Moolenaar071d4272004-06-13 20:20:40 +0000345 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
346 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
347 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
348 endif
349
350 if exists("fortran_fold_conditionals")
351 if (b:fortran_fixed_source == 1)
352 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
353 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
354 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
355 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
356 else
357 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
358 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
359 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
360 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
361 endif
362 endif
363
364 if exists("fortran_fold_multilinecomments")
365 if (b:fortran_fixed_source == 1)
366 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
367 else
368 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
369 endif
370 endif
371endif
372
373" Define the default highlighting.
374" For version 5.7 and earlier: only when not done already
375" For version 5.8 and later: only when an item doesn't have highlighting yet
376if version >= 508 || !exists("did_fortran_syn_inits")
377 if version < 508
378 let did_fortran_syn_inits = 1
379 command -nargs=+ HiLink hi link <args>
380 else
381 command -nargs=+ HiLink hi def link <args>
382 endif
383
384 " The default highlighting differs for each dialect.
385 " Transparent groups:
386 " fortranParen, fortranLeftMargin
387 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
388 " fortranBlockData
389 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
390 " fortranMultiCommentLines
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000391 HiLink fortranKeyword Keyword
392 HiLink fortranConstructName Identifier
393 HiLink fortranConditional Conditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394 HiLink fortranRepeat Repeat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000395 HiLink fortranTodo Todo
396 HiLink fortranContinueMark Todo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 HiLink fortranString String
398 HiLink fortranNumber Number
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000399 HiLink fortranOperator Operator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000400 HiLink fortranBoolean Boolean
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000401 HiLink fortranLabelError Error
402 HiLink fortranObsolete Todo
403 HiLink fortranType Type
404 HiLink fortranStructure Type
405 HiLink fortranStorageClass StorageClass
406 HiLink fortranCall fortranUnitHeader
407 HiLink fortranUnitHeader fortranPreCondit
408 HiLink fortranReadWrite Keyword
409 HiLink fortranIO Keyword
410 HiLink fortran95Intrinsic fortran90Intrinsic
411 HiLink fortran77Intrinsic fortran90Intrinsic
412 HiLink fortran90Intrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413
414 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000415 HiLink fortranKeywordOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000416 HiLink fortran66Intrinsic fortranObsolete
417 HiLink fortran77IntrinsicR fortranObsolete
418 HiLink fortranUnitHeaderR fortranObsolete
419 HiLink fortranTypeR fortranObsolete
420 HiLink fortranStorageClassR fortranObsolete
421 HiLink fortran90StorageClassR fortranObsolete
422 HiLink fortran77OperatorR fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000423 HiLink fortranInclude fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424 else
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000425 HiLink fortranKeywordOb fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426 HiLink fortran66Intrinsic fortran90Intrinsic
427 HiLink fortran77IntrinsicR fortran90Intrinsic
428 HiLink fortranUnitHeaderR fortranPreCondit
429 HiLink fortranTypeR fortranType
430 HiLink fortranStorageClassR fortranStorageClass
431 HiLink fortran77OperatorR fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000432 HiLink fortranInclude Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433 HiLink fortran90StorageClassR fortranStorageClass
434 endif
435
436 if ( b:fortran_dialect == "F" )
437 HiLink fortranLabelNumber fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000438 HiLink fortranTarget fortranObsolete
439 HiLink fortranFormatSpec fortranObsolete
440 HiLink fortranFloatDExp fortranObsolete
441 HiLink fortranFloatNoDec fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442 HiLink fortranFloatIniDec fortranObsolete
443 HiLink fortranFloatEndDec fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000444 HiLink fortranTypeEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000445 HiLink fortranIOEx fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000446 HiLink fortranKeywordEx fortranObsolete
447 HiLink fortranStringEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000448 HiLink fortran77IntrinsicEx fortranObsolete
449 HiLink fortranUnitHeaderEx fortranObsolete
450 HiLink fortranConditionalEx fortranObsolete
451 HiLink fortran90IntrinsicEx fortranObsolete
452 else
453 HiLink fortranLabelNumber Special
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000454 HiLink fortranTarget Special
455 HiLink fortranFormatSpec Identifier
456 HiLink fortranFloatDExp fortranFloat
457 HiLink fortranFloatNoDec fortranFloat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000458 HiLink fortranFloatIniDec fortranFloat
459 HiLink fortranFloatEndDec fortranFloat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000460 HiLink fortranTypeEx fortranType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000461 HiLink fortranIOEx fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000462 HiLink fortranKeywordEx fortranKeyword
463 HiLink fortranStringEx fortranString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464 HiLink fortran77IntrinsicEx fortran90Intrinsic
465 HiLink fortranUnitHeaderEx fortranUnitHeader
466 HiLink fortranConditionalEx fortranConditional
467 HiLink fortran90IntrinsicEx fortran90Intrinsic
468 endif
469
470 HiLink fortranFloat Float
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000471 HiLink fortranPreCondit PreCondit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000472 HiLink fortranInclude Include
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000473 HiLink cIncluded fortranString
474 HiLink cInclude Include
475 HiLink cPreProc PreProc
476 HiLink cPreCondit PreCondit
477 HiLink fortranParenError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000478 HiLink fortranComment Comment
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000479 HiLink fortranSerialNumber Todo
480 HiLink fortranTab Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000481 " Vendor extensions
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000482 HiLink fortranExtraIntrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483
484 delcommand HiLink
485endif
486
487let b:current_syntax = "fortran"
488
489" vim: ts=8 tw=132