blob: bcc77c5a51f3674214711ecfb7603c9f59fc7114 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Fortran95 (and Fortran90, Fortran77, F and elf90)
Bram Moolenaare06c1882010-07-21 22:05:20 +02003" Version: 0.89
Bram Moolenaar071d4272004-06-13 20:20:40 +00004" URL: http://www.unb.ca/chem/ajit/syntax/fortran.vim
Bram Moolenaare06c1882010-07-21 22:05:20 +02005" Last Change: 2010 July 21
Bram Moolenaar071d4272004-06-13 20:20:40 +00006" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
Bram Moolenaare06c1882010-07-21 22:05:20 +02007" Usage: For instructions, do :help fortran-syntax from Vim
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" 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,
Bram Moolenaare06c1882010-07-21 22:05:20 +020013" Andrew Griffiths, Joe Krahn, and Hendrik Merx.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
15" For version 5.x: Clear all syntax items
16" For version 6.x: Quit if a syntax file is already loaded
17if version < 600
18 syntax clear
19elseif exists("b:current_syntax")
20 finish
21endif
22
23" let b:fortran_dialect = fortran_dialect if set correctly by user
24if exists("fortran_dialect")
25 if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
26 let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
27 else
28 echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
29 let b:fortran_dialect = "unknown"
30 endif
31else
32 let b:fortran_dialect = "unknown"
33endif
34
35" fortran_dialect not set or set incorrectly by user,
36if b:fortran_dialect == "unknown"
37 " set b:fortran_dialect from directive in first three lines of file
38 let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
39 if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
40 let b:fortran_dialect = "F"
41 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
42 let b:fortran_dialect = "elf"
43 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
44 let b:fortran_dialect = "f90"
45 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
46 let b:fortran_dialect = "f95"
47 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
48 let b:fortran_dialect = "f77"
49 else
50 " no directive found, so assume f95
51 let b:fortran_dialect = "f95"
52 endif
53 unlet b:fortran_retype
54endif
55
56" Choose between fixed and free source form if this hasn't been done yet
57if !exists("b:fortran_fixed_source")
58 if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
59 " elf and F require free source form
60 let b:fortran_fixed_source = 0
61 elseif b:fortran_dialect == "f77"
62 " f77 requires fixed source form
63 let b:fortran_fixed_source = 1
64 elseif exists("fortran_free_source")
65 " User guarantees free source form for all f90 and f95 files
66 let b:fortran_fixed_source = 0
67 elseif exists("fortran_fixed_source")
68 " User guarantees fixed source form for all f90 and f95 files
69 let b:fortran_fixed_source = 1
70 else
71 " f90 and f95 allow both fixed and free source form.
72 " Assume fixed source form unless signs of free source form
73 " are detected in the first five columns of the first b:lmax lines.
74 " Detection becomes more accurate and time-consuming if more lines
75 " are checked. Increase the limit below if you keep lots of comments at
76 " the very top of each file and you have a fast computer.
Bram Moolenaare06c1882010-07-21 22:05:20 +020077 let b:lmax = 500
Bram Moolenaar071d4272004-06-13 20:20:40 +000078 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)
Bram Moolenaare06c1882010-07-21 22:05:20 +020085 if b:test !~ '^[Cc*]' && b:test !~ '^ *[!#]' && b:test =~ '[^ 0-9\t]' && b:test !~ '^[ 0-9]*\t'
Bram Moolenaar071d4272004-06-13 20:20:40 +000086 let b:fortran_fixed_source = 0
87 break
88 endif
89 let b:ln = b:ln + 1
90 endwhile
91 unlet b:lmax b:ln b:test
92 endif
93endif
94
95syn case ignore
96
Bram Moolenaar910f66f2006-04-05 20:41:53 +000097if b:fortran_dialect !=? "f77"
Bram Moolenaar071d4272004-06-13 20:20:40 +000098 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
116endif
117
118syn match fortranUnitHeader "\<end\>"
119
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000120syn match fortranType "\<character\>"
121syn match fortranType "\<complex\>"
122syn match fortranType "\<integer\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123syn keyword fortranType intrinsic
124syn match fortranType "\<implicit\>"
125syn keyword fortranStructure dimension
126syn keyword fortranStorageClass parameter save
127syn match fortranUnitHeader "\<subroutine\>"
128syn keyword fortranCall call
129syn match fortranUnitHeader "\<function\>"
130syn match fortranUnitHeader "\<program\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000131syn keyword fortranKeyword return stop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132syn keyword fortranConditional else then
133syn match fortranConditional "\<if\>"
134syn match fortranRepeat "\<do\>"
135
136syn keyword fortranTodo contained todo fixme
137
138"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000139syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140syn match fortranParenError ")"
141
142syn match fortranOperator "\.\s*n\=eqv\s*\."
143syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
144syn match fortranOperator "\(+\|-\|/\|\*\)"
145
146syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
147
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000148syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149
150"If tabs are allowed then the left margin checks do not work
151if exists("fortran_have_tabs")
152 syn match fortranTab "\t" transparent
153else
154 syn match fortranTab "\t"
155endif
156
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000157syn keyword fortranIO access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000159syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
161" Intrinsics provided by some vendors
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000162syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000164syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
166syn match fortran77Intrinsic "\<real\s*("me=s+4
167syn match fortranType "\<implicit\s\+real"
168syn match fortranType "^\s*real\>"
169syn match fortran90Intrinsic "\<logical\s*("me=s+7
170syn match fortranType "\<implicit\s\+logical"
171syn match fortranType "^\s*logical\>"
172
173"Numbers of various sorts
174" Integers
175syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
176" floating point number, without a decimal point
177syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
178" floating point number, starting with a decimal point
179syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
180" floating point number, no digits after decimal
181syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
182" floating point number, D or Q exponents
183syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number
185syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" Numbers in formats
187syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
188syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
189syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
190syn 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\+"
193
194" Numbers as labels
195syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
196syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
197syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
198syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
199syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
200
201if 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\+\>"
206endif
207
208syn keyword fortranTypeEx external
209syn keyword fortranIOEx format
Bram Moolenaare06c1882010-07-21 22:05:20 +0200210syn match fortranKeywordEx "\<continue\>"
211syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000212syn match fortranKeywordEx "\<go\s*to\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
214syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000215syn keyword fortranKeywordOb assign pause to
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216
217if b:fortran_dialect != "f77"
218
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000219 syn match fortranType "\<type\>"
220 syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000221
222 syn keyword fortranStructure private public intent optional
223 syn keyword fortranStructure pointer target allocatable
224 syn keyword fortranStorageClass in out
225 syn match fortranStorageClass "\<kind\s*="me=s+4
226 syn match fortranStorageClass "\<len\s*="me=s+3
227
228 syn match fortranUnitHeader "\<module\>"
229 syn keyword fortranUnitHeader use only contains
230 syn keyword fortranUnitHeader result operator assignment
231 syn match fortranUnitHeader "\<interface\>"
232 syn match fortranUnitHeader "\<recursive\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000233 syn keyword fortranKeyword allocate deallocate nullify cycle exit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234 syn match fortranConditional "\<select\>"
235 syn keyword fortranConditional case default where elsewhere
236
237 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
238 syn match fortranOperator "=>"
239
240 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
241 syn keyword fortranIO pad position action delim readwrite
242 syn keyword fortranIO eor advance nml
243
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000244 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
245 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
248
249 syn match fortranUnitHeader "\<end\s*function"
250 syn match fortranUnitHeader "\<end\s*interface"
251 syn match fortranUnitHeader "\<end\s*module"
252 syn match fortranUnitHeader "\<end\s*program"
253 syn match fortranUnitHeader "\<end\s*subroutine"
254 syn match fortranRepeat "\<end\s*do"
255 syn match fortranConditional "\<end\s*where"
256 syn match fortranConditional "\<select\s*case"
257 syn match fortranConditional "\<end\s*select"
258 syn match fortranType "\<end\s*type"
259 syn match fortranType "\<in\s*out"
260
261 syn keyword fortranUnitHeaderEx procedure
262 syn keyword fortranIOEx namelist
263 syn keyword fortranConditionalEx while
264 syn keyword fortran90IntrinsicEx achar iachar transfer
265
266 syn keyword fortranInclude include
267 syn keyword fortran90StorageClassR sequence
268endif
269
270syn match fortranConditional "\<end\s*if"
271syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
272syn match fortranConditional "\<else\s*if"
273
274syn keyword fortranUnitHeaderR entry
275syn match fortranTypeR display "double\s\+precision"
276syn match fortranTypeR display "double\s\+complex"
277syn match fortranUnitHeaderR display "block\s\+data"
278syn keyword fortranStorageClassR common equivalence data
279syn keyword fortran77IntrinsicR dble dprod
280syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
281syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
282
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000283if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284 syn keyword fortranRepeat forall
285 syn match fortranRepeat "\<end\s*forall"
286 syn keyword fortran95Intrinsic null cpu_time
287 syn match fortranType "\<elemental\>"
288 syn match fortranType "\<pure\>"
289 if exists("fortran_more_precise")
290 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
291 endif
292endif
293
Bram Moolenaare06c1882010-07-21 22:05:20 +0200294if b:fortran_dialect == "f95"
295 " F2003
296 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
297 " ISO_C_binding
298 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
299 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
300 syn keyword fortran03Intrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
301 syn keyword fortran03Type c_ptr c_funptr
302 " ISO_Fortran_env
303 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
304 " IEEE_arithmetic
305 syn keyword fortran03Intrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
306
307 syn keyword fortran03ReadWrite flush wait
308 syn keyword fortran03IO decimal round iomsg
309 syn keyword fortran03Type asynchronous nopass non_overridable pass protected volatile abstract extends import
310 syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator class
311 syn match fortran03Type "\<associate\>"
312 syn match fortran03Type "\<end\s*associate"
313 syn match fortran03Type "\<enum\s*,\s*bind\s*(\s*c\s*)"
314 syn match fortran03Type "\<end\s*enum"
315 syn match fortran03Conditional "\<select\s*type"
316 syn match fortran03Conditional "\<type\s*is\>"
317 syn match fortran03UnitHeader "\<abstract\s*interface\>"
318 syn match fortran03Operator "\([\|]\)"
319
320 " F2008
321 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
322 syn keyword fortran08Intrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
323 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
324 syn keyword fortran08IO newunit
325 syn keyword fortran08Type contiguous
326endif
327
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328syn cluster fortranCommentGroup contains=fortranTodo
329
330if (b:fortran_fixed_source == 1)
331 if !exists("fortran_have_tabs")
332 "Flag items beyond column 72
333 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
334 "Flag left margin errors
335 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
336 syn match fortranLabelError "^.\{4}\d\S"
337 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100338 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339 syn match fortranLeftMargin transparent "^ \{5}"
340 syn match fortranContinueMark display "^.\{5}\S"lc=5
341else
342 syn match fortranContinueMark display "&"
343endif
344
345if b:fortran_dialect != "f77"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000346 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347endif
348
349"cpp is often used with Fortran
350syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
351syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
352syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
353syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
354syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
355syn match cIncluded contained "<[^>]*>"
356syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
357
358"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000359if exists("fortran_fold") || exists("fortran_more_precise")
360 syn sync fromstart
361elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200362 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200364 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365endif
366
367if version >= 600 && exists("fortran_fold")
368
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369 if (b:fortran_fixed_source == 1)
370 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
371 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000372 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373 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
Bram Moolenaare06c1882010-07-21 22:05:20 +0200374 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375 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
Bram Moolenaare06c1882010-07-21 22:05:20 +0200376 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 else
378 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
379 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000380 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000381 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
Bram Moolenaare06c1882010-07-21 22:05:20 +0200382 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383 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
Bram Moolenaare06c1882010-07-21 22:05:20 +0200384 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385 endif
386
387 if exists("fortran_fold_conditionals")
388 if (b:fortran_fixed_source == 1)
389 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
390 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
391 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
392 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
393 else
394 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
395 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
396 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
397 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
398 endif
399 endif
400
401 if exists("fortran_fold_multilinecomments")
402 if (b:fortran_fixed_source == 1)
403 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
404 else
405 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
406 endif
407 endif
408endif
409
410" Define the default highlighting.
411" For version 5.7 and earlier: only when not done already
412" For version 5.8 and later: only when an item doesn't have highlighting yet
413if version >= 508 || !exists("did_fortran_syn_inits")
414 if version < 508
415 let did_fortran_syn_inits = 1
416 command -nargs=+ HiLink hi link <args>
417 else
418 command -nargs=+ HiLink hi def link <args>
419 endif
420
421 " The default highlighting differs for each dialect.
422 " Transparent groups:
423 " fortranParen, fortranLeftMargin
424 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
425 " fortranBlockData
426 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
427 " fortranMultiCommentLines
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000428 HiLink fortranKeyword Keyword
429 HiLink fortranConstructName Identifier
Bram Moolenaare06c1882010-07-21 22:05:20 +0200430 HiLink fortran03Conditional fortranConditional
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000431 HiLink fortranConditional Conditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432 HiLink fortranRepeat Repeat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000433 HiLink fortranTodo Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200434 if (b:fortran_fixed_source == 1)
435 HiLink fortranContinueMark Todo
436 else
437 HiLink fortranContinueMark Keyword
438 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439 HiLink fortranString String
440 HiLink fortranNumber Number
Bram Moolenaare06c1882010-07-21 22:05:20 +0200441 HiLink fortran03Operator fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000442 HiLink fortranOperator Operator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 HiLink fortranBoolean Boolean
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000444 HiLink fortranLabelError Error
445 HiLink fortranObsolete Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200446 HiLink fortran03Type fortranType
447 HiLink fortran08Type fortranType
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000448 HiLink fortranType Type
449 HiLink fortranStructure Type
450 HiLink fortranStorageClass StorageClass
Bram Moolenaare06c1882010-07-21 22:05:20 +0200451 HiLink fortranCall Function
452 HiLink fortran03UnitHeader fortranUnitHeader
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000453 HiLink fortranUnitHeader fortranPreCondit
Bram Moolenaare06c1882010-07-21 22:05:20 +0200454 HiLink fortran03ReadWrite fortranReadWrite
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000455 HiLink fortranReadWrite Keyword
Bram Moolenaare06c1882010-07-21 22:05:20 +0200456 HiLink fortran03IO fortranIO
457 HiLink fortran08IO fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000458 HiLink fortranIO Keyword
459 HiLink fortran95Intrinsic fortran90Intrinsic
460 HiLink fortran77Intrinsic fortran90Intrinsic
461 HiLink fortran90Intrinsic Function
Bram Moolenaare06c1882010-07-21 22:05:20 +0200462 HiLink fortran03Intrinsic Function
463 HiLink fortran08Intrinsic Function
464 HiLink fortran03Constant Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000465
466 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000467 HiLink fortranKeywordOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000468 HiLink fortran66Intrinsic fortranObsolete
469 HiLink fortran77IntrinsicR fortranObsolete
470 HiLink fortranUnitHeaderR fortranObsolete
471 HiLink fortranTypeR fortranObsolete
472 HiLink fortranStorageClassR fortranObsolete
473 HiLink fortran90StorageClassR fortranObsolete
474 HiLink fortran77OperatorR fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000475 HiLink fortranInclude fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476 else
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000477 HiLink fortranKeywordOb fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000478 HiLink fortran66Intrinsic fortran90Intrinsic
479 HiLink fortran77IntrinsicR fortran90Intrinsic
480 HiLink fortranUnitHeaderR fortranPreCondit
481 HiLink fortranTypeR fortranType
482 HiLink fortranStorageClassR fortranStorageClass
483 HiLink fortran77OperatorR fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000484 HiLink fortranInclude Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485 HiLink fortran90StorageClassR fortranStorageClass
486 endif
487
488 if ( b:fortran_dialect == "F" )
489 HiLink fortranLabelNumber fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000490 HiLink fortranTarget fortranObsolete
491 HiLink fortranFormatSpec fortranObsolete
492 HiLink fortranFloatDExp fortranObsolete
493 HiLink fortranFloatNoDec fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000494 HiLink fortranFloatIniDec fortranObsolete
495 HiLink fortranFloatEndDec fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000496 HiLink fortranTypeEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000497 HiLink fortranIOEx fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000498 HiLink fortranKeywordEx fortranObsolete
499 HiLink fortranStringEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500 HiLink fortran77IntrinsicEx fortranObsolete
501 HiLink fortranUnitHeaderEx fortranObsolete
502 HiLink fortranConditionalEx fortranObsolete
503 HiLink fortran90IntrinsicEx fortranObsolete
504 else
505 HiLink fortranLabelNumber Special
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000506 HiLink fortranTarget Special
507 HiLink fortranFormatSpec Identifier
508 HiLink fortranFloatDExp fortranFloat
509 HiLink fortranFloatNoDec fortranFloat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510 HiLink fortranFloatIniDec fortranFloat
511 HiLink fortranFloatEndDec fortranFloat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000512 HiLink fortranTypeEx fortranType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000513 HiLink fortranIOEx fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000514 HiLink fortranKeywordEx fortranKeyword
515 HiLink fortranStringEx fortranString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516 HiLink fortran77IntrinsicEx fortran90Intrinsic
517 HiLink fortranUnitHeaderEx fortranUnitHeader
518 HiLink fortranConditionalEx fortranConditional
519 HiLink fortran90IntrinsicEx fortran90Intrinsic
520 endif
521
522 HiLink fortranFloat Float
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000523 HiLink fortranPreCondit PreCondit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000524 HiLink fortranInclude Include
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000525 HiLink cIncluded fortranString
526 HiLink cInclude Include
527 HiLink cPreProc PreProc
528 HiLink cPreCondit PreCondit
529 HiLink fortranParenError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000530 HiLink fortranComment Comment
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000531 HiLink fortranSerialNumber Todo
532 HiLink fortranTab Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000533 " Vendor extensions
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000534 HiLink fortranExtraIntrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535
536 delcommand HiLink
537endif
538
539let b:current_syntax = "fortran"
540
541" vim: ts=8 tw=132