xref: /vim-8.2.3635/runtime/syntax/fortran.vim (revision 0fa313a7)
1" 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
527