Mercurial > vim
annotate runtime/indent/fortran.vim @ 7025:c26ccfcf5989 vim73
Close old branch 'vim73'
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 18 Aug 2015 21:52:12 +0200 |
parents | 878562053ba3 |
children | fd09a9c8468e |
rev | line source |
---|---|
7 | 1 " Vim indent file |
2 " Language: Fortran95 (and Fortran90, Fortran77, F and elf90) | |
2377
878562053ba3
Update Fortran indent and syntax file. (Ajit Thakkar)
Bram Moolenaar <bram@vim.org>
parents:
1125
diff
changeset
|
3 " Version: 0.38 |
878562053ba3
Update Fortran indent and syntax file. (Ajit Thakkar)
Bram Moolenaar <bram@vim.org>
parents:
1125
diff
changeset
|
4 " Last Change: 2010 July 21 |
7 | 5 " Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www.unb.ca/chem/ajit/> |
6 " Usage: Do :help fortran-indent from Vim | |
7 | |
8 " Only load this indent file when no other was loaded. | |
9 if exists("b:did_indent") | |
10 finish | |
11 endif | |
12 let b:did_indent = 1 | |
13 | |
14 setlocal indentkeys+==~end,=~case,=~if,=~else,=~do,=~where,=~elsewhere,=~select | |
15 setlocal indentkeys+==~endif,=~enddo,=~endwhere,=~endselect | |
840 | 16 setlocal indentkeys+==~type,=~interface |
7 | 17 |
18 " Determine whether this is a fixed or free format source file | |
19 " if this hasn't been done yet | |
20 if !exists("b:fortran_fixed_source") | |
21 if exists("fortran_free_source") | |
22 " User guarantees free source form | |
23 let b:fortran_fixed_source = 0 | |
24 elseif exists("fortran_fixed_source") | |
25 " User guarantees fixed source form | |
26 let b:fortran_fixed_source = 1 | |
27 else | |
28 " f90 and f95 allow both fixed and free source form | |
29 " assume fixed source form unless signs of free source form | |
819 | 30 " are detected in the first five columns of the first 250 lines |
7 | 31 " Detection becomes more accurate and time-consuming if more lines |
32 " are checked. Increase the limit below if you keep lots of comments at | |
33 " the very top of each file and you have a fast computer | |
2377
878562053ba3
Update Fortran indent and syntax file. (Ajit Thakkar)
Bram Moolenaar <bram@vim.org>
parents:
1125
diff
changeset
|
34 let s:lmax = 500 |
7 | 35 if ( s:lmax > line("$") ) |
36 let s:lmax = line("$") | |
37 endif | |
38 let b:fortran_fixed_source = 1 | |
39 let s:ln=1 | |
40 while s:ln <= s:lmax | |
41 let s:test = strpart(getline(s:ln),0,5) | |
2377
878562053ba3
Update Fortran indent and syntax file. (Ajit Thakkar)
Bram Moolenaar <bram@vim.org>
parents:
1125
diff
changeset
|
42 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' |
7 | 43 let b:fortran_fixed_source = 0 |
44 break | |
45 endif | |
46 let s:ln = s:ln + 1 | |
47 endwhile | |
48 endif | |
49 endif | |
50 | |
51 " Define the appropriate indent function but only once | |
52 if (b:fortran_fixed_source == 1) | |
53 setlocal indentexpr=FortranGetFixedIndent() | |
54 if exists("*FortranGetFixedIndent") | |
55 finish | |
56 endif | |
57 else | |
58 setlocal indentexpr=FortranGetFreeIndent() | |
59 if exists("*FortranGetFreeIndent") | |
60 finish | |
61 endif | |
62 endif | |
63 | |
819 | 64 let s:cposet=&cpoptions |
65 set cpoptions-=C | |
66 | |
7 | 67 function FortranGetIndent(lnum) |
68 let ind = indent(a:lnum) | |
69 let prevline=getline(a:lnum) | |
70 " Strip tail comment | |
71 let prevstat=substitute(prevline, '!.*$', '', '') | |
72 | |
73 "Indent do loops only if they are all guaranteed to be of do/end do type | |
1125 | 74 if exists("b:fortran_do_enddo") || exists("g:fortran_do_enddo") |
7 | 75 if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*do\>' |
76 let ind = ind + &sw | |
77 endif | |
78 if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*end\s*do\>' | |
79 let ind = ind - &sw | |
80 endif | |
81 endif | |
82 | |
83 "Add a shiftwidth to statements following if, else, case, | |
840 | 84 "where, elsewhere, type and interface statements |
7 | 85 if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(else\|case\|where\|elsewhere\)\>' |
840 | 86 \ ||prevstat =~? '^\s*\(\d\+\s\)\=\s*\(type\|interface\)\>' |
7 | 87 \ || prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*if\>' |
88 let ind = ind + &sw | |
89 " Remove unwanted indent after logical and arithmetic ifs | |
90 if prevstat =~? '\<if\>' && prevstat !~? '\<then\>' | |
91 let ind = ind - &sw | |
92 endif | |
840 | 93 " Remove unwanted indent after type( statements |
94 if prevstat =~? '\<type\s*(' | |
95 let ind = ind - &sw | |
96 endif | |
7 | 97 endif |
98 | |
99 "Subtract a shiftwidth from else, elsewhere, case, end if, | |
840 | 100 " end where, end select, end interface and end type statements |
7 | 101 if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*' |
840 | 102 \. '\(else\|elsewhere\|case\|end\s*\(if\|where\|select\|interface\|type\)\)\>' |
7 | 103 let ind = ind - &sw |
104 " Fix indent for case statement immediately after select | |
105 if prevstat =~? '\<select\>' | |
106 let ind = ind + &sw | |
107 endif | |
108 endif | |
109 | |
110 return ind | |
111 endfunction | |
112 | |
113 function FortranGetFreeIndent() | |
114 "Find the previous non-blank line | |
115 let lnum = prevnonblank(v:lnum - 1) | |
116 | |
117 "Use zero indent at the top of the file | |
118 if lnum == 0 | |
119 return 0 | |
120 endif | |
121 | |
122 let ind=FortranGetIndent(lnum) | |
123 return ind | |
124 endfunction | |
125 | |
126 function FortranGetFixedIndent() | |
127 let currline=getline(v:lnum) | |
128 "Don't indent comments, continuation lines and labelled lines | |
129 if strpart(currline,0,6) =~ '[^ \t]' | |
130 let ind = indent(v:lnum) | |
131 return ind | |
132 endif | |
133 | |
134 "Find the previous line which is not blank, not a comment, | |
135 "not a continuation line, and does not have a label | |
136 let lnum = v:lnum - 1 | |
137 while lnum > 0 | |
138 let prevline=getline(lnum) | |
139 if (prevline =~ "^[C*!]") || (prevline =~ "^\s*$") | |
140 \ || (strpart(prevline,5,1) !~ "[ 0]") | |
141 " Skip comments, blank lines and continuation lines | |
142 let lnum = lnum - 1 | |
143 else | |
144 let test=strpart(prevline,0,5) | |
145 if test =~ "[0-9]" | |
146 " Skip lines with statement numbers | |
147 let lnum = lnum - 1 | |
148 else | |
149 break | |
150 endif | |
151 endif | |
152 endwhile | |
153 | |
154 "First line must begin at column 7 | |
155 if lnum == 0 | |
156 return 6 | |
157 endif | |
158 | |
159 let ind=FortranGetIndent(lnum) | |
160 return ind | |
161 endfunction | |
162 | |
163 let &cpoptions=s:cposet | |
164 unlet s:cposet | |
165 | |
166 " vim:sw=2 tw=130 |