1071d4279SBram Moolenaar" Vim settings file 2d38b055aSBram Moolenaar" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, 77, 66) 3*130cbfc3SBram Moolenaar" Version: (v53) 2021 April 06 4b1332080SBram Moolenaar" Maintainer: Ajit J. Thakkar <[email protected]>; <http://www2.unb.ca/~ajit/> 5256972a9SBram Moolenaar" Usage: For instructions, do :help fortran-plugin from Vim 6365bdf7aSBram Moolenaar" Credits: 74f4d51a9SBram Moolenaar" Version 0.1 was created in September 2000 by Ajit Thakkar. 84f4d51a9SBram Moolenaar" Since then, useful suggestions and contributions have been made, in order, by: 94f4d51a9SBram Moolenaar" Stefano Zacchiroli, Hendrik Merx, Ben Fritz, David Barnett, Eisuke Kawashima, 10*130cbfc3SBram Moolenaar" Doug Kearns, and Fritz Reese. 11071d4279SBram Moolenaar 12071d4279SBram Moolenaar" Only do these settings when not done yet for this buffer 13071d4279SBram Moolenaarif exists("b:did_ftplugin") 14071d4279SBram Moolenaar finish 15071d4279SBram Moolenaarendif 16071d4279SBram Moolenaar 17b6b046b2SBram Moolenaarlet s:cposet=&cpoptions 18b6b046b2SBram Moolenaarset cpoptions&vim 19b6b046b2SBram Moolenaar 20071d4279SBram Moolenaar" Don't do other file type settings for this buffer 21071d4279SBram Moolenaarlet b:did_ftplugin = 1 22071d4279SBram Moolenaar 23071d4279SBram Moolenaar" Determine whether this is a fixed or free format source file 24256972a9SBram Moolenaar" if this hasn't been done yet using the priority: 25256972a9SBram Moolenaar" buffer-local value 26256972a9SBram Moolenaar" > global value 27256972a9SBram Moolenaar" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers 28071d4279SBram Moolenaarif !exists("b:fortran_fixed_source") 29071d4279SBram Moolenaar if exists("fortran_free_source") 30071d4279SBram Moolenaar " User guarantees free source form 31071d4279SBram Moolenaar let b:fortran_fixed_source = 0 32071d4279SBram Moolenaar elseif exists("fortran_fixed_source") 33071d4279SBram Moolenaar " User guarantees fixed source form 34071d4279SBram Moolenaar let b:fortran_fixed_source = 1 352c7f8c57SBram Moolenaar elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$' 36256972a9SBram Moolenaar " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers 37256972a9SBram Moolenaar let b:fortran_fixed_source = 0 382c7f8c57SBram Moolenaar elseif expand("%:e") =~? '^\%(f\|f77\|for\)$' 39256972a9SBram Moolenaar " Fixed-form file extension defaults 40256972a9SBram Moolenaar let b:fortran_fixed_source = 1 41071d4279SBram Moolenaar else 42256972a9SBram Moolenaar " Modern fortran still allows both fixed and free source form 43256972a9SBram Moolenaar " Assume fixed source form unless signs of free source form 44256972a9SBram Moolenaar " are detected in the first five columns of the first s:lmax lines. 45071d4279SBram Moolenaar " Detection becomes more accurate and time-consuming if more lines 46071d4279SBram Moolenaar " are checked. Increase the limit below if you keep lots of comments at 47256972a9SBram Moolenaar " the very top of each file and you have a fast computer. 48365bdf7aSBram Moolenaar let s:lmax = 500 49071d4279SBram Moolenaar if ( s:lmax > line("$") ) 50071d4279SBram Moolenaar let s:lmax = line("$") 51071d4279SBram Moolenaar endif 52071d4279SBram Moolenaar let b:fortran_fixed_source = 1 53071d4279SBram Moolenaar let s:ln=1 54071d4279SBram Moolenaar while s:ln <= s:lmax 55071d4279SBram Moolenaar let s:test = strpart(getline(s:ln),0,5) 56365bdf7aSBram Moolenaar if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' 57071d4279SBram Moolenaar let b:fortran_fixed_source = 0 58071d4279SBram Moolenaar break 59071d4279SBram Moolenaar endif 60071d4279SBram Moolenaar let s:ln = s:ln + 1 61071d4279SBram Moolenaar endwhile 62365bdf7aSBram Moolenaar unlet! s:lmax s:ln s:test 63071d4279SBram Moolenaar endif 64071d4279SBram Moolenaarendif 65071d4279SBram Moolenaar 66071d4279SBram Moolenaar" Set comments and textwidth according to source type 67071d4279SBram Moolenaarif (b:fortran_fixed_source == 1) 68071d4279SBram Moolenaar setlocal comments=:!,:*,:C 69*130cbfc3SBram Moolenaar " Fixed format requires a textwidth of 72 for code, 70*130cbfc3SBram Moolenaar " but some vendor extensions allow longer lines 71*130cbfc3SBram Moolenaar if exists("fortran_extended_line_length") 72*130cbfc3SBram Moolenaar setlocal tw=132 73*130cbfc3SBram Moolenaar elseif exists("fortran_cardimage_line_length") 74*130cbfc3SBram Moolenaar setlocal tw=80 75*130cbfc3SBram Moolenaar else 76071d4279SBram Moolenaar setlocal tw=72 77071d4279SBram Moolenaar " If you need to add "&" on continued lines so that the code is 78071d4279SBram Moolenaar " compatible with both free and fixed format, then you should do so 79071d4279SBram Moolenaar " in column 73 and uncomment the next line 80071d4279SBram Moolenaar " setlocal tw=73 81*130cbfc3SBram Moolenaar endif 82071d4279SBram Moolenaarelse 83071d4279SBram Moolenaar setlocal comments=:! 84b1332080SBram Moolenaar " Free format allows a textwidth of 132 85b1332080SBram Moolenaar setlocal tw=132 86071d4279SBram Moolenaarendif 87071d4279SBram Moolenaar 88071d4279SBram Moolenaar" Set commentstring for foldmethod=marker 89071d4279SBram Moolenaarsetlocal cms=!%s 90071d4279SBram Moolenaar 91071d4279SBram Moolenaar" Tabs are not a good idea in Fortran so the default is to expand tabs 92071d4279SBram Moolenaarif !exists("fortran_have_tabs") 93071d4279SBram Moolenaar setlocal expandtab 94071d4279SBram Moolenaarendif 95071d4279SBram Moolenaar 96b1332080SBram Moolenaar" Set 'formatoptions' to break text lines 97b1332080SBram Moolenaarsetlocal fo+=t 98071d4279SBram Moolenaar 99910f66f9SBram Moolenaarsetlocal include=^\\c#\\=\\s*include\\s\\+ 100d38b055aSBram Moolenaarsetlocal suffixesadd+=.f08,.f03,.f95,.f90,.for,.f,.F,.f77,.ftn,.fpp 101071d4279SBram Moolenaar 102071d4279SBram Moolenaar" Define patterns for the matchit plugin 103071d4279SBram Moolenaarif !exists("b:match_words") 104071d4279SBram Moolenaar let s:notend = '\%(\<end\s\+\)\@<!' 105071d4279SBram Moolenaar let s:notselect = '\%(\<select\s\+\)\@<!' 106071d4279SBram Moolenaar let s:notelse = '\%(\<end\s\+\|\<else\s\+\)\@<!' 107910f66f9SBram Moolenaar let s:notprocedure = '\%(\s\+procedure\>\)\@!' 108071d4279SBram Moolenaar let b:match_ignorecase = 1 109071d4279SBram Moolenaar let b:match_words = 110d38b055aSBram Moolenaar \ '(:),' . 111071d4279SBram Moolenaar \ '\<select\s*case\>:' . s:notselect. '\<case\>:\<end\s*select\>,' . 112071d4279SBram Moolenaar \ s:notelse . '\<if\s*(.\+)\s*then\>:' . 113071d4279SBram Moolenaar \ '\<else\s*\%(if\s*(.\+)\s*then\)\=\>:\<end\s*if\>,'. 114071d4279SBram Moolenaar \ 'do\s\+\(\d\+\):\%(^\s*\)\@<=\1\s,'. 115071d4279SBram Moolenaar \ s:notend . '\<do\>:\<end\s*do\>,'. 116071d4279SBram Moolenaar \ s:notelse . '\<where\>:\<elsewhere\>:\<end\s*where\>,'. 117071d4279SBram Moolenaar \ s:notend . '\<type\s*[^(]:\<end\s*type\>,'. 118d38b055aSBram Moolenaar \ s:notend . '\<forall\>:\<end\s*forall\>,'. 119d38b055aSBram Moolenaar \ s:notend . '\<associate\>:\<end\s*associate\>,'. 120d38b055aSBram Moolenaar \ s:notend . '\<enum\>:\<end\s*enum\>,'. 121071d4279SBram Moolenaar \ s:notend . '\<interface\>:\<end\s*interface\>,'. 122071d4279SBram Moolenaar \ s:notend . '\<subroutine\>:\<end\s*subroutine\>,'. 123071d4279SBram Moolenaar \ s:notend . '\<function\>:\<end\s*function\>,'. 124910f66f9SBram Moolenaar \ s:notend . '\<module\>' . s:notprocedure . ':\<end\s*module\>,'. 125071d4279SBram Moolenaar \ s:notend . '\<program\>:\<end\s*program\>' 126071d4279SBram Moolenaarendif 127071d4279SBram Moolenaar 128071d4279SBram Moolenaar" File filters for :browse e 1294f4d51a9SBram Moolenaarif (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") 130d38b055aSBram Moolenaar let b:browsefilter = "Fortran Files (*.f;*.for;*.f77;*.f90;*.f95;*.f03;*.f08;*.fpp;*.ftn)\t*.f;*.for;*.f77;*.f90;*.f95;*.f03;*.f08;*.fpp;*.ftn\n" . 131071d4279SBram Moolenaar \ "All Files (*.*)\t*.*\n" 132071d4279SBram Moolenaarendif 133071d4279SBram Moolenaar 134b1332080SBram Moolenaarlet b:undo_ftplugin = "setl fo< com< tw< cms< et< inc< sua<" 135071d4279SBram Moolenaar \ . "| unlet! b:match_ignorecase b:match_words b:browsefilter" 136071d4279SBram Moolenaar 137071d4279SBram Moolenaarlet &cpoptions=s:cposet 138071d4279SBram Moolenaarunlet s:cposet 139071d4279SBram Moolenaar 140071d4279SBram Moolenaar" vim:sw=2 141