blob: b470e56f607ea07fa7fcad88f512dcc84819b7c5 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar256972a2015-12-29 19:10:25 +01002" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
Bram Moolenaardae8d212016-02-27 22:40:16 +01003" Version: 0.97
4" Last Change: 2016 Feb. 26
Bram Moolenaar8a94d872015-01-25 13:02:57 +01005" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~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:
Bram Moolenaardae8d212016-02-27 22:40:16 +01008" Version 0.1 (April 2000) was based on the fortran 77 syntax file by Mario Eusebio and
9" Preben Guldberg. Since then, useful suggestions and contributions have been made,
10" in chronological order, by:
11" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
Bram Moolenaar071d4272004-06-13 20:20:40 +000012" Walter Dieudonné, Alexander Wagner, Roman Bertle, Charles Rendleman,
Bram Moolenaardae8d212016-02-27 22:40:16 +010013" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, and Jan Hermann.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar6be7f872012-01-20 21:08:56 +010015if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000016 finish
17endif
18
Bram Moolenaarb6b046b2011-12-30 13:11:27 +010019let s:cpo_save = &cpo
20set cpo&vim
21
Bram Moolenaar6be7f872012-01-20 21:08:56 +010022" Choose fortran_dialect using the priority:
Bram Moolenaar256972a2015-12-29 19:10:25 +010023" source file directive > buffer-local value > global value > file extension
24" first try using directive in first three lines of file
Bram Moolenaar6be7f872012-01-20 21:08:56 +010025let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
26if b:fortran_retype =~? '\<fortran_dialect\s*=\s*F\>'
27 let b:fortran_dialect = "F"
28elseif b:fortran_retype =~? '\<fortran_dialect\s*=\s*f08\>'
29 let b:fortran_dialect = "f08"
30elseif !exists("b:fortran_dialect")
31 if exists("g:fortran_dialect") && g:fortran_dialect =~# '\<F\|f08\>'
32 " try global variable
33 let b:fortran_dialect = g:fortran_dialect
34 else " nothing found, so use default
35 let b:fortran_dialect = "f08"
Bram Moolenaar071d4272004-06-13 20:20:40 +000036 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000037endif
Bram Moolenaar6be7f872012-01-20 21:08:56 +010038unlet! b:fortran_retype
39" make sure buffer-local value is not invalid
40if b:fortran_dialect !~# '\<F\|f08\>'
41 let b:fortran_dialect = "f08"
Bram Moolenaar071d4272004-06-13 20:20:40 +000042endif
43
44" Choose between fixed and free source form if this hasn't been done yet
45if !exists("b:fortran_fixed_source")
Bram Moolenaar6be7f872012-01-20 21:08:56 +010046 if b:fortran_dialect == "F"
47 " F requires free source form
Bram Moolenaar071d4272004-06-13 20:20:40 +000048 let b:fortran_fixed_source = 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 elseif exists("fortran_free_source")
Bram Moolenaar6be7f872012-01-20 21:08:56 +010050 " User guarantees free source form for all fortran files
Bram Moolenaar071d4272004-06-13 20:20:40 +000051 let b:fortran_fixed_source = 0
52 elseif exists("fortran_fixed_source")
Bram Moolenaar6be7f872012-01-20 21:08:56 +010053 " User guarantees fixed source form for all fortran files
Bram Moolenaar071d4272004-06-13 20:20:40 +000054 let b:fortran_fixed_source = 1
Bram Moolenaar256972a2015-12-29 19:10:25 +010055 elseif expand("%:e") ==? "f\<90\|95\|03\|08\>"
56 " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
57 let b:fortran_fixed_source = 0
58 elseif expand("%:e") ==? "f\|f77\|for"
59 " Fixed-form file extension defaults
60 let b:fortran_fixed_source = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000061 else
Bram Moolenaar6be7f872012-01-20 21:08:56 +010062 " Modern fortran still allows both free and fixed source form.
Bram Moolenaar071d4272004-06-13 20:20:40 +000063 " Assume fixed source form unless signs of free source form
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020064 " are detected in the first five columns of the first s:lmax lines.
Bram Moolenaar071d4272004-06-13 20:20:40 +000065 " Detection becomes more accurate and time-consuming if more lines
66 " are checked. Increase the limit below if you keep lots of comments at
67 " the very top of each file and you have a fast computer.
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020068 let s:lmax = 500
69 if ( s:lmax > line("$") )
70 let s:lmax = line("$")
Bram Moolenaar071d4272004-06-13 20:20:40 +000071 endif
72 let b:fortran_fixed_source = 1
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020073 let s:ln=1
74 while s:ln <= s:lmax
75 let s:test = strpart(getline(s:ln),0,5)
76 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
Bram Moolenaar256972a2015-12-29 19:10:25 +010077 let b:fortran_fixed_source = 0
78 break
Bram Moolenaar071d4272004-06-13 20:20:40 +000079 endif
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020080 let s:ln = s:ln + 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000081 endwhile
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020082 unlet! s:lmax s:ln s:test
Bram Moolenaar071d4272004-06-13 20:20:40 +000083 endif
84endif
85
86syn case ignore
87
Bram Moolenaar6be7f872012-01-20 21:08:56 +010088if b:fortran_fixed_source == 1
89 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
90else
91 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
92endif
93if exists("fortran_more_precise")
94 syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
95 syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
96 syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
Bram Moolenaar071d4272004-06-13 20:20:40 +000097endif
98
Bram Moolenaar6be7f872012-01-20 21:08:56 +010099syn match fortranUnitHeader "\<end\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000100syn match fortranType "\<character\>"
101syn match fortranType "\<complex\>"
102syn match fortranType "\<integer\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000103syn keyword fortranType intrinsic
104syn match fortranType "\<implicit\>"
105syn keyword fortranStructure dimension
106syn keyword fortranStorageClass parameter save
107syn match fortranUnitHeader "\<subroutine\>"
108syn keyword fortranCall call
109syn match fortranUnitHeader "\<function\>"
110syn match fortranUnitHeader "\<program\>"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000111syn keyword fortranKeyword return stop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112syn keyword fortranConditional else then
113syn match fortranConditional "\<if\>"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100114syn match fortranConditionalOb "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn match fortranRepeat "\<do\>"
116
117syn keyword fortranTodo contained todo fixme
118
119"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000120syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121syn match fortranParenError ")"
122
123syn match fortranOperator "\.\s*n\=eqv\s*\."
124syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
125syn match fortranOperator "\(+\|-\|/\|\*\)"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100126syn match fortranTypeOb "\<character\s*\*"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127
128syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
129
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000130syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
Bram Moolenaar071d4272004-06-13 20:20:40 +0000131
132"If tabs are allowed then the left margin checks do not work
133if exists("fortran_have_tabs")
134 syn match fortranTab "\t" transparent
135else
136 syn match fortranTab "\t"
137endif
138
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000139syn 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 +0000140
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100141syn keyword fortranIntrinsicR 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 +0000142
143" Intrinsics provided by some vendors
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100144syn 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 +0000145
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100146syn keyword fortranIntrinsic 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
147syn match fortranIntrinsic "\<len\s*[(,]"me=s+3
148syn match fortranIntrinsic "\<real\s*("me=s+4
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149syn match fortranType "\<implicit\s\+real"
150syn match fortranType "^\s*real\>"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100151syn match fortranIntrinsic "\<logical\s*("me=s+7
Bram Moolenaar071d4272004-06-13 20:20:40 +0000152syn match fortranType "\<implicit\s\+logical"
153syn match fortranType "^\s*logical\>"
154
155"Numbers of various sorts
156" Integers
157syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
158" floating point number, without a decimal point
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100159syn match fortranFloatIll display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160" floating point number, starting with a decimal point
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100161syn match fortranFloatIll display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000162" floating point number, no digits after decimal
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100163syn match fortranFloatIll display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164" floating point number, D or Q exponents
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100165syn match fortranFloatIll display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166" floating point number
167syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
168" Numbers in formats
169syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
170syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
171syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
172syn match fortranFormatSpec display "\d\+x\>"
173" The next match cannot be used because it would pick up identifiers as well
174" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
175
176" Numbers as labels
177syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
178syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
179syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
180syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
181syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
182
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100183if exists("fortran_more_precise")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184 " Numbers as targets
185 syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
186 syn match fortranTarget display "\(\<do\s\+\)\@<=\d\+\>"
187 syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
188endif
189
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100190syn keyword fortranTypeR external
191syn keyword fortranIOR format
192syn match fortranKeywordR "\<continue\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200193syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100194syn match fortranKeyword "\<go\s*to\>"
195syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$"
196syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100197syn region fortranStringR start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
198syn keyword fortranIntrinsicR dim lge lgt lle llt mod
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100199syn keyword fortranKeywordDel assign pause
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100201syn match fortranType "\<type\>"
202syn keyword fortranType none
Bram Moolenaar071d4272004-06-13 20:20:40 +0000203
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100204syn keyword fortranStructure private public intent optional
205syn keyword fortranStructure pointer target allocatable
206syn keyword fortranStorageClass in out
207syn match fortranStorageClass "\<kind\s*="me=s+4
208syn match fortranStorageClass "\<len\s*="me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100210syn match fortranUnitHeader "\<module\>"
211syn keyword fortranUnitHeader use only contains
212syn keyword fortranUnitHeader result operator assignment
213syn match fortranUnitHeader "\<interface\>"
214syn match fortranUnitHeader "\<recursive\>"
215syn keyword fortranKeyword allocate deallocate nullify cycle exit
216syn match fortranConditional "\<select\>"
217syn keyword fortranConditional case default where elsewhere
Bram Moolenaar071d4272004-06-13 20:20:40 +0000218
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100219syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
220syn match fortranOperator "=>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000221
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100222syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
223syn keyword fortranIO pad position action delim readwrite
224syn keyword fortranIO eor advance nml
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100226syn keyword fortranIntrinsic 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
227syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify
228syn match fortranIntrinsic "\<not\>\(\s*\.\)\@!"me=s+3
229syn match fortranIntrinsic "\<kind\>\s*[(,]"me=s+4
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100231syn match fortranUnitHeader "\<end\s*function"
232syn match fortranUnitHeader "\<end\s*interface"
233syn match fortranUnitHeader "\<end\s*module"
234syn match fortranUnitHeader "\<end\s*program"
235syn match fortranUnitHeader "\<end\s*subroutine"
236syn match fortranRepeat "\<end\s*do"
237syn match fortranConditional "\<end\s*where"
238syn match fortranConditional "\<select\s*case"
239syn match fortranConditional "\<end\s*select"
240syn match fortranType "\<end\s*type"
241syn match fortranType "\<in\s*out"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242
Bram Moolenaar30b65812012-07-12 22:01:11 +0200243syn keyword fortranType procedure
244syn match fortranType "\<module\ze\s\+procedure\>"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100245syn keyword fortranIOR namelist
246syn keyword fortranConditionalR while
247syn keyword fortranIntrinsicR achar iachar transfer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100249syn keyword fortranInclude include
250syn keyword fortranStorageClassR sequence
Bram Moolenaar071d4272004-06-13 20:20:40 +0000251
252syn match fortranConditional "\<end\s*if"
253syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
254syn match fortranConditional "\<else\s*if"
255
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100256syn keyword fortranUnitHeaderOb entry
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257syn match fortranTypeR display "double\s\+precision"
258syn match fortranTypeR display "double\s\+complex"
259syn match fortranUnitHeaderR display "block\s\+data"
260syn keyword fortranStorageClassR common equivalence data
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100261syn keyword fortranIntrinsicR dble dprod
262syn match fortranOperatorR "\.\s*[gl][et]\s*\."
263syn match fortranOperatorR "\.\s*\(eq\|ne\)\s*\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100265syn keyword fortranRepeat forall
266syn match fortranRepeat "\<end\s*forall"
267syn keyword fortranIntrinsic null cpu_time
268syn match fortranType "\<elemental\>"
269syn match fortranType "\<pure\>"
270if exists("fortran_more_precise")
271 syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272endif
273
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100274if b:fortran_dialect == "f08"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200275 " F2003
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100276 syn keyword fortranIntrinsic 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
Bram Moolenaare06c1882010-07-21 22:05:20 +0200277 " ISO_C_binding
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100278 syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
279 syn keyword fortranConstant 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
280 syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
281 syn keyword fortranType c_ptr c_funptr
Bram Moolenaare06c1882010-07-21 22:05:20 +0200282 " ISO_Fortran_env
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100283 syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
Bram Moolenaare06c1882010-07-21 22:05:20 +0200284 " IEEE_arithmetic
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100285 syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
Bram Moolenaare06c1882010-07-21 22:05:20 +0200286
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100287 syn keyword fortranReadWrite flush wait
288 syn keyword fortranIO decimal round iomsg
289 syn keyword fortranType asynchronous nopass non_overridable pass protected volatile abstract extends import
290 syn keyword fortranType non_intrinsic value bind deferred generic final enumerator
291 syn match fortranType "\<class\>"
292 syn match fortranType "\<associate\>"
293 syn match fortranType "\<end\s*associate"
294 syn match fortranType "\<enum\s*,\s*bind\s*(\s*c\s*)"
295 syn match fortranType "\<end\s*enum"
296 syn match fortranConditional "\<select\s*type"
297 syn match fortranConditional "\<type\s*is\>"
298 syn match fortranConditional "\<class\s*is\>"
299 syn match fortranUnitHeader "\<abstract\s*interface\>"
300 syn match fortranOperator "\([\|]\)"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200301
302 " F2008
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100303 syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
304 syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
305 syn keyword fortranIntrinsic 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
306 syn keyword fortranIO newunit
307 syn keyword fortranType contiguous
Bram Moolenaar8a94d872015-01-25 13:02:57 +0100308
309" CUDA fortran
310 syn match fortranTypeCUDA "\<attributes\>"
311 syn keyword fortranTypeCUDA host global device value
312 syn keyword fortranTypeCUDA shared constant pinned texture
313 syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4
314 syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind
315 syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr
316 syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr
317 syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms
318 syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared
319 syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize
320 syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize
321 syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte
322 syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming
323 syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost
324 syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice
325 syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue
326 syn keyword fortranTypeCUDA c_devptr
327
328 syn match fortranStringCUDA "blockidx%[xyz]"
329 syn match fortranStringCUDA "blockdim%[xyz]"
330 syn match fortranStringCUDA "griddim%[xyz]"
331 syn match fortranStringCUDA "threadidx%[xyz]"
332
333 syn keyword fortranIntrinsicCUDA warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot
334 syn keyword fortranIntrinsicCUDA atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor
335 syn keyword fortranIntrinsicCUDA cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices
336 syn keyword fortranIntrinsicCUDA cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize
337 syn keyword fortranIntrinsicCUDA cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize
338 syn keyword fortranIntrinsicCUDA cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray
339 syn keyword fortranIntrinsicCUDA cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync
340 syn keyword fortranIntrinsicCUDA cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion
341
342 syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none
Bram Moolenaare06c1882010-07-21 22:05:20 +0200343endif
344
Bram Moolenaar071d4272004-06-13 20:20:40 +0000345syn cluster fortranCommentGroup contains=fortranTodo
346
347if (b:fortran_fixed_source == 1)
348 if !exists("fortran_have_tabs")
349 "Flag items beyond column 72
350 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
351 "Flag left margin errors
352 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
353 syn match fortranLabelError "^.\{4}\d\S"
354 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100355 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356 syn match fortranLeftMargin transparent "^ \{5}"
357 syn match fortranContinueMark display "^.\{5}\S"lc=5
358else
359 syn match fortranContinueMark display "&"
360endif
361
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100362syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
364"cpp is often used with Fortran
365syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
366syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
367syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
368syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
369syn region cIncluded contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
370syn match cIncluded contained "<[^>]*>"
371syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
372
373"Synchronising limits assume that comment and continuation lines are not mixed
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000374if exists("fortran_fold") || exists("fortran_more_precise")
375 syn sync fromstart
376elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200377 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200379 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380endif
381
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100382if exists("fortran_fold")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384 if (b:fortran_fixed_source == 1)
385 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
386 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 +0000387 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 +0000388 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 +0200389 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 +0000390 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 +0200391 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 +0000392 else
393 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
394 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 +0000395 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 +0000396 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 +0200397 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 +0000398 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 +0200399 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 +0000400 endif
401
402 if exists("fortran_fold_conditionals")
403 if (b:fortran_fixed_source == 1)
404 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
405 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
406 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
407 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
408 else
409 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
410 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
Bram Moolenaardae8d212016-02-27 22:40:16 +0100411 syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(\(.\|&\s*\n\)\+)\(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412 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
413 endif
414 endif
415
416 if exists("fortran_fold_multilinecomments")
417 if (b:fortran_fixed_source == 1)
418 syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
419 else
420 syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
421 endif
422 endif
423endif
424
425" Define the default highlighting.
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100426" The default highlighting differs for each dialect.
427" Transparent groups:
428" fortranParen, fortranLeftMargin
429" fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
430" fortranBlockData
431" fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
432" fortranMultiCommentLines
433hi def link fortranKeyword Keyword
434hi def link fortranConstructName Identifier
435hi def link fortranConditional Conditional
436hi def link fortranRepeat Repeat
437hi def link fortranTodo Todo
438hi def link fortranContinueMark Special
439hi def link fortranString String
440hi def link fortranNumber Number
441hi def link fortranOperator Operator
442hi def link fortranBoolean Boolean
443hi def link fortranLabelError Error
444hi def link fortranObsolete Todo
445hi def link fortranType Type
446hi def link fortranStructure Type
447hi def link fortranStorageClass StorageClass
448hi def link fortranCall Function
449hi def link fortranUnitHeader fortranPreCondit
450hi def link fortranReadWrite Keyword
451hi def link fortranIO Keyword
452hi def link fortranIntrinsic Function
453hi def link fortranConstant Constant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100455" To stop deleted & obsolescent features being highlighted as Todo items,
456" comment out the next 5 lines and uncomment the 5 lines after that
457hi def link fortranUnitHeaderOb fortranObsolete
458hi def link fortranKeywordOb fortranObsolete
459hi def link fortranConditionalOb fortranObsolete
460hi def link fortranTypeOb fortranObsolete
461hi def link fortranKeywordDel fortranObsolete
462"hi def link fortranUnitHeaderOb fortranUnitHeader
463"hi def link fortranKeywordOb fortranKeyword
464"hi def link fortranConditionalOb fortranConditional
465"hi def link fortranTypeOb fortranType
466"hi def link fortranKeywordDel fortranKeyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100468if b:fortran_dialect == "F"
469 hi! def link fortranIntrinsicR fortranObsolete
470 hi! def link fortranUnitHeaderR fortranObsolete
471 hi! def link fortranTypeR fortranObsolete
472 hi! def link fortranStorageClassR fortranObsolete
473 hi! def link fortranOperatorR fortranObsolete
474 hi! def link fortranInclude fortranObsolete
475 hi! def link fortranLabelNumber fortranObsolete
476 hi! def link fortranTarget fortranObsolete
477 hi! def link fortranFloatIll fortranObsolete
478 hi! def link fortranIOR fortranObsolete
479 hi! def link fortranKeywordR fortranObsolete
480 hi! def link fortranStringR fortranObsolete
481 hi! def link fortranConditionalR fortranObsolete
482else
483 hi! def link fortranIntrinsicR fortranIntrinsic
484 hi! def link fortranUnitHeaderR fortranPreCondit
485 hi! def link fortranTypeR fortranType
486 hi! def link fortranStorageClassR fortranStorageClass
487 hi! def link fortranOperatorR fortranOperator
488 hi! def link fortranInclude Include
489 hi! def link fortranLabelNumber Special
490 hi! def link fortranTarget Special
491 hi! def link fortranFloatIll fortranFloat
492 hi! def link fortranIOR fortranIO
493 hi! def link fortranKeywordR fortranKeyword
494 hi! def link fortranStringR fortranString
495 hi! def link fortranConditionalR fortranConditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496endif
497
Bram Moolenaar8a94d872015-01-25 13:02:57 +0100498" CUDA
499hi def link fortranIntrinsicCUDA fortranIntrinsic
500hi def link fortranTypeCUDA fortranType
501hi def link fortranStringCUDA fortranString
502
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100503hi def link fortranFormatSpec Identifier
504hi def link fortranFloat Float
505hi def link fortranPreCondit PreCondit
506hi def link cIncluded fortranString
507hi def link cInclude Include
508hi def link cPreProc PreProc
509hi def link cPreCondit PreCondit
510hi def link fortranParenError Error
511hi def link fortranComment Comment
512hi def link fortranSerialNumber Todo
513hi def link fortranTab Error
514
515" Uncomment the next line if you use extra intrinsics provided by vendors
516"hi def link fortranExtraIntrinsic Function
517
Bram Moolenaar071d4272004-06-13 20:20:40 +0000518let b:current_syntax = "fortran"
519
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100520let &cpo = s:cpo_save
521unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000522" vim: ts=8 tw=132