blob: 971a2b633dd56ff40c648500a76994ac1f66aaaa [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Ajit-Thakkar68630842023-12-05 23:07:27 +01002" Language: Fortran 2008 (and Fortran 2003, 95, 90, and 77)
3" Version: (v106) 2023 December 4
4" Maintainers: Ajit J. Thakkar <ajit@unb.ca>; <https://ajit.ext.unb.ca/>
5" Joshua Hollett <j.hollett@uwinnipeg.ca>
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 Moolenaar4f4d51a2020-10-11 13:57:40 +02008" Version 0.1 for Fortran 95 was created in April 2000 by Ajit Thakkar from an
9" older Fortran 77 syntax file by Mario Eusebio and Preben Guldberg.
Bram Moolenaar0c0734d2019-11-26 21:44:46 +010010" Since then, useful suggestions and contributions have been made, in order, by:
Bram Moolenaardae8d212016-02-27 22:40:16 +010011" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
Bram Moolenaar130cbfc2021-04-07 21:07:20 +020012" Walter Dieudonne, Alexander Wagner, Roman Bertle, Charles Rendleman,
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +020013" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann,
Bram Moolenaar130cbfc2021-04-07 21:07:20 +020014" Stefano Zaghi, Vishnu V. Krishnan, Judicael Grasset, Takuma Yoshida,
Ajit-Thakkar68630842023-12-05 23:07:27 +010015" Eisuke Kawashima, Andre Chalella, Fritz Reese, Karl D. Hammond,
16" and Michele Esposito Marzino.
Bram Moolenaar071d4272004-06-13 20:20:40 +000017
Bram Moolenaar6be7f872012-01-20 21:08:56 +010018if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000019 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" Choose between fixed and free source form if this hasn't been done yet
26if !exists("b:fortran_fixed_source")
Ajit-Thakkar68630842023-12-05 23:07:27 +010027 if exists("fortran_free_source")
Bram Moolenaar6be7f872012-01-20 21:08:56 +010028 " User guarantees free source form for all fortran files
Bram Moolenaar071d4272004-06-13 20:20:40 +000029 let b:fortran_fixed_source = 0
30 elseif exists("fortran_fixed_source")
Bram Moolenaar6be7f872012-01-20 21:08:56 +010031 " User guarantees fixed source form for all fortran files
Bram Moolenaar071d4272004-06-13 20:20:40 +000032 let b:fortran_fixed_source = 1
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +020033 elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
Bram Moolenaar256972a2015-12-29 19:10:25 +010034 " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
35 let b:fortran_fixed_source = 0
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +020036 elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
Bram Moolenaar256972a2015-12-29 19:10:25 +010037 " Fixed-form file extension defaults
38 let b:fortran_fixed_source = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000039 else
Ajit-Thakkar68630842023-12-05 23:07:27 +010040 " Modern fortran compilers still allow both free and fixed source form.
Bram Moolenaar071d4272004-06-13 20:20:40 +000041 " Assume fixed source form unless signs of free source form
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020042 " are detected in the first five columns of the first s:lmax lines.
Bram Moolenaar071d4272004-06-13 20:20:40 +000043 " Detection becomes more accurate and time-consuming if more lines
44 " are checked. Increase the limit below if you keep lots of comments at
45 " the very top of each file and you have a fast computer.
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020046 let s:lmax = 500
47 if ( s:lmax > line("$") )
48 let s:lmax = line("$")
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 endif
50 let b:fortran_fixed_source = 1
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020051 let s:ln=1
52 while s:ln <= s:lmax
53 let s:test = strpart(getline(s:ln),0,5)
54 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
Bram Moolenaar256972a2015-12-29 19:10:25 +010055 let b:fortran_fixed_source = 0
56 break
Bram Moolenaar071d4272004-06-13 20:20:40 +000057 endif
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020058 let s:ln = s:ln + 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000059 endwhile
Bram Moolenaarc88ebf72010-07-22 22:30:23 +020060 unlet! s:lmax s:ln s:test
Bram Moolenaar071d4272004-06-13 20:20:40 +000061 endif
62endif
63
64syn case ignore
65
Bram Moolenaar6be7f872012-01-20 21:08:56 +010066if b:fortran_fixed_source == 1
67 syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
68else
69 syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
70endif
Ajit-Thakkar68630842023-12-05 23:07:27 +010071syn match fortranConstructName "\(\<end\s*do\s\+\)\@11<=\a\w*"
72syn match fortranConstructName "\(\<end\s*if\s\+\)\@11<=\a\w*"
73syn match fortranConstructName "\(\<end\s*select\s\+\)\@15<=\a\w*"
74syn match fortranConstructName "\(\<\%(exit\|cycle\)\s\+\)\@11<=\a\w*"
Bram Moolenaar071d4272004-06-13 20:20:40 +000075
Ajit-Thakkar68630842023-12-05 23:07:27 +010076syn match fortranUserUnit "\(\(end\s*\)\?\(subroutine\|function\|module\|program\|submodule\|block\)\s\+\)\@12<=\a\w\+"
77
Ajit-Thakkar4868f632023-08-15 18:05:00 -030078syn match fortranType "\<character\((\s*kind\s*=\w\+)\)\?\>"
79syn match fortranType "\<complex\((\s*kind\s*=\w\+)\)\?\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000080syn keyword fortranType intrinsic
Ajit-Thakkar68630842023-12-05 23:07:27 +010081syn match fortranType "\<implicit\>\s\+\(none\(\s\+\<external\|type\>\)\?\)\?"
Bram Moolenaar071d4272004-06-13 20:20:40 +000082syn keyword fortranStructure dimension
83syn keyword fortranStorageClass parameter save
Ajit-Thakkar68630842023-12-05 23:07:27 +010084syn match fortranCall "call\s\+\a\w*"
85syn match fortranUnitHeader "\(end\s*\)\?\(subroutine\|function\|module\|program\|submodule\|block\)"
86syn keyword fortranKeyword return
87syn match fortranKeyword "\(error\s\+\)\=stop"
Bram Moolenaar071d4272004-06-13 20:20:40 +000088syn keyword fortranConditional else then
89syn match fortranConditional "\<if\>"
Ajit-Thakkar68630842023-12-05 23:07:27 +010090syn match fortranConditionalDel "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +000091syn match fortranRepeat "\<do\>"
92
Ajit-Thakkar68630842023-12-05 23:07:27 +010093syn keyword fortranTodo contained bug note debug todo fixme
Bram Moolenaar071d4272004-06-13 20:20:40 +000094
95"Catch errors caused by too many right parentheses
Bram Moolenaar910f66f2006-04-05 20:41:53 +000096syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000097syn match fortranParenError ")"
98
99syn match fortranOperator "\.\s*n\=eqv\s*\."
100syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
101syn match fortranOperator "\(+\|-\|/\|\*\)"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100102syn match fortranTypeOb "\<character\s*\*"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000103
104syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
105
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300106syn keyword fortranReadWrite print
107syn match fortranReadWrite '\<\(backspace\|close\|endfile\|inquire\|open\|read\|rewind\|write\)\ze\s*('
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108
109"If tabs are allowed then the left margin checks do not work
110if exists("fortran_have_tabs")
111 syn match fortranTab "\t" transparent
112else
113 syn match fortranTab "\t"
114endif
115
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300116syn match fortranIO '\%(\((\|,\|, *&\n\)\s*\)\@<=\(access\|blank\|direct\|exist\|file\|fmt\|form\|formatted\|iostat\|name\|named\|nextrec\|number\|opened\|rec\|recl\|sequential\|status\|unformatted\|unit\)\ze\s*='
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117
Bram Moolenaar071d4272004-06-13 20:20:40 +0000118" Intrinsics provided by some vendors
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100119syn 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 +0000120
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100121syn 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
122syn match fortranIntrinsic "\<len\s*[(,]"me=s+3
123syn match fortranIntrinsic "\<real\s*("me=s+4
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100124syn match fortranIntrinsic "\<logical\s*("me=s+7
Ajit-Thakkar68630842023-12-05 23:07:27 +0100125" F2018 and F2023
126syn keyword fortranIntrinsic out_of_range reduce random_init lcobound ucobound this_image coshape selected_logical_kind
127syn keyword fortranIntrinsic ieee_max ieee_max_mag ieee_min ieee_min_mag split tokenize
128syn keyword fortranIntrinsic acosd asind atand atan2d cosd sind tand acospi asinpi atanpi atan2pi cospi sinpi tanpi
129
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300130syn match fortranType "\<type\>\(\s\+is\>\)\?"
131syn match fortranType "^\s*\(type\s\+\(is\)\? \)\?\s*\(real\|integer\|logical\|complex\|character\)\>"
132syn match fortranType "^\s*\(implicit \)\?\s*\(real\|integer\|logical\|complex\|character\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
134"Numbers of various sorts
135" Integers
136syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
137" floating point number, without a decimal point
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100138syn match fortranFloatIll display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139" floating point number, starting with a decimal point
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100140syn match fortranFloatIll display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141" floating point number, no digits after decimal
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100142syn match fortranFloatIll display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143" floating point number, D or Q exponents
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100144syn match fortranFloatIll display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000145" floating point number
146syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
Bram Moolenaar4f4d51a2020-10-11 13:57:40 +0200147" binary number
148syn match fortranBinary display "b["'][01]\+["']"
149" octal number
150syn match fortranOctal display "o["'][0-7]\+["']"
151" hexadecimal number
152syn match fortranHex display "z["'][0-9A-F]\+["']"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153" Numbers in formats
154syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
155syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
156syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
157syn match fortranFormatSpec display "\d\+x\>"
158" The next match cannot be used because it would pick up identifiers as well
159" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
160
161" Numbers as labels
162syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
163syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
164syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
165syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
166syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
167
Ajit-Thakkar68630842023-12-05 23:07:27 +0100168" Numbers as targets
169syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
170syn match fortranTarget display "\(\<do\s\+\)\@11<=\d\+\>"
171syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@11<=\(\d\+\s*,\s*\)*\d\+\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100173syn keyword fortranTypeR external
174syn keyword fortranIOR format
Ajit-Thakkar68630842023-12-05 23:07:27 +0100175syn match fortranKeyword "\<continue\>"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200176syn match fortranKeyword "^\s*\d\+\s\+continue\>"
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100177syn match fortranKeyword "\<go\s*to\>"
178syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$"
179syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$"
Ajit-Thakkar68630842023-12-05 23:07:27 +0100180syn region fortranString start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100181syn keyword fortranKeywordDel assign pause
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100183syn keyword fortranStructure private public intent optional
184syn keyword fortranStructure pointer target allocatable
185syn keyword fortranStorageClass in out
Ajit-Thakkar68630842023-12-05 23:07:27 +0100186syn match fortranStorageClass "\<in\s*out\>"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100187syn match fortranStorageClass "\<kind\s*="me=s+4
188syn match fortranStorageClass "\<len\s*="me=s+3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000189
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100190syn keyword fortranUnitHeader use only contains
191syn keyword fortranUnitHeader result operator assignment
192syn match fortranUnitHeader "\<interface\>"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100193syn keyword fortranKeyword allocate deallocate nullify cycle exit
194syn match fortranConditional "\<select\>"
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300195syn match fortranConditional "\<case\s\+default\>"
196syn keyword fortranConditional where elsewhere
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100198syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
Ajit-Thakkar68630842023-12-05 23:07:27 +0100199syn match fortranOperator "\(%\|?\|=>\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100201syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
202syn keyword fortranIO pad position action delim readwrite
203syn keyword fortranIO eor advance nml
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300205syn match 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\|scale\|scan\|selected_int_kind\|selected_real_kind\|set_exponent\|shape\|size\|spacing\|spread\|sum\|system_clock\|tiny\|transpose\|trim\|ubound\|unpack\|verify\)\>\ze\s*('
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100206syn match fortranIntrinsic "\<not\>\(\s*\.\)\@!"me=s+3
207syn match fortranIntrinsic "\<kind\>\s*[(,]"me=s+4
Bram Moolenaar071d4272004-06-13 20:20:40 +0000208
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100209syn match fortranUnitHeader "\<end\s*interface"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100210syn match fortranRepeat "\<end\s*do"
211syn match fortranConditional "\<end\s*where"
212syn match fortranConditional "\<select\s*case"
213syn match fortranConditional "\<end\s*select"
214syn match fortranType "\<end\s*type"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215
Ajit-Thakkar68630842023-12-05 23:07:27 +0100216syn match fortranType "\(end\s\+\)\?\(\<module\s\+\)\?procedure\>"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100217syn keyword fortranIOR namelist
218syn keyword fortranConditionalR while
Ajit-Thakkar68630842023-12-05 23:07:27 +0100219syn keyword fortranIntrinsicR achar iachar transfer dble dprod dim lge lgt lle llt mod
220syn keyword fortranIntrinsicOb 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 +0000221
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100222syn keyword fortranInclude include
223syn keyword fortranStorageClassR sequence
Bram Moolenaar071d4272004-06-13 20:20:40 +0000224
225syn match fortranConditional "\<end\s*if"
226syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
227syn match fortranConditional "\<else\s*if"
228
Bram Moolenaar6ee8d892012-01-10 14:55:01 +0100229syn keyword fortranUnitHeaderOb entry
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230syn match fortranTypeR display "double\s\+precision"
231syn match fortranTypeR display "double\s\+complex"
Ajit-Thakkar68630842023-12-05 23:07:27 +0100232syn match fortranUnitHeaderOb display "block\s\+data"
233syn match fortranStorageClass "^\s*data\>\(\s\+\a\w*\s*/\)\@="
234syn match fortranStorageClassOb "^\s*common\>\(\s*/\)\@="
235syn keyword fortranStorageClassOb equivalence
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100236syn match fortranOperatorR "\.\s*[gl][et]\s*\."
237syn match fortranOperatorR "\.\s*\(eq\|ne\)\s*\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238
Ajit-Thakkar68630842023-12-05 23:07:27 +0100239syn keyword fortranRepeatOb forall
240syn match fortranRepeatOb "\<end\s*forall"
241syn keyword fortranIntrinsic null cpu_time
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100242syn match fortranType "\<elemental\>"
243syn match fortranType "\<pure\>"
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200244syn match fortranType "\<impure\>"
Bram Moolenaar4f4d51a2020-10-11 13:57:40 +0200245syn match fortranType "\<recursive\>"
Ajit-Thakkar68630842023-12-05 23:07:27 +0100246syn match fortranConstructNameOb "\(\<end\s*forall\s\+\)\@15<=\a\w*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247
Ajit-Thakkar68630842023-12-05 23:07:27 +0100248" F2003
249syn 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
250" ISO_C_binding
251syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
252syn 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
253syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
254syn keyword fortranType c_ptr c_funptr
255" ISO_Fortran_env
256syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
257" IEEE_arithmetic
258syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
Bram Moolenaare06c1882010-07-21 22:05:20 +0200259
Ajit-Thakkar68630842023-12-05 23:07:27 +0100260syn keyword fortranReadWrite flush wait
261syn keyword fortranIO decimal round iomsg
262syn keyword fortranType asynchronous nopass non_overridable pass protected volatile extends import
263syn keyword fortranType non_intrinsic value bind deferred generic final enumerator
264syn match fortranType "\<abstract\>"
265syn match fortranType "\<class\>"
266syn match fortranType "\<associate\>"
267syn match fortranType "\<end\s*associate"
268syn match fortranType "\<enum\s*,\s*bind\s*(\s*c\s*)"
269syn match fortranType "\<end\s*enum"
270syn match fortranConditional "\<select\s*type"
271syn match fortranConditional "\<class\s*is\>"
272syn match fortranConditional "\<class\s*default\>"
273syn match fortranUnitHeader "\<abstract\s*interface\>"
274syn match fortranOperator "\([\|]\)"
Bram Moolenaare06c1882010-07-21 22:05:20 +0200275
Ajit-Thakkar68630842023-12-05 23:07:27 +0100276" F2008
277syn 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
278syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
279syn 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
280syn keyword fortranIO newunit
281syn keyword fortranType contiguous
282syn keyword fortranRepeat concurrent
Bram Moolenaar8a94d872015-01-25 13:02:57 +0100283
284" CUDA fortran
Ajit-Thakkar68630842023-12-05 23:07:27 +0100285if exists("fortran_CUDA")
Bram Moolenaar8a94d872015-01-25 13:02:57 +0100286 syn match fortranTypeCUDA "\<attributes\>"
Ajit-Thakkar68630842023-12-05 23:07:27 +0100287 syn keyword fortranTypeCUDA host global device
Bram Moolenaar8a94d872015-01-25 13:02:57 +0100288 syn keyword fortranTypeCUDA shared constant pinned texture
289 syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4
290 syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind
291 syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr
292 syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr
293 syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms
294 syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared
295 syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize
296 syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize
297 syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte
298 syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming
299 syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost
300 syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice
301 syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue
302 syn keyword fortranTypeCUDA c_devptr
303
304 syn match fortranStringCUDA "blockidx%[xyz]"
305 syn match fortranStringCUDA "blockdim%[xyz]"
306 syn match fortranStringCUDA "griddim%[xyz]"
307 syn match fortranStringCUDA "threadidx%[xyz]"
308
309 syn keyword fortranIntrinsicCUDA warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot
310 syn keyword fortranIntrinsicCUDA atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor
311 syn keyword fortranIntrinsicCUDA cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices
312 syn keyword fortranIntrinsicCUDA cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize
313 syn keyword fortranIntrinsicCUDA cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize
314 syn keyword fortranIntrinsicCUDA cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray
315 syn keyword fortranIntrinsicCUDA cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync
316 syn keyword fortranIntrinsicCUDA cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion
Bram Moolenaare06c1882010-07-21 22:05:20 +0200317endif
318
Ajit-Thakkar68630842023-12-05 23:07:27 +0100319syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none
320
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321syn cluster fortranCommentGroup contains=fortranTodo
322
323if (b:fortran_fixed_source == 1)
324 if !exists("fortran_have_tabs")
Bram Moolenaar130cbfc2021-04-07 21:07:20 +0200325 " Fixed format requires a textwidth of 72 for code,
326 " but some vendor extensions allow longer lines
327 if exists("fortran_extended_line_length")
328 syn match fortranSerialNumber excludenl "^.\{133,}$"lc=132
329 elseif exists("fortran_cardimage_line_length")
330 syn match fortranSerialNumber excludenl "^.\{81,}$"lc=80
331 else
332 syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
333 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334 "Flag left margin errors
335 syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
336 syn match fortranLabelError "^.\{4}\d\S"
337 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100338 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339 syn match fortranLeftMargin transparent "^ \{5}"
340 syn match fortranContinueMark display "^.\{5}\S"lc=5
341else
342 syn match fortranContinueMark display "&"
343endif
344
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100345syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
Bram Moolenaar3e496b02016-09-25 22:11:48 +0200346syn match fortranOpenMP excludenl "^\s*!\$\(OMP\)\=&\=\s.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347
348"cpp is often used with Fortran
349syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
350syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
351syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
352syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100353syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
354"syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355syn match cIncluded contained "<[^>]*>"
356syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
357
358"Synchronising limits assume that comment and continuation lines are not mixed
Ajit-Thakkar68630842023-12-05 23:07:27 +0100359if exists("fortran_fold")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000360 syn sync fromstart
361elseif (b:fortran_fixed_source == 0)
Bram Moolenaare06c1882010-07-21 22:05:20 +0200362 syn sync linecont "&" minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363else
Bram Moolenaare06c1882010-07-21 22:05:20 +0200364 syn sync minlines=30
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365endif
366
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100367if exists("fortran_fold")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000368
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369 if (b:fortran_fixed_source == 1)
370 syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200371 syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372 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 Moolenaare4a3bcf2016-08-26 19:52:37 +0200373 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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
374 syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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 +0200375 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 Moolenaarc0514bf2016-11-17 14:50:09 +0100376 syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200377 syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
378 syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379 else
380 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
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200381 syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382 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 Moolenaare4a3bcf2016-08-26 19:52:37 +0200383 syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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
384 syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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 +0200385 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 Moolenaarc0514bf2016-11-17 14:50:09 +0100386 syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\s*[!#].*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200387 syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
388 syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
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
Bram Moolenaarc0514bf2016-11-17 14:50:09 +0100396 syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 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
Bram Moolenaardae8d212016-02-27 22:40:16 +0100400 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 Moolenaarc0514bf2016-11-17 14:50:09 +0100401 syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402 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.
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100415" Transparent groups:
416" fortranParen, fortranLeftMargin
417" fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
418" fortranBlockData
419" fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
420" fortranMultiCommentLines
Ajit-Thakkar68630842023-12-05 23:07:27 +0100421hi def link fortranKeyword Keyword
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100422hi def link fortranConstructName Identifier
Ajit-Thakkar68630842023-12-05 23:07:27 +0100423hi def link fortranConditional Conditional
424hi def link fortranRepeat Repeat
425hi def link fortranTodo Todo
426hi def link fortranContinueMark Special
427hi def link fortranString String
428hi def link fortranNumber Number
429hi def link fortranBinary Number
430hi def link fortranOctal Number
431hi def link fortranHex Number
432hi def link fortranOperator Operator
433hi def link fortranBoolean Boolean
434hi def link fortranLabelError Error
435hi def link fortranObsolete Todo
436hi def link fortranType Type
437hi def link fortranStructure Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438
Ajit-Thakkar68630842023-12-05 23:07:27 +0100439hi def link fortranStorageClass StorageClass
440hi def link fortranIntrinsic Function
441hi def link fortranCall Function
442hi def link fortranUserUnit Function
443hi def link fortranUnitHeader fortranPreCondit
444hi def link fortranReadWrite Keyword
445hi def link fortranIO Keyword
446hi def link fortranConstant Constant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447
Ajit-Thakkar68630842023-12-05 23:07:27 +0100448hi def link fortranInclude Include
449hi def link fortranLabelNumber Special
450hi def link fortranTarget Special
451hi def link fortranFloatIll fortranFloat
452
453" Redundant features which may one day become obsolescent
454hi def link fortranIntrinsicR fortranIntrinsic
455hi def link fortranTypeR fortranType
456hi def link fortranStorageClassR fortranStorageClass
457hi def link fortranOperatorR fortranOperator
458hi def link fortranIOR fortranIO
459hi def link fortranConditionalR fortranConditional
460
461" features deleted or declared obsolescent in Fortran 2023
462if (b:fortran_fixed_source == 1)
463 hi def link fortranUnitHeaderOb fortranUnitHeader
464 hi def link fortranKeywordOb fortranKeyword
465 hi def link fortranKeywordDel fortranKeyword
466 hi def link fortranConditionalDel fortranConditional
467 hi def link fortranTypeOb fortranType
468 hi def link fortranStorageClassOb fortranStorageClass
469 hi def link fortranRepeatOb fortranRepeat
470 hi def link fortranIntrinsicOb fortranIntrinsic
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100471else
Ajit-Thakkar68630842023-12-05 23:07:27 +0100472 hi def link fortranUnitHeaderOb fortranObsolete
473 hi def link fortranKeywordOb fortranObsolete
474 hi def link fortranKeywordDel fortranObsolete
475 hi def link fortranConditionalDel fortranObsolete
476 hi def link fortranTypeOb fortranObsolete
477 hi def link fortranStorageClassOb fortranObsolete
478 hi def link fortranRepeatOb fortranObsolete
479 hi def link fortranIntrinsicOb fortranObsolete
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480endif
481
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100482hi def link fortranFormatSpec Identifier
483hi def link fortranFloat Float
484hi def link fortranPreCondit PreCondit
485hi def link cIncluded fortranString
486hi def link cInclude Include
487hi def link cPreProc PreProc
488hi def link cPreCondit PreCondit
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200489hi def link fortranOpenMP PreProc
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100490hi def link fortranParenError Error
491hi def link fortranComment Comment
492hi def link fortranSerialNumber Todo
493hi def link fortranTab Error
494
Ajit-Thakkar4868f632023-08-15 18:05:00 -0300495if exists("fortran_CUDA")
496 hi def link fortranIntrinsicCUDA fortranIntrinsic
497 hi def link fortranTypeCUDA fortranType
498 hi def link fortranStringCUDA fortranString
499endif
500
501if exists("fortran_vendor_intrinsics")
502 hi def link fortranExtraIntrinsic Function
503endif
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100504
Bram Moolenaar071d4272004-06-13 20:20:40 +0000505let b:current_syntax = "fortran"
506
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100507let &cpo = s:cpo_save
508unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000509" vim: ts=8 tw=132