xref: /vim-8.2.3635/runtime/ftplugin/fortran.vim (revision 130cbfc3)
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