1" Vim syntax file
2" Language:	Fortran95 (and Fortran90, Fortran77, F and elf90)
3" Version:	0.89
4" Last Change:	2010 July 21
5" Maintainer:	Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
6" Usage:	For instructions, do :help fortran-syntax from Vim
7" Credits:
8"  Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and
9"  Preben Guldberg. Useful suggestions were made by: Andrej Panjkov,
10"  Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
11"  Walter Dieudonn�, Alexander Wagner, Roman Bertle, Charles Rendleman,
12"  Andrew Griffiths, Joe Krahn, and Hendrik Merx.
13
14" For version 5.x: Clear all syntax items
15" For version 6.x: Quit if a syntax file is already loaded
16if version < 600
17  syntax clear
18elseif exists("b:current_syntax")
19  finish
20endif
21
22" let b:fortran_dialect = fortran_dialect if set correctly by user
23if exists("fortran_dialect")
24  if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
25    let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
26  else
27    echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
28    let b:fortran_dialect = "unknown"
29  endif
30else
31  let b:fortran_dialect = "unknown"
32endif
33
34" fortran_dialect not set or set incorrectly by user,
35if b:fortran_dialect == "unknown"
36  " set b:fortran_dialect from directive in first three lines of file
37  let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
38  if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
39    let b:fortran_dialect = "F"
40  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
41    let b:fortran_dialect = "elf"
42  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
43    let b:fortran_dialect = "f90"
44  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
45    let b:fortran_dialect = "f95"
46  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
47    let b:fortran_dialect = "f77"
48  else
49    " no directive found, so assume f95
50    let b:fortran_dialect = "f95"
51  endif
52  unlet b:fortran_retype
53endif
54
55" Choose between fixed and free source form if this hasn't been done yet
56if !exists("b:fortran_fixed_source")
57  if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
58    " elf and F require free source form
59    let b:fortran_fixed_source = 0
60  elseif b:fortran_dialect == "f77"
61    " f77 requires fixed source form
62    let b:fortran_fixed_source = 1
63  elseif exists("fortran_free_source")
64    " User guarantees free source form for all f90 and f95 files
65    let b:fortran_fixed_source = 0
66  elseif exists("fortran_fixed_source")
67    " User guarantees fixed source form for all f90 and f95 files
68    let b:fortran_fixed_source = 1
69  else
70    " f90 and f95 allow both fixed and free source form.
71    " Assume fixed source form unless signs of free source form
72    " are detected in the first five columns of the first s:lmax lines.
73    " Detection becomes more accurate and time-consuming if more lines
74    " are checked. Increase the limit below if you keep lots of comments at
75    " the very top of each file and you have a fast computer.
76    let s:lmax = 500
77    if ( s:lmax > line("$") )
78      let s:lmax = line("$")
79    endif
80    let b:fortran_fixed_source = 1
81    let s:ln=1
82    while s:ln <= s:lmax
83      let s:test = strpart(getline(s:ln),0,5)
84      if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
85	let b:fortran_fixed_source = 0
86	break
87      endif
88      let s:ln = s:ln + 1
89    endwhile
90    unlet! s:lmax s:ln s:test
91  endif
92endif
93
94syn case ignore
95
96if b:fortran_dialect !=? "f77"
97  if version >= 600
98    if b:fortran_fixed_source == 1
99      syn match fortranConstructName	"^\s\{6,}\zs\a\w*\ze\s*:"
100    else
101      syn match fortranConstructName	"^\s*\zs\a\w*\ze\s*:"
102    endif
103    if exists("fortran_more_precise")
104      syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
105      syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
106      syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
107    endif
108  else
109    if b:fortran_fixed_source == 1
110      syn match fortranConstructName	"^\s\{6,}\a\w*\s*:"
111    else
112      syn match fortranConstructName	"^\s*\a\w*\s*:"
113    endif
114  endif
115endif
116
117syn match   fortranUnitHeader	"\<end\>"
118
119syn match fortranType		"\<character\>"
120syn match fortranType		"\<complex\>"
121syn match fortranType		"\<integer\>"
122syn keyword fortranType		intrinsic
123syn match fortranType		"\<implicit\>"
124syn keyword fortranStructure	dimension
125syn keyword fortranStorageClass	parameter save
126syn match fortranUnitHeader	"\<subroutine\>"
127syn keyword fortranCall		call
128syn match fortranUnitHeader	"\<function\>"
129syn match fortranUnitHeader	"\<program\>"
130syn keyword fortranKeyword	return stop
131syn keyword fortranConditional	else then
132syn match fortranConditional	"\<if\>"
133syn match fortranRepeat		"\<do\>"
134
135syn keyword fortranTodo		contained todo fixme
136
137"Catch errors caused by too many right parentheses
138syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
139syn match  fortranParenError   ")"
140
141syn match fortranOperator	"\.\s*n\=eqv\s*\."
142syn match fortranOperator	"\.\s*\(and\|or\|not\)\s*\."
143syn match fortranOperator	"\(+\|-\|/\|\*\)"
144
145syn match fortranBoolean	"\.\s*\(true\|false\)\s*\."
146
147syn keyword fortranReadWrite	backspace close endfile inquire open print read rewind write
148
149"If tabs are allowed then the left margin checks do not work
150if exists("fortran_have_tabs")
151  syn match fortranTab		"\t"  transparent
152else
153  syn match fortranTab		"\t"
154endif
155
156syn keyword fortranIO		access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
157
158syn 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
159
160" Intrinsics provided by some vendors
161syn 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
162
163syn 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
164syn match fortran77Intrinsic	"\<len\s*[(,]"me=s+3
165syn match fortran77Intrinsic	"\<real\s*("me=s+4
166syn match fortranType		"\<implicit\s\+real"
167syn match fortranType		"^\s*real\>"
168syn match fortran90Intrinsic	"\<logical\s*("me=s+7
169syn match fortranType		"\<implicit\s\+logical"
170syn match fortranType		"^\s*logical\>"
171
172"Numbers of various sorts
173" Integers
174syn match fortranNumber	display "\<\d\+\(_\a\w*\)\=\>"
175" floating point number, without a decimal point
176syn match fortranFloatNoDec	display	"\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
177" floating point number, starting with a decimal point
178syn match fortranFloatIniDec	display	"\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
179" floating point number, no digits after decimal
180syn match fortranFloatEndDec	display	"\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
181" floating point number, D or Q exponents
182syn match fortranFloatDExp	display	"\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
183" floating point number
184syn match fortranFloat	display	"\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
185" Numbers in formats
186syn match fortranFormatSpec	display	"\d*f\d\+\.\d\+"
187syn match fortranFormatSpec	display	"\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
188syn match fortranFormatSpec	display	"\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
189syn match fortranFormatSpec	display	"\d\+x\>"
190" The next match cannot be used because it would pick up identifiers as well
191" syn match fortranFormatSpec	display	"\<\(a\|i\)\d\+"
192
193" Numbers as labels
194syn match fortranLabelNumber	display	"^\d\{1,5}\s"me=e-1
195syn match fortranLabelNumber	display	"^ \d\{1,4}\s"ms=s+1,me=e-1
196syn match fortranLabelNumber	display	"^  \d\{1,3}\s"ms=s+2,me=e-1
197syn match fortranLabelNumber	display	"^   \d\d\=\s"ms=s+3,me=e-1
198syn match fortranLabelNumber	display	"^    \d\s"ms=s+4,me=e-1
199
200if version >= 600 && exists("fortran_more_precise")
201  " Numbers as targets
202  syn match fortranTarget	display	"\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
203  syn match fortranTarget	display	"\(\<do\s\+\)\@<=\d\+\>"
204  syn match fortranTarget	display	"\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
205endif
206
207syn keyword fortranTypeEx	external
208syn keyword fortranIOEx		format
209syn match fortranKeywordEx	"\<continue\>"
210syn match fortranKeyword	"^\s*\d\+\s\+continue\>"
211syn match fortranKeywordEx	"\<go\s*to\>"
212syn region fortranStringEx	start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
213syn keyword fortran77IntrinsicEx	dim lge lgt lle llt mod
214syn keyword fortranKeywordOb	assign pause to
215
216if b:fortran_dialect != "f77"
217
218  syn match fortranType         "\<type\>"
219  syn keyword fortranType	none
220
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\>"
232  syn keyword fortranKeyword	allocate deallocate nullify cycle exit
233  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
243  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
245  syn match fortran90Intrinsic		"\<not\>\(\s*\.\)\@!"me=s+3
246  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
282if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
283  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
293if b:fortran_dialect == "f95"
294  " F2003
295  syn keyword fortran03Intrinsic        command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of
296  " ISO_C_binding
297  syn keyword fortran03Constant         c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
298  syn keyword fortran03Constant         c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
299  syn keyword fortran03Intrinsic        iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_f_procpointer
300  syn keyword fortran03Type             c_ptr c_funptr
301  " ISO_Fortran_env
302  syn keyword fortran03Constant         iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
303  " IEEE_arithmetic
304  syn keyword fortran03Intrinsic        ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
305
306  syn keyword fortran03ReadWrite	flush wait
307  syn keyword fortran03IO	        decimal round iomsg
308  syn keyword fortran03Type             asynchronous nopass non_overridable pass protected volatile abstract extends import
309  syn keyword fortran03Type             non_intrinsic value bind deferred generic final enumerator class
310  syn match fortran03Type               "\<associate\>"
311  syn match fortran03Type               "\<end\s*associate"
312  syn match fortran03Type               "\<enum\s*,\s*bind\s*(\s*c\s*)"
313  syn match fortran03Type               "\<end\s*enum"
314  syn match fortran03Conditional	"\<select\s*type"
315  syn match fortran03Conditional        "\<type\s*is\>"
316  syn match fortran03UnitHeader         "\<abstract\s*interface\>"
317  syn match fortran03Operator           "\([\|]\)"
318
319  " F2008
320  syn keyword fortran08Intrinsic        acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
321  syn keyword fortran08Intrinsic        atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
322  syn keyword fortran08Intrinsic        bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image
323  syn keyword fortran08IO               newunit
324  syn keyword fortran08Type             contiguous
325endif
326
327syn cluster fortranCommentGroup contains=fortranTodo
328
329if (b:fortran_fixed_source == 1)
330  if !exists("fortran_have_tabs")
331    "Flag items beyond column 72
332    syn match fortranSerialNumber	excludenl "^.\{73,}$"lc=72
333    "Flag left margin errors
334    syn match fortranLabelError	"^.\{-,4}[^0-9 ]" contains=fortranTab
335    syn match fortranLabelError	"^.\{4}\d\S"
336  endif
337  syn match fortranComment		excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
338  syn match fortranLeftMargin		transparent "^ \{5}"
339  syn match fortranContinueMark		display "^.\{5}\S"lc=5
340else
341  syn match fortranContinueMark		display "&"
342endif
343
344if b:fortran_dialect != "f77"
345  syn match fortranComment	excludenl "!.*$" contains=@fortranCommentGroup,@spell
346endif
347
348"cpp is often used with Fortran
349syn match	cPreProc		"^\s*#\s*\(define\|ifdef\)\>.*"
350syn match	cPreProc		"^\s*#\s*\(elif\|if\)\>.*"
351syn match	cPreProc		"^\s*#\s*\(ifndef\|undef\)\>.*"
352syn match	cPreCondit		"^\s*#\s*\(else\|endif\)\>.*"
353syn region	cIncluded	contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
354syn match	cIncluded		contained "<[^>]*>"
355syn match	cInclude		"^\s*#\s*include\>\s*["<]" contains=cIncluded
356
357"Synchronising limits assume that comment and continuation lines are not mixed
358if exists("fortran_fold") || exists("fortran_more_precise")
359  syn sync fromstart
360elseif (b:fortran_fixed_source == 0)
361  syn sync linecont "&" minlines=30
362else
363  syn sync minlines=30
364endif
365
366if version >= 600 && exists("fortran_fold")
367
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*\(\(\(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
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    syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
376  else
377    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
378    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
379    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
380    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
381    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
382    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
383    syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
384  endif
385
386  if exists("fortran_fold_conditionals")
387    if (b:fortran_fixed_source == 1)
388      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
389      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
390      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
391      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
392    else
393      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
394      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
395      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
396      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
397    endif
398  endif
399
400  if exists("fortran_fold_multilinecomments")
401    if (b:fortran_fixed_source == 1)
402      syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
403    else
404      syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
405    endif
406  endif
407endif
408
409" Define the default highlighting.
410" For version 5.7 and earlier: only when not done already
411" For version 5.8 and later: only when an item doesn't have highlighting yet
412if version >= 508 || !exists("did_fortran_syn_inits")
413  if version < 508
414    let did_fortran_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 differs for each dialect.
421  " Transparent groups:
422  " fortranParen, fortranLeftMargin
423  " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
424  " fortranBlockData
425  " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
426  " fortranMultiCommentLines
427  HiLink fortranKeyword 	Keyword
428  HiLink fortranConstructName	Identifier
429  HiLink fortran03Conditional	fortranConditional
430  HiLink fortranConditional	Conditional
431  HiLink fortranRepeat		Repeat
432  HiLink fortranTodo		Todo
433  if (b:fortran_fixed_source == 1)
434    HiLink fortranContinueMark	Todo
435  else
436    HiLink fortranContinueMark	Keyword
437  endif
438  HiLink fortranString		String
439  HiLink fortranNumber		Number
440  HiLink fortran03Operator	fortranOperator
441  HiLink fortranOperator	Operator
442  HiLink fortranBoolean		Boolean
443  HiLink fortranLabelError	Error
444  HiLink fortranObsolete	Todo
445  HiLink fortran03Type  	fortranType
446  HiLink fortran08Type	        fortranType
447  HiLink fortranType		Type
448  HiLink fortranStructure	Type
449  HiLink fortranStorageClass	StorageClass
450  HiLink fortranCall		Function
451  HiLink fortran03UnitHeader	fortranUnitHeader
452  HiLink fortranUnitHeader	fortranPreCondit
453  HiLink fortran03ReadWrite	fortranReadWrite
454  HiLink fortranReadWrite	Keyword
455  HiLink fortran03IO		fortranIO
456  HiLink fortran08IO		fortranIO
457  HiLink fortranIO		Keyword
458  HiLink fortran95Intrinsic	fortran90Intrinsic
459  HiLink fortran77Intrinsic	fortran90Intrinsic
460  HiLink fortran90Intrinsic	Function
461  HiLink fortran03Intrinsic	Function
462  HiLink fortran08Intrinsic	Function
463  HiLink fortran03Constant	Function
464
465  if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
466    HiLink fortranKeywordOb	fortranObsolete
467    HiLink fortran66Intrinsic	fortranObsolete
468    HiLink fortran77IntrinsicR	fortranObsolete
469    HiLink fortranUnitHeaderR	fortranObsolete
470    HiLink fortranTypeR		fortranObsolete
471    HiLink fortranStorageClassR	fortranObsolete
472    HiLink fortran90StorageClassR	fortranObsolete
473    HiLink fortran77OperatorR	fortranObsolete
474    HiLink fortranInclude	fortranObsolete
475  else
476    HiLink fortranKeywordOb	fortranKeyword
477    HiLink fortran66Intrinsic	fortran90Intrinsic
478    HiLink fortran77IntrinsicR	fortran90Intrinsic
479    HiLink fortranUnitHeaderR	fortranPreCondit
480    HiLink fortranTypeR		fortranType
481    HiLink fortranStorageClassR	fortranStorageClass
482    HiLink fortran77OperatorR	fortranOperator
483    HiLink fortranInclude	Include
484    HiLink fortran90StorageClassR	fortranStorageClass
485  endif
486
487  if ( b:fortran_dialect == "F" )
488    HiLink fortranLabelNumber	fortranObsolete
489    HiLink fortranTarget	fortranObsolete
490    HiLink fortranFormatSpec	fortranObsolete
491    HiLink fortranFloatDExp	fortranObsolete
492    HiLink fortranFloatNoDec	fortranObsolete
493    HiLink fortranFloatIniDec	fortranObsolete
494    HiLink fortranFloatEndDec	fortranObsolete
495    HiLink fortranTypeEx	fortranObsolete
496    HiLink fortranIOEx		fortranObsolete
497    HiLink fortranKeywordEx	fortranObsolete
498    HiLink fortranStringEx	fortranObsolete
499    HiLink fortran77IntrinsicEx	fortranObsolete
500    HiLink fortranUnitHeaderEx	fortranObsolete
501    HiLink fortranConditionalEx	fortranObsolete
502    HiLink fortran90IntrinsicEx	fortranObsolete
503  else
504    HiLink fortranLabelNumber	Special
505    HiLink fortranTarget	Special
506    HiLink fortranFormatSpec	Identifier
507    HiLink fortranFloatDExp	fortranFloat
508    HiLink fortranFloatNoDec	fortranFloat
509    HiLink fortranFloatIniDec	fortranFloat
510    HiLink fortranFloatEndDec	fortranFloat
511    HiLink fortranTypeEx	fortranType
512    HiLink fortranIOEx		fortranIO
513    HiLink fortranKeywordEx	fortranKeyword
514    HiLink fortranStringEx	fortranString
515    HiLink fortran77IntrinsicEx	fortran90Intrinsic
516    HiLink fortranUnitHeaderEx	fortranUnitHeader
517    HiLink fortranConditionalEx	fortranConditional
518    HiLink fortran90IntrinsicEx	fortran90Intrinsic
519  endif
520
521  HiLink fortranFloat		Float
522  HiLink fortranPreCondit	PreCondit
523  HiLink fortranInclude		Include
524  HiLink cIncluded		fortranString
525  HiLink cInclude		Include
526  HiLink cPreProc		PreProc
527  HiLink cPreCondit		PreCondit
528  HiLink fortranParenError	Error
529  HiLink fortranComment		Comment
530  HiLink fortranSerialNumber	Todo
531  HiLink fortranTab		Error
532  " Vendor extensions
533  HiLink fortranExtraIntrinsic	Function
534
535  delcommand HiLink
536endif
537
538let b:current_syntax = "fortran"
539
540" vim: ts=8 tw=132
541