1" Vim settings file 2" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, 77, 66) 3" Version: (v53) 2021 April 06 4" Maintainer: Ajit J. Thakkar <[email protected]>; <http://www2.unb.ca/~ajit/> 5" Usage: For instructions, do :help fortran-plugin from Vim 6" Credits: 7" Version 0.1 was created in September 2000 by Ajit Thakkar. 8" Since then, useful suggestions and contributions have been made, in order, by: 9" Stefano Zacchiroli, Hendrik Merx, Ben Fritz, David Barnett, Eisuke Kawashima, 10" Doug Kearns, and Fritz Reese. 11 12" Only do these settings when not done yet for this buffer 13if exists("b:did_ftplugin") 14 finish 15endif 16 17let s:cposet=&cpoptions 18set cpoptions&vim 19 20" Don't do other file type settings for this buffer 21let b:did_ftplugin = 1 22 23" Determine whether this is a fixed or free format source file 24" if this hasn't been done yet using the priority: 25" buffer-local value 26" > global value 27" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers 28if !exists("b:fortran_fixed_source") 29 if exists("fortran_free_source") 30 " User guarantees free source form 31 let b:fortran_fixed_source = 0 32 elseif exists("fortran_fixed_source") 33 " User guarantees fixed source form 34 let b:fortran_fixed_source = 1 35 elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$' 36 " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers 37 let b:fortran_fixed_source = 0 38 elseif expand("%:e") =~? '^\%(f\|f77\|for\)$' 39 " Fixed-form file extension defaults 40 let b:fortran_fixed_source = 1 41 else 42 " Modern fortran still allows both fixed and free source form 43 " Assume fixed source form unless signs of free source form 44 " are detected in the first five columns of the first s:lmax lines. 45 " Detection becomes more accurate and time-consuming if more lines 46 " are checked. Increase the limit below if you keep lots of comments at 47 " the very top of each file and you have a fast computer. 48 let s:lmax = 500 49 if ( s:lmax > line("$") ) 50 let s:lmax = line("$") 51 endif 52 let b:fortran_fixed_source = 1 53 let s:ln=1 54 while s:ln <= s:lmax 55 let s:test = strpart(getline(s:ln),0,5) 56 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' 57 let b:fortran_fixed_source = 0 58 break 59 endif 60 let s:ln = s:ln + 1 61 endwhile 62 unlet! s:lmax s:ln s:test 63 endif 64endif 65 66" Set comments and textwidth according to source type 67if (b:fortran_fixed_source == 1) 68 setlocal comments=:!,:*,:C 69 " Fixed format requires a textwidth of 72 for code, 70 " but some vendor extensions allow longer lines 71 if exists("fortran_extended_line_length") 72 setlocal tw=132 73 elseif exists("fortran_cardimage_line_length") 74 setlocal tw=80 75 else 76 setlocal tw=72 77 " If you need to add "&" on continued lines so that the code is 78 " compatible with both free and fixed format, then you should do so 79 " in column 73 and uncomment the next line 80 " setlocal tw=73 81 endif 82else 83 setlocal comments=:! 84 " Free format allows a textwidth of 132 85 setlocal tw=132 86endif 87 88" Set commentstring for foldmethod=marker 89setlocal cms=!%s 90 91" Tabs are not a good idea in Fortran so the default is to expand tabs 92if !exists("fortran_have_tabs") 93 setlocal expandtab 94endif 95 96" Set 'formatoptions' to break text lines 97setlocal fo+=t 98 99setlocal include=^\\c#\\=\\s*include\\s\\+ 100setlocal suffixesadd+=.f08,.f03,.f95,.f90,.for,.f,.F,.f77,.ftn,.fpp 101 102" Define patterns for the matchit plugin 103if !exists("b:match_words") 104 let s:notend = '\%(\<end\s\+\)\@<!' 105 let s:notselect = '\%(\<select\s\+\)\@<!' 106 let s:notelse = '\%(\<end\s\+\|\<else\s\+\)\@<!' 107 let s:notprocedure = '\%(\s\+procedure\>\)\@!' 108 let b:match_ignorecase = 1 109 let b:match_words = 110 \ '(:),' . 111 \ '\<select\s*case\>:' . s:notselect. '\<case\>:\<end\s*select\>,' . 112 \ s:notelse . '\<if\s*(.\+)\s*then\>:' . 113 \ '\<else\s*\%(if\s*(.\+)\s*then\)\=\>:\<end\s*if\>,'. 114 \ 'do\s\+\(\d\+\):\%(^\s*\)\@<=\1\s,'. 115 \ s:notend . '\<do\>:\<end\s*do\>,'. 116 \ s:notelse . '\<where\>:\<elsewhere\>:\<end\s*where\>,'. 117 \ s:notend . '\<type\s*[^(]:\<end\s*type\>,'. 118 \ s:notend . '\<forall\>:\<end\s*forall\>,'. 119 \ s:notend . '\<associate\>:\<end\s*associate\>,'. 120 \ s:notend . '\<enum\>:\<end\s*enum\>,'. 121 \ s:notend . '\<interface\>:\<end\s*interface\>,'. 122 \ s:notend . '\<subroutine\>:\<end\s*subroutine\>,'. 123 \ s:notend . '\<function\>:\<end\s*function\>,'. 124 \ s:notend . '\<module\>' . s:notprocedure . ':\<end\s*module\>,'. 125 \ s:notend . '\<program\>:\<end\s*program\>' 126endif 127 128" File filters for :browse e 129if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") 130 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" . 131 \ "All Files (*.*)\t*.*\n" 132endif 133 134let b:undo_ftplugin = "setl fo< com< tw< cms< et< inc< sua<" 135 \ . "| unlet! b:match_ignorecase b:match_words b:browsefilter" 136 137let &cpoptions=s:cposet 138unlet s:cposet 139 140" vim:sw=2 141