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