xref: /vim-8.2.3635/runtime/syntax/fortran.vim (revision 6ee8d89c)
1" Vim syntax file
2" Language:	Fortran 2008 (and earlier versions including 2003, 95, 90, and 77)
3" Version:	0.91
4" Last Change:	2012 Jan. 02
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
22let s:cpo_save = &cpo
23set cpo&vim
24
25" let b:fortran_dialect = fortran_dialect if set correctly by user
26if exists("fortran_dialect")
27  if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
28    let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
29  else
30    echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
31    let b:fortran_dialect = "unknown"
32  endif
33else
34  let b:fortran_dialect = "unknown"
35endif
36
37" fortran_dialect not set or set incorrectly by user,
38if b:fortran_dialect == "unknown"
39  " set b:fortran_dialect from directive in first three lines of file
40  let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
41  if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
42    let b:fortran_dialect = "F"
43  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
44    let b:fortran_dialect = "elf"
45  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
46    let b:fortran_dialect = "f90"
47  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
48    let b:fortran_dialect = "f95"
49  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
50    let b:fortran_dialect = "f77"
51  else
52    " no directive found, so assume f95
53    let b:fortran_dialect = "f95"
54  endif
55  unlet b:fortran_retype
56endif
57
58" Choose between fixed and free source form if this hasn't been done yet
59if !exists("b:fortran_fixed_source")
60  if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
61    " elf and F require free source form
62    let b:fortran_fixed_source = 0
63  elseif b:fortran_dialect == "f77"
64    " f77 requires fixed source form
65    let b:fortran_fixed_source = 1
66  elseif exists("fortran_free_source")
67    " User guarantees free source form for all f90 and f95 files
68    let b:fortran_fixed_source = 0
69  elseif exists("fortran_fixed_source")
70    " User guarantees fixed source form for all f90 and f95 files
71    let b:fortran_fixed_source = 1
72  else
73    " f90 and f95 allow both fixed and free source form.
74    " Assume fixed source form unless signs of free source form
75    " are detected in the first five columns of the first s:lmax lines.
76    " Detection becomes more accurate and time-consuming if more lines
77    " are checked. Increase the limit below if you keep lots of comments at
78    " the very top of each file and you have a fast computer.
79    let s:lmax = 500
80    if ( s:lmax > line("$") )
81      let s:lmax = line("$")
82    endif
83    let b:fortran_fixed_source = 1
84    let s:ln=1
85    while s:ln <= s:lmax
86      let s:test = strpart(getline(s:ln),0,5)
87      if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
88	let b:fortran_fixed_source = 0
89	break
90      endif
91      let s:ln = s:ln + 1
92    endwhile
93    unlet! s:lmax s:ln s:test
94  endif
95endif
96
97syn case ignore
98
99if b:fortran_dialect !=? "f77"
100  if version >= 600
101    if b:fortran_fixed_source == 1
102      syn match fortranConstructName	"^\s\{6,}\zs\a\w*\ze\s*:"
103    else
104      syn match fortranConstructName	"^\s*\zs\a\w*\ze\s*:"
105    endif
106    if exists("fortran_more_precise")
107      syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
108      syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
109      syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
110    endif
111  else
112    if b:fortran_fixed_source == 1
113      syn match fortranConstructName	"^\s\{6,}\a\w*\s*:"
114    else
115      syn match fortranConstructName	"^\s*\a\w*\s*:"
116    endif
117  endif
118endif
119
120syn match   fortranUnitHeader	"\<end\>"
121
122syn match fortranType		"\<character\>"
123syn match fortranType		"\<complex\>"
124syn match fortranType		"\<integer\>"
125syn keyword fortranType		intrinsic
126syn match fortranType		"\<implicit\>"
127syn keyword fortranStructure	dimension
128syn keyword fortranStorageClass	parameter save
129syn match fortranUnitHeader	"\<subroutine\>"
130syn keyword fortranCall		call
131syn match fortranUnitHeader	"\<function\>"
132syn match fortranUnitHeader	"\<program\>"
133syn keyword fortranKeyword	return stop
134syn keyword fortranConditional	else then
135syn match fortranConditional	"\<if\>"
136syn match fortranConditionalOb	"\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
137syn match fortranRepeat		"\<do\>"
138
139syn keyword fortranTodo		contained todo fixme
140
141"Catch errors caused by too many right parentheses
142syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
143syn match  fortranParenError   ")"
144
145syn match fortranOperator	"\.\s*n\=eqv\s*\."
146syn match fortranOperator	"\.\s*\(and\|or\|not\)\s*\."
147syn match fortranOperator	"\(+\|-\|/\|\*\)"
148syn match fortranTypeOb		"\<character\>\@<=\s*\*"
149
150syn match fortranBoolean	"\.\s*\(true\|false\)\s*\."
151
152syn keyword fortranReadWrite	backspace close endfile inquire open print read rewind write
153
154"If tabs are allowed then the left margin checks do not work
155if exists("fortran_have_tabs")
156  syn match fortranTab		"\t"  transparent
157else
158  syn match fortranTab		"\t"
159endif
160
161syn keyword fortranIO		access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
162
163syn 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
164
165" Intrinsics provided by some vendors
166syn keyword fortranExtraIntrinsic	algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama 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
167
168syn 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
169syn match fortran77Intrinsic	"\<len\s*[(,]"me=s+3
170syn match fortran77Intrinsic	"\<real\s*("me=s+4
171syn match fortranType		"\<implicit\s\+real"
172syn match fortranType		"^\s*real\>"
173syn match fortran90Intrinsic	"\<logical\s*("me=s+7
174syn match fortranType		"\<implicit\s\+logical"
175syn match fortranType		"^\s*logical\>"
176
177"Numbers of various sorts
178" Integers
179syn match fortranNumber	display "\<\d\+\(_\a\w*\)\=\>"
180" floating point number, without a decimal point
181syn match fortranFloatNoDec	display	"\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
182" floating point number, starting with a decimal point
183syn match fortranFloatIniDec	display	"\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number, no digits after decimal
185syn match fortranFloatEndDec	display	"\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" floating point number, D or Q exponents
187syn match fortranFloatDExp	display	"\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
188" floating point number
189syn match fortranFloat	display	"\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
190" Numbers in formats
191syn match fortranFormatSpec	display	"\d*f\d\+\.\d\+"
192syn match fortranFormatSpec	display	"\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
193syn match fortranFormatSpec	display	"\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
194syn match fortranFormatSpec	display	"\d\+x\>"
195" The next match cannot be used because it would pick up identifiers as well
196" syn match fortranFormatSpec	display	"\<\(a\|i\)\d\+"
197
198" Numbers as labels
199syn match fortranLabelNumber	display	"^\d\{1,5}\s"me=e-1
200syn match fortranLabelNumber	display	"^ \d\{1,4}\s"ms=s+1,me=e-1
201syn match fortranLabelNumber	display	"^  \d\{1,3}\s"ms=s+2,me=e-1
202syn match fortranLabelNumber	display	"^   \d\d\=\s"ms=s+3,me=e-1
203syn match fortranLabelNumber	display	"^    \d\s"ms=s+4,me=e-1
204
205if version >= 600 && exists("fortran_more_precise")
206  " Numbers as targets
207  syn match fortranTarget	display	"\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
208  syn match fortranTarget	display	"\(\<do\s\+\)\@<=\d\+\>"
209  syn match fortranTarget	display	"\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
210endif
211
212syn keyword fortranTypeEx	external
213syn keyword fortranIOEx		format
214syn match fortranKeywordEx	"\<continue\>"
215syn match fortranKeyword	"^\s*\d\+\s\+continue\>"
216syn match fortranKeyword  	"\<go\s*to\>"
217syn match fortranKeywordDel  	"\<go\s*to\ze\s\+.*,\s*(.*$"
218syn match fortranKeywordOb  	"\<go\s*to\ze\s*(\d\+.*$"
219syn region fortranStringEx	start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
220syn keyword fortran77IntrinsicEx	dim lge lgt lle llt mod
221syn keyword fortranKeywordDel	assign pause
222
223if b:fortran_dialect != "f77"
224
225  syn match fortranType         "\<type\>"
226  syn keyword fortranType	none
227
228  syn keyword fortranStructure	private public intent optional
229  syn keyword fortranStructure	pointer target allocatable
230  syn keyword fortranStorageClass	in out
231  syn match fortranStorageClass	"\<kind\s*="me=s+4
232  syn match fortranStorageClass	"\<len\s*="me=s+3
233
234  syn match fortranUnitHeader	"\<module\>"
235  syn keyword fortranUnitHeader	use only contains
236  syn keyword fortranUnitHeader	result operator assignment
237  syn match fortranUnitHeader	"\<interface\>"
238  syn match fortranUnitHeader	"\<recursive\>"
239  syn keyword fortranKeyword	allocate deallocate nullify cycle exit
240  syn match fortranConditional	"\<select\>"
241  syn keyword fortranConditional	case default where elsewhere
242
243  syn match fortranOperator	"\(\(>\|<\)=\=\|==\|/=\|=\)"
244  syn match fortranOperator	"=>"
245
246  syn region fortranString	start=+"+ end=+"+	contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
247  syn keyword fortranIO		pad position action delim readwrite
248  syn keyword fortranIO		eor advance nml
249
250  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
251  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
252  syn match fortran90Intrinsic		"\<not\>\(\s*\.\)\@!"me=s+3
253  syn match fortran90Intrinsic	"\<kind\>\s*[(,]"me=s+4
254
255  syn match  fortranUnitHeader	"\<end\s*function"
256  syn match  fortranUnitHeader	"\<end\s*interface"
257  syn match  fortranUnitHeader	"\<end\s*module"
258  syn match  fortranUnitHeader	"\<end\s*program"
259  syn match  fortranUnitHeader	"\<end\s*subroutine"
260  syn match  fortranRepeat	"\<end\s*do"
261  syn match  fortranConditional	"\<end\s*where"
262  syn match  fortranConditional	"\<select\s*case"
263  syn match  fortranConditional	"\<end\s*select"
264  syn match  fortranType	"\<end\s*type"
265  syn match  fortranType	"\<in\s*out"
266
267  syn keyword fortranType	procedure
268  syn keyword fortranIOEx		namelist
269  syn keyword fortranConditionalEx	while
270  syn keyword fortran90IntrinsicEx	achar iachar transfer
271
272  syn keyword fortranInclude		include
273  syn keyword fortran90StorageClassR	sequence
274endif
275
276syn match   fortranConditional	"\<end\s*if"
277syn match   fortranIO		contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
278syn match   fortranConditional	"\<else\s*if"
279
280syn keyword fortranUnitHeaderOb	entry
281syn match fortranTypeR		display "double\s\+precision"
282syn match fortranTypeR		display "double\s\+complex"
283syn match fortranUnitHeaderR	display "block\s\+data"
284syn keyword fortranStorageClassR	common equivalence data
285syn keyword fortran77IntrinsicR	dble dprod
286syn match   fortran77OperatorR	"\.\s*[gl][et]\s*\."
287syn match   fortran77OperatorR	"\.\s*\(eq\|ne\)\s*\."
288
289if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
290  syn keyword fortranRepeat		forall
291  syn match fortranRepeat		"\<end\s*forall"
292  syn keyword fortran95Intrinsic	null cpu_time
293  syn match fortranType			"\<elemental\>"
294  syn match fortranType			"\<pure\>"
295  if exists("fortran_more_precise")
296    syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
297  endif
298endif
299
300if b:fortran_dialect == "f95"
301  " F2003
302  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
303  " ISO_C_binding
304  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
305  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
306  syn keyword fortran03Intrinsic        iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_f_procpointer
307  syn keyword fortran03Type             c_ptr c_funptr
308  " ISO_Fortran_env
309  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
310  " IEEE_arithmetic
311  syn keyword fortran03Intrinsic        ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
312
313  syn keyword fortran03ReadWrite	flush wait
314  syn keyword fortran03IO	        decimal round iomsg
315  syn keyword fortran03Type             asynchronous nopass non_overridable pass protected volatile abstract extends import
316  syn keyword fortran03Type             non_intrinsic value bind deferred generic final enumerator
317  syn match fortran03Type               "\<class\>"
318  syn match fortran03Type               "\<associate\>"
319  syn match fortran03Type               "\<end\s*associate"
320  syn match fortran03Type               "\<enum\s*,\s*bind\s*(\s*c\s*)"
321  syn match fortran03Type               "\<end\s*enum"
322  syn match fortran03Conditional	"\<select\s*type"
323  syn match fortran03Conditional        "\<type\s*is\>"
324  syn match fortran03Conditional        "\<class\s*is\>"
325  syn match fortran03UnitHeader         "\<abstract\s*interface\>"
326  syn match fortran03Operator           "\([\|]\)"
327
328  " F2008
329  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
330  syn keyword fortran08Intrinsic        atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
331  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
332  syn keyword fortran08IO               newunit
333  syn keyword fortran08Type             contiguous
334endif
335
336syn cluster fortranCommentGroup contains=fortranTodo
337
338if (b:fortran_fixed_source == 1)
339  if !exists("fortran_have_tabs")
340    "Flag items beyond column 72
341    syn match fortranSerialNumber	excludenl "^.\{73,}$"lc=72
342    "Flag left margin errors
343    syn match fortranLabelError	"^.\{-,4}[^0-9 ]" contains=fortranTab
344    syn match fortranLabelError	"^.\{4}\d\S"
345  endif
346  syn match fortranComment		excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
347  syn match fortranLeftMargin		transparent "^ \{5}"
348  syn match fortranContinueMark		display "^.\{5}\S"lc=5
349else
350  syn match fortranContinueMark		display "&"
351endif
352
353if b:fortran_dialect != "f77"
354  syn match fortranComment	excludenl "!.*$" contains=@fortranCommentGroup,@spell
355endif
356
357"cpp is often used with Fortran
358syn match	cPreProc		"^\s*#\s*\(define\|ifdef\)\>.*"
359syn match	cPreProc		"^\s*#\s*\(elif\|if\)\>.*"
360syn match	cPreProc		"^\s*#\s*\(ifndef\|undef\)\>.*"
361syn match	cPreCondit		"^\s*#\s*\(else\|endif\)\>.*"
362syn region	cIncluded	contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
363syn match	cIncluded		contained "<[^>]*>"
364syn match	cInclude		"^\s*#\s*include\>\s*["<]" contains=cIncluded
365
366"Synchronising limits assume that comment and continuation lines are not mixed
367if exists("fortran_fold") || exists("fortran_more_precise")
368  syn sync fromstart
369elseif (b:fortran_fixed_source == 0)
370  syn sync linecont "&" minlines=30
371else
372  syn sync minlines=30
373endif
374
375if version >= 600 && exists("fortran_fold")
376
377  if (b:fortran_fixed_source == 1)
378    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
379    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
380    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
381    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
382    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
383    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
384    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
385  else
386    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
387    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
388    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
389    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
390    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
391    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
392    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
393  endif
394
395  if exists("fortran_fold_conditionals")
396    if (b:fortran_fixed_source == 1)
397      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
398      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
399      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
400      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
401    else
402      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
403      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
404      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
405      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
406    endif
407  endif
408
409  if exists("fortran_fold_multilinecomments")
410    if (b:fortran_fixed_source == 1)
411      syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
412    else
413      syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
414    endif
415  endif
416endif
417
418" Define the default highlighting.
419" For version 5.7 and earlier: only when not done already
420" For version 5.8 and later: only when an item doesn't have highlighting yet
421if version >= 508 || !exists("did_fortran_syn_inits")
422  if version < 508
423    let did_fortran_syn_inits = 1
424    command -nargs=+ HiLink hi link <args>
425  else
426    command -nargs=+ HiLink hi def link <args>
427  endif
428
429  " The default highlighting differs for each dialect.
430  " Transparent groups:
431  " fortranParen, fortranLeftMargin
432  " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
433  " fortranBlockData
434  " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
435  " fortranMultiCommentLines
436  HiLink fortranKeyword 	Keyword
437  HiLink fortranConstructName	Identifier
438  HiLink fortran03Conditional	fortranConditional
439  HiLink fortranConditional	Conditional
440  HiLink fortranRepeat		Repeat
441  HiLink fortranTodo		Todo
442  if (b:fortran_fixed_source == 1)
443    HiLink fortranContinueMark	Todo
444  else
445    HiLink fortranContinueMark	Keyword
446  endif
447  HiLink fortranString		String
448  HiLink fortranNumber		Number
449  HiLink fortran03Operator	fortranOperator
450  HiLink fortranOperator	Operator
451  HiLink fortranBoolean		Boolean
452  HiLink fortranLabelError	Error
453  HiLink fortranObsolete	Todo
454  HiLink fortran03Type  	fortranType
455  HiLink fortran08Type	        fortranType
456  HiLink fortranType		Type
457  HiLink fortranStructure	Type
458  HiLink fortranStorageClass	StorageClass
459  HiLink fortranCall		Function
460  HiLink fortran03UnitHeader	fortranUnitHeader
461  HiLink fortranUnitHeader	fortranPreCondit
462  HiLink fortran03ReadWrite	fortranReadWrite
463  HiLink fortranReadWrite	Keyword
464  HiLink fortran03IO		fortranIO
465  HiLink fortran08IO		fortranIO
466  HiLink fortranIO		Keyword
467  HiLink fortran95Intrinsic	fortran90Intrinsic
468  HiLink fortran77Intrinsic	fortran90Intrinsic
469  HiLink fortran90Intrinsic	Function
470  HiLink fortran03Intrinsic	Function
471  HiLink fortran08Intrinsic	Function
472  HiLink fortran03Constant	Function
473
474  if b:fortran_dialect != "f77"
475    HiLink fortranUnitHeaderOb    Todo
476    HiLink fortranKeywordOb       Todo
477    HiLink fortranConditionalOb   Todo
478    HiLink fortranTypeOb          Todo
479    HiLink fortranKeywordDel      Todo
480  else
481    HiLink fortranUnitHeaderOb    fortranUnitHeader
482    HiLink fortranKeywordOb       fortranKeyword
483    HiLink fortranConditionalOb   fortranConditional
484    HiLink fortranTypeOb          fortranType
485    HiLink fortranKeywordDel      fortranKeyword
486  endif
487
488  if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
489    HiLink fortranKeywordOb	fortranObsolete
490    HiLink fortran66Intrinsic	fortranObsolete
491    HiLink fortran77IntrinsicR	fortranObsolete
492    HiLink fortranUnitHeaderR	fortranObsolete
493    HiLink fortranTypeR		fortranObsolete
494    HiLink fortranStorageClassR	fortranObsolete
495    HiLink fortran90StorageClassR	fortranObsolete
496    HiLink fortran77OperatorR	fortranObsolete
497    HiLink fortranInclude	fortranObsolete
498  else
499    HiLink fortranKeywordOb	fortranKeyword
500    HiLink fortran66Intrinsic	fortran90Intrinsic
501    HiLink fortran77IntrinsicR	fortran90Intrinsic
502    HiLink fortranUnitHeaderR	fortranPreCondit
503    HiLink fortranTypeR		fortranType
504    HiLink fortranStorageClassR	fortranStorageClass
505    HiLink fortran77OperatorR	fortranOperator
506    HiLink fortranInclude	Include
507    HiLink fortran90StorageClassR	fortranStorageClass
508  endif
509
510  if ( b:fortran_dialect == "F" )
511    HiLink fortranLabelNumber	fortranObsolete
512    HiLink fortranTarget	fortranObsolete
513    HiLink fortranFormatSpec	fortranObsolete
514    HiLink fortranFloatDExp	fortranObsolete
515    HiLink fortranFloatNoDec	fortranObsolete
516    HiLink fortranFloatIniDec	fortranObsolete
517    HiLink fortranFloatEndDec	fortranObsolete
518    HiLink fortranTypeEx	fortranObsolete
519    HiLink fortranIOEx		fortranObsolete
520    HiLink fortranKeywordEx	fortranObsolete
521    HiLink fortranStringEx	fortranObsolete
522    HiLink fortran77IntrinsicEx	fortranObsolete
523    HiLink fortranUnitHeaderEx	fortranObsolete
524    HiLink fortranConditionalEx	fortranObsolete
525    HiLink fortran90IntrinsicEx	fortranObsolete
526  else
527    HiLink fortranLabelNumber	Special
528    HiLink fortranTarget	Special
529    HiLink fortranFormatSpec	Identifier
530    HiLink fortranFloatDExp	fortranFloat
531    HiLink fortranFloatNoDec	fortranFloat
532    HiLink fortranFloatIniDec	fortranFloat
533    HiLink fortranFloatEndDec	fortranFloat
534    HiLink fortranTypeEx	fortranType
535    HiLink fortranIOEx		fortranIO
536    HiLink fortranKeywordEx	fortranKeyword
537    HiLink fortranStringEx	fortranString
538    HiLink fortran77IntrinsicEx	fortran90Intrinsic
539    HiLink fortranUnitHeaderEx	fortranUnitHeader
540    HiLink fortranConditionalEx	fortranConditional
541    HiLink fortran90IntrinsicEx	fortran90Intrinsic
542  endif
543
544  HiLink fortranFloat		Float
545  HiLink fortranPreCondit	PreCondit
546  HiLink fortranInclude		Include
547  HiLink cIncluded		fortranString
548  HiLink cInclude		Include
549  HiLink cPreProc		PreProc
550  HiLink cPreCondit		PreCondit
551  HiLink fortranParenError	Error
552  HiLink fortranComment		Comment
553  HiLink fortranSerialNumber	Todo
554  HiLink fortranTab		Error
555  " Vendor extensions
556  HiLink fortranExtraIntrinsic	Function
557
558  delcommand HiLink
559endif
560
561let b:current_syntax = "fortran"
562
563let &cpo = s:cpo_save
564unlet s:cpo_save
565" vim: ts=8 tw=132
566