1" Vim syntax file 2" Language: Fortran 2008 (and earlier versions including 2003, 95, 90, and 77) 3" Version: 0.91 4" Last Change: 2012 Jan. 02 5" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/> 6" Usage: For instructions, do :help fortran-syntax from Vim 7" 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, 12" Andrew Griffiths, Joe Krahn, and Hendrik Merx. 13 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 22let s:cpo_save = &cpo 23set cpo&vim 24 25" 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 75 " are detected in the first five columns of the first s:lmax lines. 76 " 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. 79 let s:lmax = 500 80 if ( s:lmax > line("$") ) 81 let s:lmax = line("$") 82 endif 83 let b:fortran_fixed_source = 1 84 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' 88 let b:fortran_fixed_source = 0 89 break 90 endif 91 let s:ln = s:ln + 1 92 endwhile 93 unlet! s:lmax s:ln s:test 94 endif 95endif 96 97syn case ignore 98 99if b:fortran_dialect !=? "f77" 100 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 122syn match fortranType "\<character\>" 123syn match fortranType "\<complex\>" 124syn match fortranType "\<integer\>" 125syn 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\>" 133syn keyword fortranKeyword return stop 134syn keyword fortranConditional else then 135syn match fortranConditional "\<if\>" 136syn match fortranConditionalOb "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$" 137syn match fortranRepeat "\<do\>" 138 139syn keyword fortranTodo contained todo fixme 140 141"Catch errors caused by too many right parentheses 142syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell 143syn match fortranParenError ")" 144 145syn match fortranOperator "\.\s*n\=eqv\s*\." 146syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\." 147syn match fortranOperator "\(+\|-\|/\|\*\)" 148syn match fortranTypeOb "\<character\>\@<=\s*\*" 149 150syn match fortranBoolean "\.\s*\(true\|false\)\s*\." 151 152syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write 153 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 161syn keyword fortranIO access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit 162 163syn 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 164 165" Intrinsics provided by some vendors 166syn 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 167 168syn 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 169syn 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 214syn match fortranKeywordEx "\<continue\>" 215syn match fortranKeyword "^\s*\d\+\s\+continue\>" 216syn match fortranKeyword "\<go\s*to\>" 217syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$" 218syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$" 219syn region fortranStringEx start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber 220syn keyword fortran77IntrinsicEx dim lge lgt lle llt mod 221syn keyword fortranKeywordDel assign pause 222 223if b:fortran_dialect != "f77" 224 225 syn match fortranType "\<type\>" 226 syn keyword fortranType none 227 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\>" 239 syn keyword fortranKeyword allocate deallocate nullify cycle exit 240 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 250 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 252 syn match fortran90Intrinsic "\<not\>\(\s*\.\)\@!"me=s+3 253 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 267 syn keyword fortranType procedure 268 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 280syn keyword fortranUnitHeaderOb entry 281syn 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 289if b:fortran_dialect == "f95" || b:fortran_dialect == "F" 290 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 300if 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 316 syn keyword fortran03Type non_intrinsic value bind deferred generic final enumerator 317 syn match fortran03Type "\<class\>" 318 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\>" 324 syn match fortran03Conditional "\<class\s*is\>" 325 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 336syn 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 346 syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell 347 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" 354 syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell 355endif 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 367if exists("fortran_fold") || exists("fortran_more_precise") 368 syn sync fromstart 369elseif (b:fortran_fixed_source == 0) 370 syn sync linecont "&" minlines=30 371else 372 syn sync minlines=30 373endif 374 375if version >= 600 && exists("fortran_fold") 376 377 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 380 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 381 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 382 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 383 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 384 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 385 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 388 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 389 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 390 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 391 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 392 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 393 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 436 HiLink fortranKeyword Keyword 437 HiLink fortranConstructName Identifier 438 HiLink fortran03Conditional fortranConditional 439 HiLink fortranConditional Conditional 440 HiLink fortranRepeat Repeat 441 HiLink fortranTodo Todo 442 if (b:fortran_fixed_source == 1) 443 HiLink fortranContinueMark Todo 444 else 445 HiLink fortranContinueMark Keyword 446 endif 447 HiLink fortranString String 448 HiLink fortranNumber Number 449 HiLink fortran03Operator fortranOperator 450 HiLink fortranOperator Operator 451 HiLink fortranBoolean Boolean 452 HiLink fortranLabelError Error 453 HiLink fortranObsolete Todo 454 HiLink fortran03Type fortranType 455 HiLink fortran08Type fortranType 456 HiLink fortranType Type 457 HiLink fortranStructure Type 458 HiLink fortranStorageClass StorageClass 459 HiLink fortranCall Function 460 HiLink fortran03UnitHeader fortranUnitHeader 461 HiLink fortranUnitHeader fortranPreCondit 462 HiLink fortran03ReadWrite fortranReadWrite 463 HiLink fortranReadWrite Keyword 464 HiLink fortran03IO fortranIO 465 HiLink fortran08IO fortranIO 466 HiLink fortranIO Keyword 467 HiLink fortran95Intrinsic fortran90Intrinsic 468 HiLink fortran77Intrinsic fortran90Intrinsic 469 HiLink fortran90Intrinsic Function 470 HiLink fortran03Intrinsic Function 471 HiLink fortran08Intrinsic Function 472 HiLink fortran03Constant Function 473 474 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 488 if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" ) 489 HiLink fortranKeywordOb fortranObsolete 490 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 497 HiLink fortranInclude fortranObsolete 498 else 499 HiLink fortranKeywordOb fortranKeyword 500 HiLink fortran66Intrinsic fortran90Intrinsic 501 HiLink fortran77IntrinsicR fortran90Intrinsic 502 HiLink fortranUnitHeaderR fortranPreCondit 503 HiLink fortranTypeR fortranType 504 HiLink fortranStorageClassR fortranStorageClass 505 HiLink fortran77OperatorR fortranOperator 506 HiLink fortranInclude Include 507 HiLink fortran90StorageClassR fortranStorageClass 508 endif 509 510 if ( b:fortran_dialect == "F" ) 511 HiLink fortranLabelNumber fortranObsolete 512 HiLink fortranTarget fortranObsolete 513 HiLink fortranFormatSpec fortranObsolete 514 HiLink fortranFloatDExp fortranObsolete 515 HiLink fortranFloatNoDec fortranObsolete 516 HiLink fortranFloatIniDec fortranObsolete 517 HiLink fortranFloatEndDec fortranObsolete 518 HiLink fortranTypeEx fortranObsolete 519 HiLink fortranIOEx fortranObsolete 520 HiLink fortranKeywordEx fortranObsolete 521 HiLink fortranStringEx fortranObsolete 522 HiLink fortran77IntrinsicEx fortranObsolete 523 HiLink fortranUnitHeaderEx fortranObsolete 524 HiLink fortranConditionalEx fortranObsolete 525 HiLink fortran90IntrinsicEx fortranObsolete 526 else 527 HiLink fortranLabelNumber Special 528 HiLink fortranTarget Special 529 HiLink fortranFormatSpec Identifier 530 HiLink fortranFloatDExp fortranFloat 531 HiLink fortranFloatNoDec fortranFloat 532 HiLink fortranFloatIniDec fortranFloat 533 HiLink fortranFloatEndDec fortranFloat 534 HiLink fortranTypeEx fortranType 535 HiLink fortranIOEx fortranIO 536 HiLink fortranKeywordEx fortranKeyword 537 HiLink fortranStringEx fortranString 538 HiLink fortran77IntrinsicEx fortran90Intrinsic 539 HiLink fortranUnitHeaderEx fortranUnitHeader 540 HiLink fortranConditionalEx fortranConditional 541 HiLink fortran90IntrinsicEx fortran90Intrinsic 542 endif 543 544 HiLink fortranFloat Float 545 HiLink fortranPreCondit PreCondit 546 HiLink fortranInclude Include 547 HiLink cIncluded fortranString 548 HiLink cInclude Include 549 HiLink cPreProc PreProc 550 HiLink cPreCondit PreCondit 551 HiLink fortranParenError Error 552 HiLink fortranComment Comment 553 HiLink fortranSerialNumber Todo 554 HiLink fortranTab Error 555 " Vendor extensions 556 HiLink fortranExtraIntrinsic Function 557 558 delcommand HiLink 559endif 560 561let b:current_syntax = "fortran" 562 563let &cpo = s:cpo_save 564unlet s:cpo_save 565" vim: ts=8 tw=132 566