blob: 1c43a3ae280f162cec7e9b6d9aa6e307b5474f39 [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 Moolenaare06c1882010-07-21 22:05:20 +02004" Last Change: 2010 July 21
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
Bram Moolenaare06c1882010-07-21 22:05:20 +02006" Usage: For instructions, do :help fortran-syntax from Vim
Bram Moolenaar071d4272004-06-13 20:20:40 +00007" 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,
Bram Moolenaare06c1882010-07-21 22:05:20 +020012" Andrew Griffiths, Joe Krahn, and Hendrik Merx.
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
14" For version 5.x: Clear all syntax items
15" For version 6.x: Quit if a syntax file is already loaded
16if version < 600
17 syntax clear
18elseif exists("b:current_syntax")
19 finish
20endif
21
22" let b:fortran_dialect = fortran_dialect if set correctly by user
23if exists("fortran_dialect")
24 if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
25 let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
26 else
27 echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
28 let b:fortran_dialect = "unknown"
29 endif
30else
31 let b:fortran_dialect = "unknown"
32endif
33
34" fortran_dialect not set or set incorrectly by user,
35if b:fortran_dialect == "unknown"
36 " set b:fortran_dialect from directive in first three lines of file
37 let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
38 if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
39 let b:fortran_dialect = "F"
40 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
41 let b:fortran_dialect = "elf"
42 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
43 let b:fortran_dialect = "f90"
44 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
45 let b:fortran_dialect = "f95"
46 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
47 let b:fortran_dialect = "f77"
48 else
49 " no directive found, so assume f95
50 let b:fortran_dialect = "f95"
51 endif
52 unlet b:fortran_retype
53endif
54
55" Choose between fixed and free source form if this hasn't been done yet
56if !exists("b:fortran_fixed_source")
57 if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
58 " elf and F require free source form
59 let b:fortran_fixed_source = 0
60 elseif b:fortran_dialect == "f77"
61 " f77 requires fixed source form
62 let b:fortran_fixed_source = 1
63 elseif exists("fortran_free_source")
64 " User guarantees free source form for all f90 and f95 files
65 let b:fortran_fixed_source = 0
66 elseif exists("fortran_fixed_source")
67 " User guarantees fixed source form for all f90 and f95 files
68 let b:fortran_fixed_source = 1
69 else
70 " f90 and f95 allow both fixed and free source form.
71 " Assume fixed source form unless signs of free source form
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020072 " are detected in the first five columns of the first s:lmax lines.
Bram Moolenaar071d4272004-06-13 20:20:40 +000073 " 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.
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020076 let s:lmax = 500
77 if ( s:lmax > line("$") )
78 let s:lmax = line("$")
Bram Moolenaar071d4272004-06-13 20:20:40 +000079 endif
80 let b:fortran_fixed_source = 1
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020081 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'
Bram Moolenaar071d4272004-06-13 20:20:40 +000085 let b:fortran_fixed_source = 0
86 break
87 endif
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020088 let s:ln = s:ln + 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000089 endwhile
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020090 unlet! s:lmax s:ln s:test
Bram Moolenaar071d4272004-06-13 20:20:40 +000091 endif
92endif
93
94syn case ignore
95
Bram Moolenaar910f66f2006-04-05 20:41:53 +000096if b:fortran_dialect !=? "f77"
Bram Moolenaar071d4272004-06-13 20:20:40 +000097 if version >= 600
98 if b:fortran_fixed_source == 1
99 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
100 else
101 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
102 endif
103 if exists("fortran_more_precise")
104 syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
105 syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
106 syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
107 endif
108 else
109 if b:fortran_fixed_source == 1
110 syn match fortranConstructName "^\s\{6,}\a\w*\s*:"
111 else
112 syn match fortranConstructName "^\s*\a\w*\s*:"
113 endif
114 endif
115endif
116
117syn match fortranUnitHeader "\<end\>"
118
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000119syn match fortranType "\<character\>"
120syn match fortranType "\<complex\>"
121syn match fortranType "\<integer\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122syn keyword fortranType intrinsic
123syn match fortranType "\<implicit\>"
124syn keyword fortranStructure dimension
125syn keyword fortranStorageClass parameter save
126syn match fortranUnitHeader "\<subroutine\>"
127syn keyword fortranCall call
128syn match fortranUnitHeader "\<function\>"
129syn match fortranUnitHeader "\<program\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000130syn keyword fortranKeyword return stop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000131syn keyword fortranConditional else then
132syn match fortranConditional "\<if\>"
133syn match fortranRepeat "\<do\>"
134
135syn keyword fortranTodo contained todo fixme
136
137"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000138syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139syn match fortranParenError ")"
140
141syn match fortranOperator "\.\s*n\=eqv\s*\."
142syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
143syn match fortranOperator "\(+\|-\|/\|\*\)"
144
145syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
146
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000147syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000148
149"If tabs are allowed then the left margin checks do not work
150if exists("fortran_have_tabs")
151 syn match fortranTab "\t" transparent
152else
153 syn match fortranTab "\t"
154endif
155
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000156syn 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 +0000157
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000158syn 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 +0000159
160" Intrinsics provided by some vendors
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000161syn 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 +0000162
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000163syn 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 +0000164syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
165syn match fortran77Intrinsic "\<real\s*("me=s+4
166syn match fortranType "\<implicit\s\+real"
167syn match fortranType "^\s*real\>"
168syn match fortran90Intrinsic "\<logical\s*("me=s+7
169syn match fortranType "\<implicit\s\+logical"
170syn match fortranType "^\s*logical\>"
171
172"Numbers of various sorts
173" Integers
174syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
175" floating point number, without a decimal point
176syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
177" floating point number, starting with a decimal point
178syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
179" floating point number, no digits after decimal
180syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
181" floating point number, D or Q exponents
182syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
183" floating point number
184syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
185" Numbers in formats
186syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
187syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
188syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
189syn match fortranFormatSpec display "\d\+x\>"
190" The next match cannot be used because it would pick up identifiers as well
191" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
192
193" Numbers as labels
194syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
195syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
196syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
197syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
198syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
199
200if version >= 600 && exists("fortran_more_precise")
201 " Numbers as targets
202 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
203 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
204 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
205endif
206
207syn keyword fortranTypeEx external
208syn keyword fortranIOEx format
Bram Moolenaare06c1882010-07-21 22:05:20 +0200209syn match fortranKeywordEx "\<continue\>"
210syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000211syn match fortranKeywordEx "\<go\s*to\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
213syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000214syn keyword fortranKeywordOb assign pause to
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215
216if b:fortran_dialect != "f77"
217
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000218 syn match fortranType "\<type\>"
219 syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
221 syn keyword fortranStructure private public intent optional
222 syn keyword fortranStructure pointer target allocatable
223 syn keyword fortranStorageClass in out
224 syn match fortranStorageClass "\<kind\s*="me=s+4
225 syn match fortranStorageClass "\<len\s*="me=s+3
226
227 syn match fortranUnitHeader "\<module\>"
228 syn keyword fortranUnitHeader use only contains
229 syn keyword fortranUnitHeader result operator assignment
230 syn match fortranUnitHeader "\<interface\>"
231 syn match fortranUnitHeader "\<recursive\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000232 syn keyword fortranKeyword allocate deallocate nullify cycle exit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233 syn match fortranConditional "\<select\>"
234 syn keyword fortranConditional case default where elsewhere
235
236 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
237 syn match fortranOperator "=>"
238
239 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
240 syn keyword fortranIO pad position action delim readwrite
241 syn keyword fortranIO eor advance nml
242
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000243 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
247
248 syn match fortranUnitHeader "\<end\s*function"
249 syn match fortranUnitHeader "\<end\s*interface"
250 syn match fortranUnitHeader "\<end\s*module"
251 syn match fortranUnitHeader "\<end\s*program"
252 syn match fortranUnitHeader "\<end\s*subroutine"
253 syn match fortranRepeat "\<end\s*do"
254 syn match fortranConditional "\<end\s*where"
255 syn match fortranConditional "\<select\s*case"
256 syn match fortranConditional "\<end\s*select"
257 syn match fortranType "\<end\s*type"
258 syn match fortranType "\<in\s*out"
259
260 syn keyword fortranUnitHeaderEx procedure
261 syn keyword fortranIOEx namelist
262 syn keyword fortranConditionalEx while
263 syn keyword fortran90IntrinsicEx achar iachar transfer
264
265 syn keyword fortranInclude include
266 syn keyword fortran90StorageClassR sequence
267endif
268
269syn match fortranConditional "\<end\s*if"
270syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
271syn match fortranConditional "\<else\s*if"
272
273syn keyword fortranUnitHeaderR entry
274syn match fortranTypeR display "double\s\+precision"
275syn match fortranTypeR display "double\s\+complex"
276syn match fortranUnitHeaderR display "block\s\+data"
277syn keyword fortranStorageClassR common equivalence data
278syn keyword fortran77IntrinsicR dble dprod
279syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
280syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
281
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000282if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283 syn keyword fortranRepeat forall
284 syn match fortranRepeat "\<end\s*forall"
285 syn keyword fortran95Intrinsic null cpu_time
286 syn match fortranType "\<elemental\>"
287 syn match fortranType "\<pure\>"
288 if exists("fortran_more_precise")
289 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
290 endif
291endif
292
Bram Moolenaare06c1882010-07-21 22:05:20 +0200293if b:fortran_dialect == "f95"
294 " F2003
295 syn keyword fortran03Intrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of
296 " ISO_C_binding
297 syn keyword fortran03Constant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
298 syn keyword fortran03Constant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
299 syn keyword fortran03Intrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
300 syn keyword fortran03Type c_ptr c_funptr
301 " ISO_Fortran_env
302 syn keyword fortran03Constant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
303 " IEEE_arithmetic
304 syn keyword fortran03Intrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
305
306 syn keyword fortran03ReadWrite flush wait
307 syn keyword fortran03IO decimal round iomsg
308 syn keyword fortran03Type asynchronous nopass non_overridable pass protected volatile abstract extends import
309 syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator class
310 syn match fortran03Type "\<associate\>"
311 syn match fortran03Type "\<end\s*associate"
312 syn match fortran03Type "\<enum\s*,\s*bind\s*(\s*c\s*)"
313 syn match fortran03Type "\<end\s*enum"
314 syn match fortran03Conditional "\<select\s*type"
315 syn match fortran03Conditional "\<type\s*is\>"
316 syn match fortran03UnitHeader "\<abstract\s*interface\>"
317 syn match fortran03Operator "\([\|]\)"
318
319 " F2008
320 syn keyword fortran08Intrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
321 syn keyword fortran08Intrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
322 syn keyword fortran08Intrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image
323 syn keyword fortran08IO newunit
324 syn keyword fortran08Type contiguous
325endif
326
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327syn cluster fortranCommentGroup contains=fortranTodo
328
329if (b:fortran_fixed_source == 1)
330 if !exists("fortran_have_tabs")
331 "Flag items beyond column 72
332 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
333 "Flag left margin errors
334 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
335 syn match fortranLabelError "^.\{4}\d\S"
336 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100337 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 syn match fortranLeftMargin transparent "^ \{5}"
339 syn match fortranContinueMark display "^.\{5}\S"lc=5
340else
341 syn match fortranContinueMark display "&"
342endif
343
344if b:fortran_dialect != "f77"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000345 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346endif
347
348"cpp is often used with Fortran
349syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
350syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
351syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
352syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
353syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
354syn match cIncluded contained "<[^>]*>"
355syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
356
357"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000358if exists("fortran_fold") || exists("fortran_more_precise")
359 syn sync fromstart
360elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200361 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200363 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364endif
365
366if version >= 600 && exists("fortran_fold")
367
Bram Moolenaar071d4272004-06-13 20:20:40 +0000368 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000371 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 +0000372 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 +0200373 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 +0000374 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 +0200375 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 +0000376 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000379 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 +0000380 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 +0200381 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 +0000382 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 +0200383 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 +0000384 endif
385
386 if exists("fortran_fold_conditionals")
387 if (b:fortran_fixed_source == 1)
388 syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
389 syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
390 syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
391 syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
392 else
393 syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
394 syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
395 syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
396 syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
397 endif
398 endif
399
400 if exists("fortran_fold_multilinecomments")
401 if (b:fortran_fixed_source == 1)
402 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
403 else
404 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
405 endif
406 endif
407endif
408
409" Define the default highlighting.
410" For version 5.7 and earlier: only when not done already
411" For version 5.8 and later: only when an item doesn't have highlighting yet
412if version >= 508 || !exists("did_fortran_syn_inits")
413 if version < 508
414 let did_fortran_syn_inits = 1
415 command -nargs=+ HiLink hi link <args>
416 else
417 command -nargs=+ HiLink hi def link <args>
418 endif
419
420 " The default highlighting differs for each dialect.
421 " Transparent groups:
422 " fortranParen, fortranLeftMargin
423 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
424 " fortranBlockData
425 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
426 " fortranMultiCommentLines
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000427 HiLink fortranKeyword Keyword
428 HiLink fortranConstructName Identifier
Bram Moolenaare06c1882010-07-21 22:05:20 +0200429 HiLink fortran03Conditional fortranConditional
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000430 HiLink fortranConditional Conditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000431 HiLink fortranRepeat Repeat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000432 HiLink fortranTodo Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200433 if (b:fortran_fixed_source == 1)
434 HiLink fortranContinueMark Todo
435 else
436 HiLink fortranContinueMark Keyword
437 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438 HiLink fortranString String
439 HiLink fortranNumber Number
Bram Moolenaare06c1882010-07-21 22:05:20 +0200440 HiLink fortran03Operator fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000441 HiLink fortranOperator Operator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442 HiLink fortranBoolean Boolean
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000443 HiLink fortranLabelError Error
444 HiLink fortranObsolete Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200445 HiLink fortran03Type fortranType
446 HiLink fortran08Type fortranType
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000447 HiLink fortranType Type
448 HiLink fortranStructure Type
449 HiLink fortranStorageClass StorageClass
Bram Moolenaare06c1882010-07-21 22:05:20 +0200450 HiLink fortranCall Function
451 HiLink fortran03UnitHeader fortranUnitHeader
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000452 HiLink fortranUnitHeader fortranPreCondit
Bram Moolenaare06c1882010-07-21 22:05:20 +0200453 HiLink fortran03ReadWrite fortranReadWrite
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000454 HiLink fortranReadWrite Keyword
Bram Moolenaare06c1882010-07-21 22:05:20 +0200455 HiLink fortran03IO fortranIO
456 HiLink fortran08IO fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000457 HiLink fortranIO Keyword
458 HiLink fortran95Intrinsic fortran90Intrinsic
459 HiLink fortran77Intrinsic fortran90Intrinsic
460 HiLink fortran90Intrinsic Function
Bram Moolenaare06c1882010-07-21 22:05:20 +0200461 HiLink fortran03Intrinsic Function
462 HiLink fortran08Intrinsic Function
463 HiLink fortran03Constant Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464
465 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000466 HiLink fortranKeywordOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467 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
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000474 HiLink fortranInclude fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000475 else
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000476 HiLink fortranKeywordOb fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477 HiLink fortran66Intrinsic fortran90Intrinsic
478 HiLink fortran77IntrinsicR fortran90Intrinsic
479 HiLink fortranUnitHeaderR fortranPreCondit
480 HiLink fortranTypeR fortranType
481 HiLink fortranStorageClassR fortranStorageClass
482 HiLink fortran77OperatorR fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000483 HiLink fortranInclude Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484 HiLink fortran90StorageClassR fortranStorageClass
485 endif
486
487 if ( b:fortran_dialect == "F" )
488 HiLink fortranLabelNumber fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000489 HiLink fortranTarget fortranObsolete
490 HiLink fortranFormatSpec fortranObsolete
491 HiLink fortranFloatDExp fortranObsolete
492 HiLink fortranFloatNoDec fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000493 HiLink fortranFloatIniDec fortranObsolete
494 HiLink fortranFloatEndDec fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000495 HiLink fortranTypeEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496 HiLink fortranIOEx fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000497 HiLink fortranKeywordEx fortranObsolete
498 HiLink fortranStringEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000499 HiLink fortran77IntrinsicEx fortranObsolete
500 HiLink fortranUnitHeaderEx fortranObsolete
501 HiLink fortranConditionalEx fortranObsolete
502 HiLink fortran90IntrinsicEx fortranObsolete
503 else
504 HiLink fortranLabelNumber Special
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000505 HiLink fortranTarget Special
506 HiLink fortranFormatSpec Identifier
507 HiLink fortranFloatDExp fortranFloat
508 HiLink fortranFloatNoDec fortranFloat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000509 HiLink fortranFloatIniDec fortranFloat
510 HiLink fortranFloatEndDec fortranFloat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000511 HiLink fortranTypeEx fortranType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000512 HiLink fortranIOEx fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000513 HiLink fortranKeywordEx fortranKeyword
514 HiLink fortranStringEx fortranString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000515 HiLink fortran77IntrinsicEx fortran90Intrinsic
516 HiLink fortranUnitHeaderEx fortranUnitHeader
517 HiLink fortranConditionalEx fortranConditional
518 HiLink fortran90IntrinsicEx fortran90Intrinsic
519 endif
520
521 HiLink fortranFloat Float
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000522 HiLink fortranPreCondit PreCondit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000523 HiLink fortranInclude Include
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000524 HiLink cIncluded fortranString
525 HiLink cInclude Include
526 HiLink cPreProc PreProc
527 HiLink cPreCondit PreCondit
528 HiLink fortranParenError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000529 HiLink fortranComment Comment
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000530 HiLink fortranSerialNumber Todo
531 HiLink fortranTab Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000532 " Vendor extensions
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000533 HiLink fortranExtraIntrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000534
535 delcommand HiLink
536endif
537
538let b:current_syntax = "fortran"
539
540" vim: ts=8 tw=132