home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unix / vim-6.2.tar.bz2 / vim-6.2.tar / vim62 / runtime / syntax / fortran.vim < prev    next >
Encoding:
Text File  |  2003-03-12  |  25.0 KB  |  527 lines

  1. " Vim syntax file
  2. " Language:    Fortran95 (and Fortran90, Fortran77, F and elf90)
  3. " Version:    0.86
  4. " URL:        http://www.unb.ca/chem/ajit/syntax/fortran.vim
  5. " Last Change:    2003 Mar. 12
  6. " Maintainer:    Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
  7. " Usage:    Do :help fortran-syntax from Vim
  8. " Credits:
  9. "  Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and
  10. "  Preben Guldberg. Useful suggestions were made by: Andrej Panjkov,
  11. "  Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
  12. "  Walter DieudonnΘ, Alexander Wagner, Roman Bertle, Charles Rendleman,
  13. "  and Andrew Griffiths. For instructions on use, do :help fortran from vim
  14.  
  15. " For version 5.x: Clear all syntax items
  16. " For version 6.x: Quit if a syntax file is already loaded
  17. if version < 600
  18.   syntax clear
  19. elseif exists("b:current_syntax")
  20.   finish
  21. endif
  22.  
  23. " let b:fortran_dialect = fortran_dialect if set correctly by user
  24. if exists("fortran_dialect")
  25.   if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
  26.     let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
  27.   else
  28.     echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
  29.     let b:fortran_dialect = "unknown"
  30.   endif
  31. else
  32.   let b:fortran_dialect = "unknown"
  33. endif
  34.  
  35. " fortran_dialect not set or set incorrectly by user,
  36. if b:fortran_dialect == "unknown"
  37.   " set b:fortran_dialect from directive in first three lines of file
  38.   let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
  39.   if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
  40.     let b:fortran_dialect = "F"
  41.   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
  42.     let b:fortran_dialect = "elf"
  43.   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
  44.     let b:fortran_dialect = "f90"
  45.   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
  46.     let b:fortran_dialect = "f95"
  47.   elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
  48.     let b:fortran_dialect = "f77"
  49.   else
  50.     " no directive found, so assume f95
  51.     let b:fortran_dialect = "f95"
  52.   endif
  53.   unlet b:fortran_retype
  54. endif
  55.  
  56. " Choose between fixed and free source form if this hasn't been done yet
  57. if !exists("b:fortran_fixed_source")
  58.   if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
  59.     " elf and F require free source form
  60.     let b:fortran_fixed_source = 0
  61.   elseif b:fortran_dialect == "f77"
  62.     " f77 requires fixed source form
  63.     let b:fortran_fixed_source = 1
  64.   elseif exists("fortran_free_source")
  65.     " User guarantees free source form for all f90 and f95 files
  66.     let b:fortran_fixed_source = 0
  67.   elseif exists("fortran_fixed_source")
  68.     " User guarantees fixed source form for all f90 and f95 files
  69.     let b:fortran_fixed_source = 1
  70.   else
  71.     " f90 and f95 allow both fixed and free source form.
  72.     " Assume fixed source form unless signs of free source form
  73.     " are detected in the first five columns of the first b:lmax lines.
  74.     " Detection becomes more accurate and time-consuming if more lines
  75.     " are checked. Increase the limit below if you keep lots of comments at
  76.     " the very top of each file and you have a fast computer.
  77.     let b:lmax = 25
  78.     if ( b:lmax > line("$") )
  79.       let b:lmax = line("$")
  80.     endif
  81.     let b:fortran_fixed_source = 1
  82.     let b:ln=1
  83.     while b:ln <= b:lmax
  84.       let b:test = strpart(getline(b:ln),0,5)
  85.       if b:test[0] !~ '[Cc*!#]' && b:test !~ '^ \+[!#]' && b:test =~ '[^ 0-9\t]'
  86.     let b:fortran_fixed_source = 0
  87.     break
  88.       endif
  89.       let b:ln = b:ln + 1
  90.     endwhile
  91.     unlet b:lmax b:ln b:test
  92.   endif
  93. endif
  94.  
  95. syn case ignore
  96.  
  97. if b:fortran_dialect == "f77"
  98.   syn match fortranIdentifier        "\<\a\(\a\|\d\)*\>" contains=fortranSerialNumber
  99. else
  100.   syn match fortran90Identifier        "\<\a\w*\>" contains=fortranSerialNumber
  101.   if version >= 600
  102.     if b:fortran_fixed_source == 1
  103.       syn match fortranConstructName    "^\s\{6,}\zs\a\w*\ze\s*:"
  104.     else
  105.       syn match fortranConstructName    "^\s*\zs\a\w*\ze\s*:"
  106.     endif
  107.     if exists("fortran_more_precise")
  108.       syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
  109.       syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
  110.       syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
  111.     endif
  112.   else
  113.     if b:fortran_fixed_source == 1
  114.       syn match fortranConstructName    "^\s\{6,}\a\w*\s*:"
  115.     else
  116.       syn match fortranConstructName    "^\s*\a\w*\s*:"
  117.     endif
  118.   endif
  119. endif
  120.  
  121. syn match   fortranUnitHeader    "\<end\>"
  122.  
  123. syn keyword fortranType        character complex integer
  124. syn keyword fortranType        intrinsic
  125. syn match fortranType        "\<implicit\>"
  126. syn keyword fortranStructure    dimension
  127. syn keyword fortranStorageClass    parameter save
  128. syn match fortranUnitHeader    "\<subroutine\>"
  129. syn keyword fortranCall        call
  130. syn match fortranUnitHeader    "\<function\>"
  131. syn match fortranUnitHeader    "\<program\>"
  132. syn keyword fortranStatement    return stop
  133. syn keyword fortranConditional    else then
  134. syn match fortranConditional    "\<if\>"
  135. syn match fortranRepeat        "\<do\>"
  136.  
  137. syn keyword fortranTodo        contained todo fixme
  138.  
  139. "Catch errors caused by too many right parentheses
  140. syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded
  141. syn match  fortranParenError   ")"
  142.  
  143. syn match fortranOperator    "\.\s*n\=eqv\s*\."
  144. syn match fortranOperator    "\.\s*\(and\|or\|not\)\s*\."
  145. syn match fortranOperator    "\(+\|-\|/\|\*\)"
  146.  
  147. syn match fortranBoolean    "\.\s*\(true\|false\)\s*\."
  148.  
  149. syn keyword fortranReadWrite    backspace close inquire open rewind endfile
  150. syn keyword fortranReadWrite    read write print
  151.  
  152. "If tabs are allowed then the left margin checks do not work
  153. if exists("fortran_have_tabs")
  154.   syn match fortranTab        "\t"  transparent
  155. else
  156.   syn match fortranTab        "\t"
  157. endif
  158.  
  159. syn keyword fortranIO        unit file iostat access blank fmt form
  160. syn keyword fortranIO        recl status exist opened number named name
  161. syn keyword fortranIO        sequential direct rec
  162. syn keyword fortranIO        formatted unformatted nextrec
  163.  
  164. syn keyword fortran66Intrinsic        cabs ccos cexp clog csin csqrt
  165. syn keyword fortran66Intrinsic        dacos dasin datan datan2 dcos dcosh
  166. syn keyword fortran66Intrinsic        ddim dexp dint dlog dlog10 dmod dabs
  167. syn keyword fortran66Intrinsic        dnint dsign dsin dsinh dsqrt dtan
  168. syn keyword fortran66Intrinsic        dtanh iabs idim idnint isign idint ifix
  169. syn keyword fortran66Intrinsic        amax0 amax1 dmax1 max0 max1
  170. syn keyword fortran66Intrinsic        amin0 amin1 dmin1 min0 min1
  171. syn keyword fortran66Intrinsic        amod float sngl alog alog10
  172.  
  173. " Intrinsics provided by some vendors
  174. syn keyword fortranExtraIntrinsic    cdabs cdcos cdexp cdlog cdsin cdsqrt
  175. syn keyword fortranExtraIntrinsic    cqabs cqcos cqexp cqlog cqsin cqsqrt
  176. syn keyword fortranExtraIntrinsic    qacos qasin qatan qatan2 qcos qcosh
  177. syn keyword fortranExtraIntrinsic    qdim qexp iqint qlog qlog10 qmod qabs
  178. syn keyword fortranExtraIntrinsic    qnint qsign qsin qsinh qsqrt qtan
  179. syn keyword fortranExtraIntrinsic    qtanh qmax1 qmin1
  180. syn keyword fortranExtraIntrinsic    dimag qimag dcmplx qcmplx dconjg qconjg
  181. syn keyword fortranExtraIntrinsic    gamma dgamma qgamma algama dlgama qlgama
  182. syn keyword fortranExtraIntrinsic    erf derf qerf erfc derfc qerfc
  183. syn keyword fortranExtraIntrinsic    dfloat
  184.  
  185. syn keyword fortran77Intrinsic    abs acos aimag aint anint asin atan atan2
  186. syn keyword fortran77Intrinsic    cos sin tan sinh cosh tanh exp log log10
  187. syn keyword fortran77Intrinsic    sign sqrt int cmplx nint min max conjg
  188. syn keyword fortran77Intrinsic    char ichar index
  189. syn match fortran77Intrinsic    "\<len\s*[(,]"me=s+3
  190. syn match fortran77Intrinsic    "\<real\s*("me=s+4
  191. syn match fortranType        "\<implicit\s\+real"
  192. syn match fortranType        "^\s*real\>"
  193. syn match fortran90Intrinsic    "\<logical\s*("me=s+7
  194. syn match fortranType        "\<implicit\s\+logical"
  195. syn match fortranType        "^\s*logical\>"
  196.  
  197. "Numbers of various sorts
  198. " Integers
  199. syn match fortranNumber    display "\<\d\+\(_\a\w*\)\=\>"
  200. " floating point number, without a decimal point
  201. syn match fortranFloatNoDec    display    "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
  202. " floating point number, starting with a decimal point
  203. syn match fortranFloatIniDec    display    "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
  204. " floating point number, no digits after decimal
  205. syn match fortranFloatEndDec    display    "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
  206. " floating point number, D or Q exponents
  207. syn match fortranFloatDExp    display    "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
  208. " floating point number
  209. syn match fortranFloat    display    "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
  210. " Numbers in formats
  211. syn match fortranFormatSpec    display    "\d*f\d\+\.\d\+"
  212. syn match fortranFormatSpec    display    "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
  213. syn match fortranFormatSpec    display    "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
  214. syn match fortranFormatSpec    display    "\d\+x\>"
  215. " The next match cannot be used because it would pick up identifiers as well
  216. " syn match fortranFormatSpec    display    "\<\(a\|i\)\d\+"
  217.  
  218. " Numbers as labels
  219. syn match fortranLabelNumber    display    "^\d\{1,5}\s"me=e-1
  220. syn match fortranLabelNumber    display    "^ \d\{1,4}\s"ms=s+1,me=e-1
  221. syn match fortranLabelNumber    display    "^  \d\{1,3}\s"ms=s+2,me=e-1
  222. syn match fortranLabelNumber    display    "^   \d\d\=\s"ms=s+3,me=e-1
  223. syn match fortranLabelNumber    display    "^    \d\s"ms=s+4,me=e-1
  224.  
  225. if version >= 600 && exists("fortran_more_precise")
  226.   " Numbers as targets
  227.   syn match fortranTarget    display    "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
  228.   syn match fortranTarget    display    "\(\<do\s\+\)\@<=\d\+\>"
  229.   syn match fortranTarget    display    "\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
  230. endif
  231.  
  232. syn keyword fortranTypeEx    external
  233. syn keyword fortranIOEx        format
  234. syn keyword fortranStatementEx    continue
  235. syn match fortranStatementEx    "\<go\s*to\>"
  236. syn region fortranStringEx    start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
  237. syn keyword fortran77IntrinsicEx    dim lge lgt lle llt mod
  238. syn keyword fortranStatementOb    assign pause to
  239.  
  240. if b:fortran_dialect != "f77"
  241.  
  242.   syn keyword fortranType    type none
  243.  
  244.   syn keyword fortranStructure    private public intent optional
  245.   syn keyword fortranStructure    pointer target allocatable
  246.   syn keyword fortranStorageClass    in out
  247.   syn match fortranStorageClass    "\<kind\s*="me=s+4
  248.   syn match fortranStorageClass    "\<len\s*="me=s+3
  249.  
  250.   syn match fortranUnitHeader    "\<module\>"
  251.   syn keyword fortranUnitHeader    use only contains
  252.   syn keyword fortranUnitHeader    result operator assignment
  253.   syn match fortranUnitHeader    "\<interface\>"
  254.   syn match fortranUnitHeader    "\<recursive\>"
  255.   syn keyword fortranStatement    allocate deallocate nullify cycle exit
  256.   syn match fortranConditional    "\<select\>"
  257.   syn keyword fortranConditional    case default where elsewhere
  258.  
  259.   syn match fortranOperator    "\(\(>\|<\)=\=\|==\|/=\|=\)"
  260.   syn match fortranOperator    "=>"
  261.  
  262.   syn region fortranString    start=+"+ end=+"+    contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
  263.   syn keyword fortranIO        pad position action delim readwrite
  264.   syn keyword fortranIO        eor advance nml
  265.  
  266.   syn keyword fortran90Intrinsic    adjustl adjustr all allocated any
  267.   syn keyword fortran90Intrinsic    associated bit_size btest ceiling
  268.   syn keyword fortran90Intrinsic    count cshift date_and_time
  269.   syn keyword fortran90Intrinsic    digits dot_product eoshift epsilon exponent
  270.   syn keyword fortran90Intrinsic    floor fraction huge iand ibclr ibits ibset ieor
  271.   syn keyword fortran90Intrinsic    ior ishft ishftc lbound len_trim
  272.   syn keyword fortran90Intrinsic    matmul maxexponent maxloc maxval merge
  273.   syn keyword fortran90Intrinsic    minexponent minloc minval modulo mvbits nearest
  274.   syn keyword fortran90Intrinsic    pack present product radix random_number
  275.   syn match fortran90Intrinsic        "\<not\>\(\s*\.\)\@!"me=s+3
  276.   syn keyword fortran90Intrinsic    random_seed range repeat reshape rrspacing scale
  277.   syn keyword fortran90Intrinsic    selected_int_kind selected_real_kind scan
  278.   syn keyword fortran90Intrinsic    shape size spacing spread set_exponent
  279.   syn keyword fortran90Intrinsic    tiny transpose trim ubound unpack verify
  280.   syn keyword fortran90Intrinsic    precision sum system_clock
  281.   syn match fortran90Intrinsic    "\<kind\>\s*[(,]"me=s+4
  282.  
  283.   syn match  fortranUnitHeader    "\<end\s*function"
  284.   syn match  fortranUnitHeader    "\<end\s*interface"
  285.   syn match  fortranUnitHeader    "\<end\s*module"
  286.   syn match  fortranUnitHeader    "\<end\s*program"
  287.   syn match  fortranUnitHeader    "\<end\s*subroutine"
  288.   syn match  fortranRepeat    "\<end\s*do"
  289.   syn match  fortranConditional    "\<end\s*where"
  290.   syn match  fortranConditional    "\<select\s*case"
  291.   syn match  fortranConditional    "\<end\s*select"
  292.   syn match  fortranType    "\<end\s*type"
  293.   syn match  fortranType    "\<in\s*out"
  294.  
  295.   syn keyword fortranUnitHeaderEx    procedure
  296.   syn keyword fortranIOEx        namelist
  297.   syn keyword fortranConditionalEx    while
  298.   syn keyword fortran90IntrinsicEx    achar iachar transfer
  299.  
  300.   syn keyword fortranInclude        include
  301.   syn keyword fortran90StorageClassR    sequence
  302. endif
  303.  
  304. syn match   fortranConditional    "\<end\s*if"
  305. syn match   fortranIO        contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
  306. syn match   fortranConditional    "\<else\s*if"
  307.  
  308. syn keyword fortranUnitHeaderR    entry
  309. syn match fortranTypeR        display "double\s\+precision"
  310. syn match fortranTypeR        display "double\s\+complex"
  311. syn match fortranUnitHeaderR    display "block\s\+data"
  312. syn keyword fortranStorageClassR    common equivalence data
  313. syn keyword fortran77IntrinsicR    dble dprod
  314. syn match   fortran77OperatorR    "\.\s*[gl][et]\s*\."
  315. syn match   fortran77OperatorR    "\.\s*\(eq\|ne\)\s*\."
  316.  
  317. if b:fortran_dialect == "f95"
  318.   syn keyword fortranRepeat        forall
  319.   syn match fortranRepeat        "\<end\s*forall"
  320.   syn keyword fortran95Intrinsic    null cpu_time
  321.   syn match fortranType            "\<elemental\>"
  322.   syn match fortranType            "\<pure\>"
  323.   if exists("fortran_more_precise")
  324.     syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
  325.   endif
  326. endif
  327.  
  328. syn cluster fortranCommentGroup contains=fortranTodo
  329.  
  330. if (b:fortran_fixed_source == 1)
  331.   if !exists("fortran_have_tabs")
  332.     "Flag items beyond column 72
  333.     syn match fortranSerialNumber    excludenl "^.\{73,}$"lc=72
  334.     "Flag left margin errors
  335.     syn match fortranLabelError    "^.\{-,4}[^0-9 ]" contains=fortranTab
  336.     syn match fortranLabelError    "^.\{4}\d\S"
  337.   endif
  338.   syn match fortranComment        excludenl "^[!c*].*$" contains=@fortranCommentGroup
  339.   syn match fortranLeftMargin        transparent "^ \{5}"
  340.   syn match fortranContinueMark        display "^.\{5}\S"lc=5
  341. else
  342.   syn match fortranContinueMark        display "&"
  343. endif
  344.  
  345. if b:fortran_dialect != "f77"
  346.   syn match fortranComment    excludenl "!.*$" contains=@fortranCommentGroup
  347. endif
  348.  
  349. "cpp is often used with Fortran
  350. syn match    cPreProc        "^\s*#\s*\(define\|ifdef\)\>.*"
  351. syn match    cPreProc        "^\s*#\s*\(elif\|if\)\>.*"
  352. syn match    cPreProc        "^\s*#\s*\(ifndef\|undef\)\>.*"
  353. syn match    cPreCondit        "^\s*#\s*\(else\|endif\)\>.*"
  354. syn region    cIncluded    contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
  355. syn match    cIncluded        contained "<[^>]*>"
  356. syn match    cInclude        "^\s*#\s*include\>\s*["<]" contains=cIncluded
  357.  
  358. "Synchronising limits assume that comment and continuation lines are not mixed
  359. if (b:fortran_fixed_source == 0)
  360.   syn sync linecont "&" maxlines=40
  361. else
  362.   syn sync minlines=20
  363. endif
  364.  
  365. if version >= 600 && exists("fortran_fold")
  366.  
  367.   syn sync fromstart
  368.   if (b:fortran_fixed_source == 1)
  369.     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
  370.     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
  371.     syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
  372.     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
  373.     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
  374.     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
  375.   else
  376.     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
  377.     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
  378.     syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
  379.     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
  380.     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
  381.     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
  382.   endif
  383.  
  384.   if exists("fortran_fold_conditionals")
  385.     if (b:fortran_fixed_source == 1)
  386.       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
  387.       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
  388.       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
  389.       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
  390.     else
  391.       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
  392.       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
  393.       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
  394.       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
  395.     endif
  396.   endif
  397.  
  398.   if exists("fortran_fold_multilinecomments")
  399.     if (b:fortran_fixed_source == 1)
  400.       syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
  401.     else
  402.       syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
  403.     endif
  404.   endif
  405. endif
  406.  
  407. " Define the default highlighting.
  408. " For version 5.7 and earlier: only when not done already
  409. " For version 5.8 and later: only when an item doesn't have highlighting yet
  410. if version >= 508 || !exists("did_fortran_syn_inits")
  411.   if version < 508
  412.     let did_fortran_syn_inits = 1
  413.     command -nargs=+ HiLink hi link <args>
  414.   else
  415.     command -nargs=+ HiLink hi def link <args>
  416.   endif
  417.  
  418.   " The default highlighting differs for each dialect.
  419.   " Transparent groups:
  420.   " fortranParen, fortranLeftMargin
  421.   " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
  422.   " fortranBlockData
  423.   " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
  424.   " fortranMultiCommentLines
  425.   HiLink fortranStatement        Statement
  426.   HiLink fortranConstructName    Special
  427.   HiLink fortranConditional        Conditional
  428.   HiLink fortranRepeat        Repeat
  429.   HiLink fortranTodo            Todo
  430.   HiLink fortranContinueMark        Todo
  431.   HiLink fortranString        String
  432.   HiLink fortranNumber        Number
  433.   HiLink fortranOperator        Operator
  434.   HiLink fortranBoolean        Boolean
  435.   HiLink fortranLabelError        Error
  436.   HiLink fortranObsolete        Todo
  437.   HiLink fortranType            Type
  438.   HiLink fortranStructure        Type
  439.   HiLink fortranStorageClass        StorageClass
  440.   HiLink fortranCall            fortranUnitHeader
  441.   HiLink fortranUnitHeader        fortranPreCondit
  442.   HiLink fortranReadWrite        fortran90Intrinsic
  443.   HiLink fortranIO            fortran90Intrinsic
  444.   HiLink fortran95Intrinsic        fortran90Intrinsic
  445.   HiLink fortran77Intrinsic        fortran90Intrinsic
  446.   HiLink fortran90Intrinsic        Special
  447.  
  448.   if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
  449.     HiLink fortranStatementOb    fortranObsolete
  450.     HiLink fortran66Intrinsic    fortranObsolete
  451.     HiLink fortran77IntrinsicR    fortranObsolete
  452.     HiLink fortranUnitHeaderR    fortranObsolete
  453.     HiLink fortranTypeR        fortranObsolete
  454.     HiLink fortranStorageClassR    fortranObsolete
  455.     HiLink fortran90StorageClassR    fortranObsolete
  456.     HiLink fortran77OperatorR    fortranObsolete
  457.     HiLink fortranInclude        fortranObsolete
  458.   else
  459.     HiLink fortranStatementOb    Statement
  460.     HiLink fortran66Intrinsic    fortran90Intrinsic
  461.     HiLink fortran77IntrinsicR    fortran90Intrinsic
  462.     HiLink fortranUnitHeaderR    fortranPreCondit
  463.     HiLink fortranTypeR        fortranType
  464.     HiLink fortranStorageClassR    fortranStorageClass
  465.     HiLink fortran77OperatorR    fortranOperator
  466.     HiLink fortranInclude        Include
  467.     HiLink fortran90StorageClassR    fortranStorageClass
  468.   endif
  469.  
  470.   if ( b:fortran_dialect == "F" )
  471.     HiLink fortranLabelNumber    fortranObsolete
  472.     HiLink fortranTarget        fortranObsolete
  473.     HiLink fortranFormatSpec        fortranObsolete
  474.     HiLink fortranFloatDExp        fortranObsolete
  475.     HiLink fortranFloatNoDec        fortranObsolete
  476.     HiLink fortranFloatIniDec    fortranObsolete
  477.     HiLink fortranFloatEndDec    fortranObsolete
  478.     HiLink fortranTypeEx        fortranObsolete
  479.     HiLink fortranIOEx        fortranObsolete
  480.     HiLink fortranStatementEx    fortranObsolete
  481.     HiLink fortranStringEx        fortranObsolete
  482.     HiLink fortran77IntrinsicEx    fortranObsolete
  483.     HiLink fortranUnitHeaderEx    fortranObsolete
  484.     HiLink fortranConditionalEx    fortranObsolete
  485.     HiLink fortran90IntrinsicEx    fortranObsolete
  486.   else
  487.     HiLink fortranLabelNumber    Special
  488.     HiLink fortranTarget        Special
  489.     HiLink fortranFormatSpec        Identifier
  490.     HiLink fortranFloatDExp        fortranFloat
  491.     HiLink fortranFloatNoDec        fortranFloat
  492.     HiLink fortranFloatIniDec    fortranFloat
  493.     HiLink fortranFloatEndDec    fortranFloat
  494.     HiLink fortranTypeEx        fortranType
  495.     HiLink fortranIOEx        fortranIO
  496.     HiLink fortranStatementEx    fortranStatement
  497.     HiLink fortranStringEx        fortranString
  498.     HiLink fortran77IntrinsicEx    fortran90Intrinsic
  499.     HiLink fortranUnitHeaderEx    fortranUnitHeader
  500.     HiLink fortranConditionalEx    fortranConditional
  501.     HiLink fortran90IntrinsicEx    fortran90Intrinsic
  502.   endif
  503.  
  504.   HiLink fortranFloat        Float
  505.   HiLink fortran90Identifier        fortranIdentifier
  506.   "Uncomment the next line if you want all fortran variables to be highlighted
  507.   "HiLink fortranIdentifier        Identifier
  508.   HiLink fortranPreCondit        PreCondit
  509.   HiLink fortranInclude        Include
  510.   HiLink cIncluded            fortranString
  511.   HiLink cInclude            Include
  512.   HiLink cPreProc            PreProc
  513.   HiLink cPreCondit            PreCondit
  514.   HiLink fortranParenError        Error
  515.   HiLink fortranComment        Comment
  516.   HiLink fortranSerialNumber        Todo
  517.   HiLink fortranTab            Error
  518.   " Vendor extensions
  519.   HiLink fortranExtraIntrinsic    Special
  520.  
  521.   delcommand HiLink
  522. endif
  523.  
  524. let b:current_syntax = "fortran"
  525.  
  526. " vim: ts=8 tw=132
  527.