blob: 3e5cb220b63ea9b6daaa4e83dce08009fb22c152 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar6ee8d892012-01-10 14:55:01 +01002" Language: Fortran 2008 (and earlier versions including 2003, 95, 90, and 77)
3" Version: 0.91
4" Last Change: 2012 Jan. 02
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\>"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100136syn match fortranConditionalOb "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137syn match fortranRepeat "\<do\>"
138
139syn keyword fortranTodo contained todo fixme
140
141"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000142syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143syn match fortranParenError ")"
144
145syn match fortranOperator "\.\s*n\=eqv\s*\."
146syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
147syn match fortranOperator "\(+\|-\|/\|\*\)"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100148syn match fortranTypeOb "\<character\>\@<=\s*\*"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149
150syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
151
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000152syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153
154"If tabs are allowed then the left margin checks do not work
155if exists("fortran_have_tabs")
156 syn match fortranTab "\t" transparent
157else
158 syn match fortranTab "\t"
159endif
160
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000161syn 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 +0000162
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000163syn 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 +0000164
165" Intrinsics provided by some vendors
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100166syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama 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 +0000167
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000168syn 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 +0000169syn match fortran77Intrinsic "\<len\s*[(,]"me=s+3
170syn match fortran77Intrinsic "\<real\s*("me=s+4
171syn match fortranType "\<implicit\s\+real"
172syn match fortranType "^\s*real\>"
173syn match fortran90Intrinsic "\<logical\s*("me=s+7
174syn match fortranType "\<implicit\s\+logical"
175syn match fortranType "^\s*logical\>"
176
177"Numbers of various sorts
178" Integers
179syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
180" floating point number, without a decimal point
181syn match fortranFloatNoDec display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
182" floating point number, starting with a decimal point
183syn match fortranFloatIniDec display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number, no digits after decimal
185syn match fortranFloatEndDec display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" floating point number, D or Q exponents
187syn match fortranFloatDExp display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
188" floating point number
189syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
190" Numbers in formats
191syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
192syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
193syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
194syn match fortranFormatSpec display "\d\+x\>"
195" The next match cannot be used because it would pick up identifiers as well
196" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
197
198" Numbers as labels
199syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
200syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
201syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
202syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
203syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
204
205if version >= 600 && exists("fortran_more_precise")
206 " Numbers as targets
207 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
208 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
209 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
210endif
211
212syn keyword fortranTypeEx external
213syn keyword fortranIOEx format
Bram Moolenaare06c1882010-07-21 22:05:20 +0200214syn match fortranKeywordEx "\<continue\>"
215syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100216syn match fortranKeyword "\<go\s*to\>"
217syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$"
218syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000219syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
220syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100221syn keyword fortranKeywordDel assign pause
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222
223if b:fortran_dialect != "f77"
224
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000225 syn match fortranType "\<type\>"
226 syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000227
228 syn keyword fortranStructure private public intent optional
229 syn keyword fortranStructure pointer target allocatable
230 syn keyword fortranStorageClass in out
231 syn match fortranStorageClass "\<kind\s*="me=s+4
232 syn match fortranStorageClass "\<len\s*="me=s+3
233
234 syn match fortranUnitHeader "\<module\>"
235 syn keyword fortranUnitHeader use only contains
236 syn keyword fortranUnitHeader result operator assignment
237 syn match fortranUnitHeader "\<interface\>"
238 syn match fortranUnitHeader "\<recursive\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000239 syn keyword fortranKeyword allocate deallocate nullify cycle exit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240 syn match fortranConditional "\<select\>"
241 syn keyword fortranConditional case default where elsewhere
242
243 syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
244 syn match fortranOperator "=>"
245
246 syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
247 syn keyword fortranIO pad position action delim readwrite
248 syn keyword fortranIO eor advance nml
249
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000250 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
251 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 +0000252 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253 syn match fortran90Intrinsic "\<kind\>\s*[(,]"me=s+4
254
255 syn match fortranUnitHeader "\<end\s*function"
256 syn match fortranUnitHeader "\<end\s*interface"
257 syn match fortranUnitHeader "\<end\s*module"
258 syn match fortranUnitHeader "\<end\s*program"
259 syn match fortranUnitHeader "\<end\s*subroutine"
260 syn match fortranRepeat "\<end\s*do"
261 syn match fortranConditional "\<end\s*where"
262 syn match fortranConditional "\<select\s*case"
263 syn match fortranConditional "\<end\s*select"
264 syn match fortranType "\<end\s*type"
265 syn match fortranType "\<in\s*out"
266
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100267 syn keyword fortranType procedure
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268 syn keyword fortranIOEx namelist
269 syn keyword fortranConditionalEx while
270 syn keyword fortran90IntrinsicEx achar iachar transfer
271
272 syn keyword fortranInclude include
273 syn keyword fortran90StorageClassR sequence
274endif
275
276syn match fortranConditional "\<end\s*if"
277syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
278syn match fortranConditional "\<else\s*if"
279
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100280syn keyword fortranUnitHeaderOb entry
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281syn match fortranTypeR display "double\s\+precision"
282syn match fortranTypeR display "double\s\+complex"
283syn match fortranUnitHeaderR display "block\s\+data"
284syn keyword fortranStorageClassR common equivalence data
285syn keyword fortran77IntrinsicR dble dprod
286syn match fortran77OperatorR "\.\s*[gl][et]\s*\."
287syn match fortran77OperatorR "\.\s*\(eq\|ne\)\s*\."
288
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000289if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290 syn keyword fortranRepeat forall
291 syn match fortranRepeat "\<end\s*forall"
292 syn keyword fortran95Intrinsic null cpu_time
293 syn match fortranType "\<elemental\>"
294 syn match fortranType "\<pure\>"
295 if exists("fortran_more_precise")
296 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
297 endif
298endif
299
Bram Moolenaare06c1882010-07-21 22:05:20 +0200300if b:fortran_dialect == "f95"
301 " F2003
302 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
303 " ISO_C_binding
304 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
305 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
306 syn keyword fortran03Intrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
307 syn keyword fortran03Type c_ptr c_funptr
308 " ISO_Fortran_env
309 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
310 " IEEE_arithmetic
311 syn keyword fortran03Intrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
312
313 syn keyword fortran03ReadWrite flush wait
314 syn keyword fortran03IO decimal round iomsg
315 syn keyword fortran03Type asynchronous nopass non_overridable pass protected volatile abstract extends import
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100316 syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator
317 syn match fortran03Type "\<class\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200318 syn match fortran03Type "\<associate\>"
319 syn match fortran03Type "\<end\s*associate"
320 syn match fortran03Type "\<enum\s*,\s*bind\s*(\s*c\s*)"
321 syn match fortran03Type "\<end\s*enum"
322 syn match fortran03Conditional "\<select\s*type"
323 syn match fortran03Conditional "\<type\s*is\>"
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100324 syn match fortran03Conditional "\<class\s*is\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200325 syn match fortran03UnitHeader "\<abstract\s*interface\>"
326 syn match fortran03Operator "\([\|]\)"
327
328 " F2008
329 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
330 syn keyword fortran08Intrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
331 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
332 syn keyword fortran08IO newunit
333 syn keyword fortran08Type contiguous
334endif
335
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336syn cluster fortranCommentGroup contains=fortranTodo
337
338if (b:fortran_fixed_source == 1)
339 if !exists("fortran_have_tabs")
340 "Flag items beyond column 72
341 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
342 "Flag left margin errors
343 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
344 syn match fortranLabelError "^.\{4}\d\S"
345 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100346 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347 syn match fortranLeftMargin transparent "^ \{5}"
348 syn match fortranContinueMark display "^.\{5}\S"lc=5
349else
350 syn match fortranContinueMark display "&"
351endif
352
353if b:fortran_dialect != "f77"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000354 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355endif
356
357"cpp is often used with Fortran
358syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
359syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
360syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
361syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
362syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
363syn match cIncluded contained "<[^>]*>"
364syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
365
366"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000367if exists("fortran_fold") || exists("fortran_more_precise")
368 syn sync fromstart
369elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200370 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200372 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373endif
374
375if version >= 600 && exists("fortran_fold")
376
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 if (b:fortran_fixed_source == 1)
378 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
379 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 +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="^\([!c*]\|\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="^\([!c*]\|\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="^\([!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 +0000383 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 +0200384 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 +0000385 else
386 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
387 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 +0000388 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 +0000389 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 +0200390 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 +0000391 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 +0200392 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 +0000393 endif
394
395 if exists("fortran_fold_conditionals")
396 if (b:fortran_fixed_source == 1)
397 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
398 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
399 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
400 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
401 else
402 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
403 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
404 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
405 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
406 endif
407 endif
408
409 if exists("fortran_fold_multilinecomments")
410 if (b:fortran_fixed_source == 1)
411 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
412 else
413 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
414 endif
415 endif
416endif
417
418" Define the default highlighting.
419" For version 5.7 and earlier: only when not done already
420" For version 5.8 and later: only when an item doesn't have highlighting yet
421if version >= 508 || !exists("did_fortran_syn_inits")
422 if version < 508
423 let did_fortran_syn_inits = 1
424 command -nargs=+ HiLink hi link <args>
425 else
426 command -nargs=+ HiLink hi def link <args>
427 endif
428
429 " The default highlighting differs for each dialect.
430 " Transparent groups:
431 " fortranParen, fortranLeftMargin
432 " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
433 " fortranBlockData
434 " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
435 " fortranMultiCommentLines
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000436 HiLink fortranKeyword Keyword
437 HiLink fortranConstructName Identifier
Bram Moolenaare06c1882010-07-21 22:05:20 +0200438 HiLink fortran03Conditional fortranConditional
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000439 HiLink fortranConditional Conditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440 HiLink fortranRepeat Repeat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000441 HiLink fortranTodo Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200442 if (b:fortran_fixed_source == 1)
443 HiLink fortranContinueMark Todo
444 else
445 HiLink fortranContinueMark Keyword
446 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447 HiLink fortranString String
448 HiLink fortranNumber Number
Bram Moolenaare06c1882010-07-21 22:05:20 +0200449 HiLink fortran03Operator fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000450 HiLink fortranOperator Operator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451 HiLink fortranBoolean Boolean
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000452 HiLink fortranLabelError Error
453 HiLink fortranObsolete Todo
Bram Moolenaare06c1882010-07-21 22:05:20 +0200454 HiLink fortran03Type fortranType
455 HiLink fortran08Type fortranType
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000456 HiLink fortranType Type
457 HiLink fortranStructure Type
458 HiLink fortranStorageClass StorageClass
Bram Moolenaare06c1882010-07-21 22:05:20 +0200459 HiLink fortranCall Function
460 HiLink fortran03UnitHeader fortranUnitHeader
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000461 HiLink fortranUnitHeader fortranPreCondit
Bram Moolenaare06c1882010-07-21 22:05:20 +0200462 HiLink fortran03ReadWrite fortranReadWrite
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000463 HiLink fortranReadWrite Keyword
Bram Moolenaare06c1882010-07-21 22:05:20 +0200464 HiLink fortran03IO fortranIO
465 HiLink fortran08IO fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000466 HiLink fortranIO Keyword
467 HiLink fortran95Intrinsic fortran90Intrinsic
468 HiLink fortran77Intrinsic fortran90Intrinsic
469 HiLink fortran90Intrinsic Function
Bram Moolenaare06c1882010-07-21 22:05:20 +0200470 HiLink fortran03Intrinsic Function
471 HiLink fortran08Intrinsic Function
472 HiLink fortran03Constant Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000473
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100474 if b:fortran_dialect != "f77"
475 HiLink fortranUnitHeaderOb Todo
476 HiLink fortranKeywordOb Todo
477 HiLink fortranConditionalOb Todo
478 HiLink fortranTypeOb Todo
479 HiLink fortranKeywordDel Todo
480 else
481 HiLink fortranUnitHeaderOb fortranUnitHeader
482 HiLink fortranKeywordOb fortranKeyword
483 HiLink fortranConditionalOb fortranConditional
484 HiLink fortranTypeOb fortranType
485 HiLink fortranKeywordDel fortranKeyword
486 endif
487
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000489 HiLink fortranKeywordOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000490 HiLink fortran66Intrinsic fortranObsolete
491 HiLink fortran77IntrinsicR fortranObsolete
492 HiLink fortranUnitHeaderR fortranObsolete
493 HiLink fortranTypeR fortranObsolete
494 HiLink fortranStorageClassR fortranObsolete
495 HiLink fortran90StorageClassR fortranObsolete
496 HiLink fortran77OperatorR fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000497 HiLink fortranInclude fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498 else
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000499 HiLink fortranKeywordOb fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500 HiLink fortran66Intrinsic fortran90Intrinsic
501 HiLink fortran77IntrinsicR fortran90Intrinsic
502 HiLink fortranUnitHeaderR fortranPreCondit
503 HiLink fortranTypeR fortranType
504 HiLink fortranStorageClassR fortranStorageClass
505 HiLink fortran77OperatorR fortranOperator
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000506 HiLink fortranInclude Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000507 HiLink fortran90StorageClassR fortranStorageClass
508 endif
509
510 if ( b:fortran_dialect == "F" )
511 HiLink fortranLabelNumber fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000512 HiLink fortranTarget fortranObsolete
513 HiLink fortranFormatSpec fortranObsolete
514 HiLink fortranFloatDExp fortranObsolete
515 HiLink fortranFloatNoDec fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516 HiLink fortranFloatIniDec fortranObsolete
517 HiLink fortranFloatEndDec fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000518 HiLink fortranTypeEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519 HiLink fortranIOEx fortranObsolete
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000520 HiLink fortranKeywordEx fortranObsolete
521 HiLink fortranStringEx fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000522 HiLink fortran77IntrinsicEx fortranObsolete
523 HiLink fortranUnitHeaderEx fortranObsolete
524 HiLink fortranConditionalEx fortranObsolete
525 HiLink fortran90IntrinsicEx fortranObsolete
526 else
527 HiLink fortranLabelNumber Special
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000528 HiLink fortranTarget Special
529 HiLink fortranFormatSpec Identifier
530 HiLink fortranFloatDExp fortranFloat
531 HiLink fortranFloatNoDec fortranFloat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000532 HiLink fortranFloatIniDec fortranFloat
533 HiLink fortranFloatEndDec fortranFloat
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000534 HiLink fortranTypeEx fortranType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535 HiLink fortranIOEx fortranIO
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000536 HiLink fortranKeywordEx fortranKeyword
537 HiLink fortranStringEx fortranString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538 HiLink fortran77IntrinsicEx fortran90Intrinsic
539 HiLink fortranUnitHeaderEx fortranUnitHeader
540 HiLink fortranConditionalEx fortranConditional
541 HiLink fortran90IntrinsicEx fortran90Intrinsic
542 endif
543
544 HiLink fortranFloat Float
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000545 HiLink fortranPreCondit PreCondit
Bram Moolenaar071d4272004-06-13 20:20:40 +0000546 HiLink fortranInclude Include
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000547 HiLink cIncluded fortranString
548 HiLink cInclude Include
549 HiLink cPreProc PreProc
550 HiLink cPreCondit PreCondit
551 HiLink fortranParenError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552 HiLink fortranComment Comment
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000553 HiLink fortranSerialNumber Todo
554 HiLink fortranTab Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000555 " Vendor extensions
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000556 HiLink fortranExtraIntrinsic Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000557
558 delcommand HiLink
559endif
560
561let b:current_syntax = "fortran"
562
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100563let &cpo = s:cpo_save
564unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000565" vim: ts=8 tw=132