blob: e1d82ac0aad7112a1c7e9dc6cafd3cb46378e3a7 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Fortran95 (and Fortran90, Fortran77, F and elf90)
Bram Moolenaarb6b046b2011-12-30 13:11:27 +01003" Version: 0.90
4" Last Change: 2011 Dec. 28
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
Bram Moolenaarb6b046b2011-12-30 13:11:27 +010022let s:cpo_save = &cpo
23set cpo&vim
24
Bram Moolenaar071d4272004-06-13 20:20:40 +000025" let b:fortran_dialect = fortran_dialect if set correctly by user
26if exists("fortran_dialect")
27 if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
28 let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
29 else
30 echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
31 let b:fortran_dialect = "unknown"
32 endif
33else
34 let b:fortran_dialect = "unknown"
35endif
36
37" fortran_dialect not set or set incorrectly by user,
38if b:fortran_dialect == "unknown"
39 " set b:fortran_dialect from directive in first three lines of file
40 let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
41 if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
42 let b:fortran_dialect = "F"
43 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
44 let b:fortran_dialect = "elf"
45 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
46 let b:fortran_dialect = "f90"
47 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
48 let b:fortran_dialect = "f95"
49 elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
50 let b:fortran_dialect = "f77"
51 else
52 " no directive found, so assume f95
53 let b:fortran_dialect = "f95"
54 endif
55 unlet b:fortran_retype
56endif
57
58" Choose between fixed and free source form if this hasn't been done yet
59if !exists("b:fortran_fixed_source")
60 if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
61 " elf and F require free source form
62 let b:fortran_fixed_source = 0
63 elseif b:fortran_dialect == "f77"
64 " f77 requires fixed source form
65 let b:fortran_fixed_source = 1
66 elseif exists("fortran_free_source")
67 " User guarantees free source form for all f90 and f95 files
68 let b:fortran_fixed_source = 0
69 elseif exists("fortran_fixed_source")
70 " User guarantees fixed source form for all f90 and f95 files
71 let b:fortran_fixed_source = 1
72 else
73 " f90 and f95 allow both fixed and free source form.
74 " Assume fixed source form unless signs of free source form
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020075 " are detected in the first five columns of the first s:lmax lines.
Bram Moolenaar071d4272004-06-13 20:20:40 +000076 " Detection becomes more accurate and time-consuming if more lines
77 " are checked. Increase the limit below if you keep lots of comments at
78 " the very top of each file and you have a fast computer.
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020079 let s:lmax = 500
80 if ( s:lmax > line("$") )
81 let s:lmax = line("$")
Bram Moolenaar071d4272004-06-13 20:20:40 +000082 endif
83 let b:fortran_fixed_source = 1
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020084 let s:ln=1
85 while s:ln <= s:lmax
86 let s:test = strpart(getline(s:ln),0,5)
87 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
Bram Moolenaar071d4272004-06-13 20:20:40 +000088 let b:fortran_fixed_source = 0
89 break
90 endif
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020091 let s:ln = s:ln + 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000092 endwhile
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020093 unlet! s:lmax s:ln s:test
Bram Moolenaar071d4272004-06-13 20:20:40 +000094 endif
95endif
96
97syn case ignore
98
Bram Moolenaar910f66f2006-04-05 20:41:53 +000099if b:fortran_dialect !=? "f77"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000100 if version >= 600
101 if b:fortran_fixed_source == 1
102 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
103 else
104 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
105 endif
106 if exists("fortran_more_precise")
107 syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
108 syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
109 syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
110 endif
111 else
112 if b:fortran_fixed_source == 1
113 syn match fortranConstructName "^\s\{6,}\a\w*\s*:"
114 else
115 syn match fortranConstructName "^\s*\a\w*\s*:"
116 endif
117 endif
118endif
119
120syn match fortranUnitHeader "\<end\>"
121
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000122syn match fortranType "\<character\>"
123syn match fortranType "\<complex\>"
124syn match fortranType "\<integer\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125syn keyword fortranType intrinsic
126syn match fortranType "\<implicit\>"
127syn keyword fortranStructure dimension
128syn keyword fortranStorageClass parameter save
129syn match fortranUnitHeader "\<subroutine\>"
130syn keyword fortranCall call
131syn match fortranUnitHeader "\<function\>"
132syn match fortranUnitHeader "\<program\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000133syn keyword fortranKeyword return stop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134syn keyword fortranConditional else then
135syn match fortranConditional "\<if\>"
136syn match fortranRepeat "\<do\>"
137
138syn keyword fortranTodo contained todo fixme
139
140"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000141syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142syn match fortranParenError ")"
143
144syn match fortranOperator "\.\s*n\=eqv\s*\."
145syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
146syn match fortranOperator "\(+\|-\|/\|\*\)"
147
148syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
149
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000150syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151
152"If tabs are allowed then the left margin checks do not work
153if exists("fortran_have_tabs")
154 syn match fortranTab "\t" transparent
155else
156 syn match fortranTab "\t"
157endif
158
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000159syn 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 +0000160
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000161syn 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 +0000162
163" Intrinsics provided by some vendors
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000164syn 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 +0000165
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000166syn 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 +0000167syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
168syn match fortran77Intrinsic "\<real\s*("me=s+4
169syn match fortranType "\<implicit\s\+real"
170syn match fortranType "^\s*real\>"
171syn match fortran90Intrinsic "\<logical\s*("me=s+7
172syn match fortranType "\<implicit\s\+logical"
173syn match fortranType "^\s*logical\>"
174
175"Numbers of various sorts
176" Integers
177syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
178" floating point number, without a decimal point
179syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
180" floating point number, starting with a decimal point
181syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
182" floating point number, no digits after decimal
183syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number, D or Q exponents
185syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" floating point number
187syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
188" Numbers in formats
189syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
190syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
191syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
192syn match fortranFormatSpec display "\d\+x\>"
193" The next match cannot be used because it would pick up identifiers as well
194" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
195
196" Numbers as labels
197syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
198syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
199syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
200syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
201syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
202
203if version >= 600 && exists("fortran_more_precise")
204 " Numbers as targets
205 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
206 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
207 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
208endif
209
210syn keyword fortranTypeEx external
211syn keyword fortranIOEx format
Bram Moolenaare06c1882010-07-21 22:05:20 +0200212syn match fortranKeywordEx "\<continue\>"
213syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000214syn match fortranKeywordEx "\<go\s*to\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
216syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000217syn keyword fortranKeywordOb assign pause to
Bram Moolenaar071d4272004-06-13 20:20:40 +0000218
219if b:fortran_dialect != "f77"
220
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000221 syn match fortranType "\<type\>"
222 syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223
224 syn keyword fortranStructure private public intent optional
225 syn keyword fortranStructure pointer target allocatable
226 syn keyword fortranStorageClass in out
227 syn match fortranStorageClass "\<kind\s*="me=s+4
228 syn match fortranStorageClass "\<len\s*="me=s+3
229
230 syn match fortranUnitHeader "\<module\>"
231 syn keyword fortranUnitHeader use only contains
232 syn keyword fortranUnitHeader result operator assignment
233 syn match fortranUnitHeader "\<interface\>"
234 syn match fortranUnitHeader "\<recursive\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000235 syn keyword fortranKeyword allocate deallocate nullify cycle exit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236 syn match fortranConditional "\<select\>"
237 syn keyword fortranConditional case default where elsewhere
238
239 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
240 syn match fortranOperator "=>"
241
242 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
243 syn keyword fortranIO pad position action delim readwrite
244 syn keyword fortranIO eor advance nml
245
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000246 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
247 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 +0000248 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
250
251 syn match fortranUnitHeader "\<end\s*function"
252 syn match fortranUnitHeader "\<end\s*interface"
253 syn match fortranUnitHeader "\<end\s*module"
254 syn match fortranUnitHeader "\<end\s*program"
255 syn match fortranUnitHeader "\<end\s*subroutine"
256 syn match fortranRepeat "\<end\s*do"
257 syn match fortranConditional "\<end\s*where"
258 syn match fortranConditional "\<select\s*case"
259 syn match fortranConditional "\<end\s*select"
260 syn match fortranType "\<end\s*type"
261 syn match fortranType "\<in\s*out"
262
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100263 syn keyword fortranType procedure
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264 syn keyword fortranIOEx namelist
265 syn keyword fortranConditionalEx while
266 syn keyword fortran90IntrinsicEx achar iachar transfer
267
268 syn keyword fortranInclude include
269 syn keyword fortran90StorageClassR sequence
270endif
271
272syn match fortranConditional "\<end\s*if"
273syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
274syn match fortranConditional "\<else\s*if"
275
276syn keyword fortranUnitHeaderR entry
277syn match fortranTypeR display "double\s\+precision"
278syn match fortranTypeR display "double\s\+complex"
279syn match fortranUnitHeaderR display "block\s\+data"
280syn keyword fortranStorageClassR common equivalence data
281syn keyword fortran77IntrinsicR dble dprod
282syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
283syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
284
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000285if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286 syn keyword fortranRepeat forall
287 syn match fortranRepeat "\<end\s*forall"
288 syn keyword fortran95Intrinsic null cpu_time
289 syn match fortranType "\<elemental\>"
290 syn match fortranType "\<pure\>"
291 if exists("fortran_more_precise")
292 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
293 endif
294endif
295
Bram Moolenaare06c1882010-07-21 22:05:20 +0200296if b:fortran_dialect == "f95"
297 " F2003
298 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
299 " ISO_C_binding
300 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
301 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
302 syn keyword fortran03Intrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
303 syn keyword fortran03Type c_ptr c_funptr
304 " ISO_Fortran_env
305 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
306 " IEEE_arithmetic
307 syn keyword fortran03Intrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
308
309 syn keyword fortran03ReadWrite flush wait
310 syn keyword fortran03IO decimal round iomsg
311 syn keyword fortran03Type asynchronous nopass non_overridable pass protected volatile abstract extends import
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100312 syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator
313 syn match fortran03Type "\<class\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200314 syn match fortran03Type "\<associate\>"
315 syn match fortran03Type "\<end\s*associate"
316 syn match fortran03Type "\<enum\s*,\s*bind\s*(\s*c\s*)"
317 syn match fortran03Type "\<end\s*enum"
318 syn match fortran03Conditional "\<select\s*type"
319 syn match fortran03Conditional "\<type\s*is\>"
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100320 syn match fortran03Conditional "\<class\s*is\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200321 syn match fortran03UnitHeader "\<abstract\s*interface\>"
322 syn match fortran03Operator "\([\|]\)"
323
324 " F2008
325 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
326 syn keyword fortran08Intrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
327 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
328 syn keyword fortran08IO newunit
329 syn keyword fortran08Type contiguous
330endif
331
Bram Moolenaar071d4272004-06-13 20:20:40 +0000332syn cluster fortranCommentGroup contains=fortranTodo
333
334if (b:fortran_fixed_source == 1)
335 if !exists("fortran_have_tabs")
336 "Flag items beyond column 72
337 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
338 "Flag left margin errors
339 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
340 syn match fortranLabelError "^.\{4}\d\S"
341 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100342 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343 syn match fortranLeftMargin transparent "^ \{5}"
344 syn match fortranContinueMark display "^.\{5}\S"lc=5
345else
346 syn match fortranContinueMark display "&"
347endif
348
349if b:fortran_dialect != "f77"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000350 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000351endif
352
353"cpp is often used with Fortran
354syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
355syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
356syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
357syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
358syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
359syn match cIncluded contained "<[^>]*>"
360syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
361
362"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000363if exists("fortran_fold") || exists("fortran_more_precise")
364 syn sync fromstart
365elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200366 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200368 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369endif
370
371if version >= 600 && exists("fortran_fold")
372
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373 if (b:fortran_fixed_source == 1)
374 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
375 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 +0000376 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 +0000377 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 +0200378 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 +0000379 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 +0200380 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 +0000381 else
382 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
383 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 +0000384 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 +0000385 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 +0200386 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 +0000387 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 +0200388 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 +0000389 endif
390
391 if exists("fortran_fold_conditionals")
392 if (b:fortran_fixed_source == 1)
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="^\([!c*]\|\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="^\([!c*]\|\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="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
397 else
398 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
399 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
400 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
401 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
402 endif
403 endif
404
405 if exists("fortran_fold_multilinecomments")
406 if (b:fortran_fixed_source == 1)
407 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
408 else
409 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
410 endif
411 endif
412endif
413
414" Define the default highlighting.
415" For version 5.7 and earlier: only when not done already
416" For version 5.8 and later: only when an item doesn't have highlighting yet
417if version >= 508 || !exists("did_fortran_syn_inits")
418 if version < 508
419 let did_fortran_syn_inits = 1
420 command -nargs=+ HiLink hi link <args>
421 else
422 command -nargs=+ HiLink hi def link <args>
423 endif
424
425 " The default highlighting differs for each dialect.
426 " Transparent groups:
427 " fortranParen, fortranLeftMargin
428 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
429 " fortranBlockData
430 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
431 " fortranMultiCommentLines
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000432 HiLink fortranKeyword Keyword
433 HiLink fortranConstructName Identifier
Bram Moolenaare06c1882010-07-21 22:05:20 +0200434 HiLink fortran03Conditional fortranConditional
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000435 HiLink fortranConditional Conditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436 HiLink fortranRepeat Repeat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000437 HiLink fortranTodo Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200438 if (b:fortran_fixed_source == 1)
439 HiLink fortranContinueMark Todo
440 else
441 HiLink fortranContinueMark Keyword
442 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 HiLink fortranString String
444 HiLink fortranNumber Number
Bram Moolenaare06c1882010-07-21 22:05:20 +0200445 HiLink fortran03Operator fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000446 HiLink fortranOperator Operator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447 HiLink fortranBoolean Boolean
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000448 HiLink fortranLabelError Error
449 HiLink fortranObsolete Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200450 HiLink fortran03Type fortranType
451 HiLink fortran08Type fortranType
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000452 HiLink fortranType Type
453 HiLink fortranStructure Type
454 HiLink fortranStorageClass StorageClass
Bram Moolenaare06c1882010-07-21 22:05:20 +0200455 HiLink fortranCall Function
456 HiLink fortran03UnitHeader fortranUnitHeader
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000457 HiLink fortranUnitHeader fortranPreCondit
Bram Moolenaare06c1882010-07-21 22:05:20 +0200458 HiLink fortran03ReadWrite fortranReadWrite
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000459 HiLink fortranReadWrite Keyword
Bram Moolenaare06c1882010-07-21 22:05:20 +0200460 HiLink fortran03IO fortranIO
461 HiLink fortran08IO fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000462 HiLink fortranIO Keyword
463 HiLink fortran95Intrinsic fortran90Intrinsic
464 HiLink fortran77Intrinsic fortran90Intrinsic
465 HiLink fortran90Intrinsic Function
Bram Moolenaare06c1882010-07-21 22:05:20 +0200466 HiLink fortran03Intrinsic Function
467 HiLink fortran08Intrinsic Function
468 HiLink fortran03Constant Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469
470 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000471 HiLink fortranKeywordOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000472 HiLink fortran66Intrinsic fortranObsolete
473 HiLink fortran77IntrinsicR fortranObsolete
474 HiLink fortranUnitHeaderR fortranObsolete
475 HiLink fortranTypeR fortranObsolete
476 HiLink fortranStorageClassR fortranObsolete
477 HiLink fortran90StorageClassR fortranObsolete
478 HiLink fortran77OperatorR fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000479 HiLink fortranInclude fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480 else
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000481 HiLink fortranKeywordOb fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482 HiLink fortran66Intrinsic fortran90Intrinsic
483 HiLink fortran77IntrinsicR fortran90Intrinsic
484 HiLink fortranUnitHeaderR fortranPreCondit
485 HiLink fortranTypeR fortranType
486 HiLink fortranStorageClassR fortranStorageClass
487 HiLink fortran77OperatorR fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000488 HiLink fortranInclude Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000489 HiLink fortran90StorageClassR fortranStorageClass
490 endif
491
492 if ( b:fortran_dialect == "F" )
493 HiLink fortranLabelNumber fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000494 HiLink fortranTarget fortranObsolete
495 HiLink fortranFormatSpec fortranObsolete
496 HiLink fortranFloatDExp fortranObsolete
497 HiLink fortranFloatNoDec fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498 HiLink fortranFloatIniDec fortranObsolete
499 HiLink fortranFloatEndDec fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000500 HiLink fortranTypeEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501 HiLink fortranIOEx fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000502 HiLink fortranKeywordEx fortranObsolete
503 HiLink fortranStringEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000504 HiLink fortran77IntrinsicEx fortranObsolete
505 HiLink fortranUnitHeaderEx fortranObsolete
506 HiLink fortranConditionalEx fortranObsolete
507 HiLink fortran90IntrinsicEx fortranObsolete
508 else
509 HiLink fortranLabelNumber Special
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000510 HiLink fortranTarget Special
511 HiLink fortranFormatSpec Identifier
512 HiLink fortranFloatDExp fortranFloat
513 HiLink fortranFloatNoDec fortranFloat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000514 HiLink fortranFloatIniDec fortranFloat
515 HiLink fortranFloatEndDec fortranFloat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000516 HiLink fortranTypeEx fortranType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000517 HiLink fortranIOEx fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000518 HiLink fortranKeywordEx fortranKeyword
519 HiLink fortranStringEx fortranString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000520 HiLink fortran77IntrinsicEx fortran90Intrinsic
521 HiLink fortranUnitHeaderEx fortranUnitHeader
522 HiLink fortranConditionalEx fortranConditional
523 HiLink fortran90IntrinsicEx fortran90Intrinsic
524 endif
525
526 HiLink fortranFloat Float
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000527 HiLink fortranPreCondit PreCondit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000528 HiLink fortranInclude Include
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000529 HiLink cIncluded fortranString
530 HiLink cInclude Include
531 HiLink cPreProc PreProc
532 HiLink cPreCondit PreCondit
533 HiLink fortranParenError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000534 HiLink fortranComment Comment
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000535 HiLink fortranSerialNumber Todo
536 HiLink fortranTab Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000537 " Vendor extensions
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000538 HiLink fortranExtraIntrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000539
540 delcommand HiLink
541endif
542
543let b:current_syntax = "fortran"
544
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100545let &cpo = s:cpo_save
546unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547" vim: ts=8 tw=132