Merge branch 'feat/tagfunc'
[vim_extended.git] / runtime / syntax / fortran.vim
blob3d323fbb96991ca98fbfb9ce2159960249d15bd2
1 " Vim syntax file
2 " Language:     Fortran95 (and Fortran90, Fortran77, F and elf90)
3 " Version:      0.88
4 " URL:          http://www.unb.ca/chem/ajit/syntax/fortran.vim
5 " Last Change:  2008 Nov 01
6 " Maintainer:   Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
7 " Usage:        Do :help fortran-syntax from Vim
8 " Credits:
9 "  Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and
10 "  Preben Guldberg. Useful suggestions were made by: Andrej Panjkov,
11 "  Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
12 "  Walter Dieudonné, Alexander Wagner, Roman Bertle, Charles Rendleman,
13 "  and Andrew Griffiths. For instructions on use, do :help fortran from vim
15 " For version 5.x: Clear all syntax items
16 " For version 6.x: Quit if a syntax file is already loaded
17 if version < 600
18   syntax clear
19 elseif exists("b:current_syntax")
20   finish
21 endif
23 " let b:fortran_dialect = fortran_dialect if set correctly by user
24 if exists("fortran_dialect")
25   if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
26     let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
27   else
28     echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
29     let b:fortran_dialect = "unknown"
30   endif
31 else
32   let b:fortran_dialect = "unknown"
33 endif
35 " fortran_dialect not set or set incorrectly by user,
36 if b:fortran_dialect == "unknown"
37   " set b:fortran_dialect from directive in first three lines of file
38   let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
39   if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
40     let b:fortran_dialect = "F"
41   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
42     let b:fortran_dialect = "elf"
43   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
44     let b:fortran_dialect = "f90"
45   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
46     let b:fortran_dialect = "f95"
47   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
48     let b:fortran_dialect = "f77"
49   else
50     " no directive found, so assume f95
51     let b:fortran_dialect = "f95"
52   endif
53   unlet b:fortran_retype
54 endif
56 " Choose between fixed and free source form if this hasn't been done yet
57 if !exists("b:fortran_fixed_source")
58   if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
59     " elf and F require free source form
60     let b:fortran_fixed_source = 0
61   elseif b:fortran_dialect == "f77"
62     " f77 requires fixed source form
63     let b:fortran_fixed_source = 1
64   elseif exists("fortran_free_source")
65     " User guarantees free source form for all f90 and f95 files
66     let b:fortran_fixed_source = 0
67   elseif exists("fortran_fixed_source")
68     " User guarantees fixed source form for all f90 and f95 files
69     let b:fortran_fixed_source = 1
70   else
71     " f90 and f95 allow both fixed and free source form.
72     " Assume fixed source form unless signs of free source form
73     " are detected in the first five columns of the first b:lmax lines.
74     " Detection becomes more accurate and time-consuming if more lines
75     " are checked. Increase the limit below if you keep lots of comments at
76     " the very top of each file and you have a fast computer.
77     let b:lmax = 250
78     if ( b:lmax > line("$") )
79       let b:lmax = line("$")
80     endif
81     let b:fortran_fixed_source = 1
82     let b:ln=1
83     while b:ln <= b:lmax
84       let b:test = strpart(getline(b:ln),0,5)
85       if b:test[0] !~ '[Cc*!#]' && b:test !~ '^ \+[!#]' && b:test =~ '[^ 0-9\t]'
86         let b:fortran_fixed_source = 0
87         break
88       endif
89       let b:ln = b:ln + 1
90     endwhile
91     unlet b:lmax b:ln b:test
92   endif
93 endif
95 syn case ignore
97 if b:fortran_dialect !=? "f77"
98   if version >= 600
99     if b:fortran_fixed_source == 1
100       syn match fortranConstructName    "^\s\{6,}\zs\a\w*\ze\s*:"
101     else
102       syn match fortranConstructName    "^\s*\zs\a\w*\ze\s*:"
103     endif
104     if exists("fortran_more_precise")
105       syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
106       syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
107       syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
108     endif
109   else
110     if b:fortran_fixed_source == 1
111       syn match fortranConstructName    "^\s\{6,}\a\w*\s*:"
112     else
113       syn match fortranConstructName    "^\s*\a\w*\s*:"
114     endif
115   endif
116 endif
118 syn match   fortranUnitHeader   "\<end\>"
120 syn match fortranType           "\<character\>"
121 syn match fortranType           "\<complex\>"
122 syn match fortranType           "\<integer\>"
123 syn keyword fortranType         intrinsic
124 syn match fortranType           "\<implicit\>"
125 syn keyword fortranStructure    dimension
126 syn keyword fortranStorageClass parameter save
127 syn match fortranUnitHeader     "\<subroutine\>"
128 syn keyword fortranCall         call
129 syn match fortranUnitHeader     "\<function\>"
130 syn match fortranUnitHeader     "\<program\>"
131 syn keyword fortranKeyword      return stop
132 syn keyword fortranConditional  else then
133 syn match fortranConditional    "\<if\>"
134 syn match fortranRepeat         "\<do\>"
136 syn keyword fortranTodo         contained todo fixme
138 "Catch errors caused by too many right parentheses
139 syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
140 syn match  fortranParenError   ")"
142 syn match fortranOperator       "\.\s*n\=eqv\s*\."
143 syn match fortranOperator       "\.\s*\(and\|or\|not\)\s*\."
144 syn match fortranOperator       "\(+\|-\|/\|\*\)"
146 syn match fortranBoolean        "\.\s*\(true\|false\)\s*\."
148 syn keyword fortranReadWrite    backspace close endfile inquire open print read rewind write
150 "If tabs are allowed then the left margin checks do not work
151 if exists("fortran_have_tabs")
152   syn match fortranTab          "\t"  transparent
153 else
154   syn match fortranTab          "\t"
155 endif
157 syn keyword fortranIO           access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
159 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
161 " Intrinsics provided by some vendors
162 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
164 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
165 syn match fortran77Intrinsic    "\<len\s*[(,]"me=s+3
166 syn match fortran77Intrinsic    "\<real\s*("me=s+4
167 syn match fortranType           "\<implicit\s\+real"
168 syn match fortranType           "^\s*real\>"
169 syn match fortran90Intrinsic    "\<logical\s*("me=s+7
170 syn match fortranType           "\<implicit\s\+logical"
171 syn match fortranType           "^\s*logical\>"
173 "Numbers of various sorts
174 " Integers
175 syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
176 " floating point number, without a decimal point
177 syn match fortranFloatNoDec     display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
178 " floating point number, starting with a decimal point
179 syn match fortranFloatIniDec    display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
180 " floating point number, no digits after decimal
181 syn match fortranFloatEndDec    display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
182 " floating point number, D or Q exponents
183 syn match fortranFloatDExp      display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184 " floating point number
185 syn match fortranFloat  display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186 " Numbers in formats
187 syn match fortranFormatSpec     display "\d*f\d\+\.\d\+"
188 syn match fortranFormatSpec     display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
189 syn match fortranFormatSpec     display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
190 syn match fortranFormatSpec     display "\d\+x\>"
191 " The next match cannot be used because it would pick up identifiers as well
192 " syn match fortranFormatSpec   display "\<\(a\|i\)\d\+"
194 " Numbers as labels
195 syn match fortranLabelNumber    display "^\d\{1,5}\s"me=e-1
196 syn match fortranLabelNumber    display "^ \d\{1,4}\s"ms=s+1,me=e-1
197 syn match fortranLabelNumber    display "^  \d\{1,3}\s"ms=s+2,me=e-1
198 syn match fortranLabelNumber    display "^   \d\d\=\s"ms=s+3,me=e-1
199 syn match fortranLabelNumber    display "^    \d\s"ms=s+4,me=e-1
201 if version >= 600 && exists("fortran_more_precise")
202   " Numbers as targets
203   syn match fortranTarget       display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
204   syn match fortranTarget       display "\(\<do\s\+\)\@<=\d\+\>"
205   syn match fortranTarget       display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
206 endif
208 syn keyword fortranTypeEx       external
209 syn keyword fortranIOEx         format
210 syn keyword fortranKeywordEx    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 syn cluster fortranCommentGroup contains=fortranTodo
295 if (b:fortran_fixed_source == 1)
296   if !exists("fortran_have_tabs")
297     "Flag items beyond column 72
298     syn match fortranSerialNumber       excludenl "^.\{73,}$"lc=72
299     "Flag left margin errors
300     syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
301     syn match fortranLabelError "^.\{4}\d\S"
302   endif
303   syn match fortranComment              excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
304   syn match fortranLeftMargin           transparent "^ \{5}"
305   syn match fortranContinueMark         display "^.\{5}\S"lc=5
306 else
307   syn match fortranContinueMark         display "&"
308 endif
310 if b:fortran_dialect != "f77"
311   syn match fortranComment      excludenl "!.*$" contains=@fortranCommentGroup,@spell
312 endif
314 "cpp is often used with Fortran
315 syn match       cPreProc                "^\s*#\s*\(define\|ifdef\)\>.*"
316 syn match       cPreProc                "^\s*#\s*\(elif\|if\)\>.*"
317 syn match       cPreProc                "^\s*#\s*\(ifndef\|undef\)\>.*"
318 syn match       cPreCondit              "^\s*#\s*\(else\|endif\)\>.*"
319 syn region      cIncluded       contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
320 syn match       cIncluded               contained "<[^>]*>"
321 syn match       cInclude                "^\s*#\s*include\>\s*["<]" contains=cIncluded
323 "Synchronising limits assume that comment and continuation lines are not mixed
324 if exists("fortran_fold") || exists("fortran_more_precise")
325   syn sync fromstart
326 elseif (b:fortran_fixed_source == 0)
327   syn sync linecont "&" minlines=20
328 else
329   syn sync minlines=20
330 endif
332 if version >= 600 && exists("fortran_fold")
334   if (b:fortran_fixed_source == 1)
335     syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
336     syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
337     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
338     syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
339     syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
340     syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
341   else
342     syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
343     syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
344     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
345     syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
346     syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
347     syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
348   endif
350   if exists("fortran_fold_conditionals")
351     if (b:fortran_fixed_source == 1)
352       syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
353       syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
354       syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
355       syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
356     else
357       syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
358       syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
359       syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
360       syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
361     endif
362   endif
364   if exists("fortran_fold_multilinecomments")
365     if (b:fortran_fixed_source == 1)
366       syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
367     else
368       syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
369     endif
370   endif
371 endif
373 " Define the default highlighting.
374 " For version 5.7 and earlier: only when not done already
375 " For version 5.8 and later: only when an item doesn't have highlighting yet
376 if version >= 508 || !exists("did_fortran_syn_inits")
377   if version < 508
378     let did_fortran_syn_inits = 1
379     command -nargs=+ HiLink hi link <args>
380   else
381     command -nargs=+ HiLink hi def link <args>
382   endif
384   " The default highlighting differs for each dialect.
385   " Transparent groups:
386   " fortranParen, fortranLeftMargin
387   " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
388   " fortranBlockData
389   " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
390   " fortranMultiCommentLines
391   HiLink fortranKeyword         Keyword
392   HiLink fortranConstructName   Identifier
393   HiLink fortranConditional     Conditional
394   HiLink fortranRepeat          Repeat
395   HiLink fortranTodo            Todo
396   HiLink fortranContinueMark    Todo
397   HiLink fortranString          String
398   HiLink fortranNumber          Number
399   HiLink fortranOperator        Operator
400   HiLink fortranBoolean         Boolean
401   HiLink fortranLabelError      Error
402   HiLink fortranObsolete        Todo
403   HiLink fortranType            Type
404   HiLink fortranStructure       Type
405   HiLink fortranStorageClass    StorageClass
406   HiLink fortranCall            fortranUnitHeader
407   HiLink fortranUnitHeader      fortranPreCondit
408   HiLink fortranReadWrite       Keyword
409   HiLink fortranIO              Keyword
410   HiLink fortran95Intrinsic     fortran90Intrinsic
411   HiLink fortran77Intrinsic     fortran90Intrinsic
412   HiLink fortran90Intrinsic     Function
414   if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
415     HiLink fortranKeywordOb     fortranObsolete
416     HiLink fortran66Intrinsic   fortranObsolete
417     HiLink fortran77IntrinsicR  fortranObsolete
418     HiLink fortranUnitHeaderR   fortranObsolete
419     HiLink fortranTypeR         fortranObsolete
420     HiLink fortranStorageClassR fortranObsolete
421     HiLink fortran90StorageClassR       fortranObsolete
422     HiLink fortran77OperatorR   fortranObsolete
423     HiLink fortranInclude       fortranObsolete
424   else
425     HiLink fortranKeywordOb     fortranKeyword
426     HiLink fortran66Intrinsic   fortran90Intrinsic
427     HiLink fortran77IntrinsicR  fortran90Intrinsic
428     HiLink fortranUnitHeaderR   fortranPreCondit
429     HiLink fortranTypeR         fortranType
430     HiLink fortranStorageClassR fortranStorageClass
431     HiLink fortran77OperatorR   fortranOperator
432     HiLink fortranInclude       Include
433     HiLink fortran90StorageClassR       fortranStorageClass
434   endif
436   if ( b:fortran_dialect == "F" )
437     HiLink fortranLabelNumber   fortranObsolete
438     HiLink fortranTarget        fortranObsolete
439     HiLink fortranFormatSpec    fortranObsolete
440     HiLink fortranFloatDExp     fortranObsolete
441     HiLink fortranFloatNoDec    fortranObsolete
442     HiLink fortranFloatIniDec   fortranObsolete
443     HiLink fortranFloatEndDec   fortranObsolete
444     HiLink fortranTypeEx        fortranObsolete
445     HiLink fortranIOEx          fortranObsolete
446     HiLink fortranKeywordEx     fortranObsolete
447     HiLink fortranStringEx      fortranObsolete
448     HiLink fortran77IntrinsicEx fortranObsolete
449     HiLink fortranUnitHeaderEx  fortranObsolete
450     HiLink fortranConditionalEx fortranObsolete
451     HiLink fortran90IntrinsicEx fortranObsolete
452   else
453     HiLink fortranLabelNumber   Special
454     HiLink fortranTarget        Special
455     HiLink fortranFormatSpec    Identifier
456     HiLink fortranFloatDExp     fortranFloat
457     HiLink fortranFloatNoDec    fortranFloat
458     HiLink fortranFloatIniDec   fortranFloat
459     HiLink fortranFloatEndDec   fortranFloat
460     HiLink fortranTypeEx        fortranType
461     HiLink fortranIOEx          fortranIO
462     HiLink fortranKeywordEx     fortranKeyword
463     HiLink fortranStringEx      fortranString
464     HiLink fortran77IntrinsicEx fortran90Intrinsic
465     HiLink fortranUnitHeaderEx  fortranUnitHeader
466     HiLink fortranConditionalEx fortranConditional
467     HiLink fortran90IntrinsicEx fortran90Intrinsic
468   endif
470   HiLink fortranFloat           Float
471   HiLink fortranPreCondit       PreCondit
472   HiLink fortranInclude         Include
473   HiLink cIncluded              fortranString
474   HiLink cInclude               Include
475   HiLink cPreProc               PreProc
476   HiLink cPreCondit             PreCondit
477   HiLink fortranParenError      Error
478   HiLink fortranComment         Comment
479   HiLink fortranSerialNumber    Todo
480   HiLink fortranTab             Error
481   " Vendor extensions
482   HiLink fortranExtraIntrinsic  Function
484   delcommand HiLink
485 endif
487 let b:current_syntax = "fortran"
489 " vim: ts=8 tw=132