Install vim73
[msysgit/mtrensch.git] / share / vim / vim73 / syntax / fortran.vim
blob1c43a3ae280f162cec7e9b6d9aa6e307b5474f39
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.
14 " For version 5.x: Clear all syntax items
15 " For version 6.x: Quit if a syntax file is already loaded
16 if version < 600
17   syntax clear
18 elseif exists("b:current_syntax")
19   finish
20 endif
22 " let b:fortran_dialect = fortran_dialect if set correctly by user
23 if 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
30 else
31   let b:fortran_dialect = "unknown"
32 endif
34 " fortran_dialect not set or set incorrectly by user,
35 if 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
53 endif
55 " Choose between fixed and free source form if this hasn't been done yet
56 if !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
92 endif
94 syn case ignore
96 if 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
115 endif
117 syn match   fortranUnitHeader   "\<end\>"
119 syn match fortranType           "\<character\>"
120 syn match fortranType           "\<complex\>"
121 syn match fortranType           "\<integer\>"
122 syn keyword fortranType         intrinsic
123 syn match fortranType           "\<implicit\>"
124 syn keyword fortranStructure    dimension
125 syn keyword fortranStorageClass parameter save
126 syn match fortranUnitHeader     "\<subroutine\>"
127 syn keyword fortranCall         call
128 syn match fortranUnitHeader     "\<function\>"
129 syn match fortranUnitHeader     "\<program\>"
130 syn keyword fortranKeyword      return stop
131 syn keyword fortranConditional  else then
132 syn match fortranConditional    "\<if\>"
133 syn match fortranRepeat         "\<do\>"
135 syn keyword fortranTodo         contained todo fixme
137 "Catch errors caused by too many right parentheses
138 syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
139 syn match  fortranParenError   ")"
141 syn match fortranOperator       "\.\s*n\=eqv\s*\."
142 syn match fortranOperator       "\.\s*\(and\|or\|not\)\s*\."
143 syn match fortranOperator       "\(+\|-\|/\|\*\)"
145 syn match fortranBoolean        "\.\s*\(true\|false\)\s*\."
147 syn keyword fortranReadWrite    backspace close endfile inquire open print read rewind write
149 "If tabs are allowed then the left margin checks do not work
150 if exists("fortran_have_tabs")
151   syn match fortranTab          "\t"  transparent
152 else
153   syn match fortranTab          "\t"
154 endif
156 syn keyword fortranIO           access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
158 syn 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
160 " Intrinsics provided by some vendors
161 syn 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
163 syn 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
164 syn match fortran77Intrinsic    "\<len\s*[(,]"me=s+3
165 syn match fortran77Intrinsic    "\<real\s*("me=s+4
166 syn match fortranType           "\<implicit\s\+real"
167 syn match fortranType           "^\s*real\>"
168 syn match fortran90Intrinsic    "\<logical\s*("me=s+7
169 syn match fortranType           "\<implicit\s\+logical"
170 syn match fortranType           "^\s*logical\>"
172 "Numbers of various sorts
173 " Integers
174 syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
175 " floating point number, without a decimal point
176 syn match fortranFloatNoDec     display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
177 " floating point number, starting with a decimal point
178 syn match fortranFloatIniDec    display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
179 " floating point number, no digits after decimal
180 syn match fortranFloatEndDec    display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
181 " floating point number, D or Q exponents
182 syn match fortranFloatDExp      display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
183 " floating point number
184 syn match fortranFloat  display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
185 " Numbers in formats
186 syn match fortranFormatSpec     display "\d*f\d\+\.\d\+"
187 syn match fortranFormatSpec     display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
188 syn match fortranFormatSpec     display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
189 syn 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\+"
193 " Numbers as labels
194 syn match fortranLabelNumber    display "^\d\{1,5}\s"me=e-1
195 syn match fortranLabelNumber    display "^ \d\{1,4}\s"ms=s+1,me=e-1
196 syn match fortranLabelNumber    display "^  \d\{1,3}\s"ms=s+2,me=e-1
197 syn match fortranLabelNumber    display "^   \d\d\=\s"ms=s+3,me=e-1
198 syn match fortranLabelNumber    display "^    \d\s"ms=s+4,me=e-1
200 if 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\+\>"
205 endif
207 syn keyword fortranTypeEx       external
208 syn keyword fortranIOEx         format
209 syn match fortranKeywordEx      "\<continue\>"
210 syn match fortranKeyword        "^\s*\d\+\s\+continue\>"
211 syn match fortranKeywordEx      "\<go\s*to\>"
212 syn region fortranStringEx      start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
213 syn keyword fortran77IntrinsicEx        dim lge lgt lle llt mod
214 syn keyword fortranKeywordOb    assign pause to
216 if b:fortran_dialect != "f77"
218   syn match fortranType         "\<type\>"
219   syn keyword fortranType       none
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
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
236   syn match fortranOperator     "\(\(>\|<\)=\=\|==\|/=\|=\)"
237   syn match fortranOperator     "=>"
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
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
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"
260   syn keyword fortranUnitHeaderEx       procedure
261   syn keyword fortranIOEx               namelist
262   syn keyword fortranConditionalEx      while
263   syn keyword fortran90IntrinsicEx      achar iachar transfer
265   syn keyword fortranInclude            include
266   syn keyword fortran90StorageClassR    sequence
267 endif
269 syn match   fortranConditional  "\<end\s*if"
270 syn match   fortranIO           contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
271 syn match   fortranConditional  "\<else\s*if"
273 syn keyword fortranUnitHeaderR  entry
274 syn match fortranTypeR          display "double\s\+precision"
275 syn match fortranTypeR          display "double\s\+complex"
276 syn match fortranUnitHeaderR    display "block\s\+data"
277 syn keyword fortranStorageClassR        common equivalence data
278 syn keyword fortran77IntrinsicR dble dprod
279 syn match   fortran77OperatorR  "\.\s*[gl][et]\s*\."
280 syn match   fortran77OperatorR  "\.\s*\(eq\|ne\)\s*\."
282 if 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
291 endif
293 if 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
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           "\([\|]\)"
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
325 endif
327 syn cluster fortranCommentGroup contains=fortranTodo
329 if (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
340 else
341   syn match fortranContinueMark         display "&"
342 endif
344 if b:fortran_dialect != "f77"
345   syn match fortranComment      excludenl "!.*$" contains=@fortranCommentGroup,@spell
346 endif
348 "cpp is often used with Fortran
349 syn match       cPreProc                "^\s*#\s*\(define\|ifdef\)\>.*"
350 syn match       cPreProc                "^\s*#\s*\(elif\|if\)\>.*"
351 syn match       cPreProc                "^\s*#\s*\(ifndef\|undef\)\>.*"
352 syn match       cPreCondit              "^\s*#\s*\(else\|endif\)\>.*"
353 syn region      cIncluded       contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
354 syn match       cIncluded               contained "<[^>]*>"
355 syn match       cInclude                "^\s*#\s*include\>\s*["<]" contains=cIncluded
357 "Synchronising limits assume that comment and continuation lines are not mixed
358 if exists("fortran_fold") || exists("fortran_more_precise")
359   syn sync fromstart
360 elseif (b:fortran_fixed_source == 0)
361   syn sync linecont "&" minlines=30
362 else
363   syn sync minlines=30
364 endif
366 if version >= 600 && exists("fortran_fold")
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
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
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
407 endif
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
412 if 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
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
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
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
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
535   delcommand HiLink
536 endif
538 let b:current_syntax = "fortran"
540 " vim: ts=8 tw=132