Mercurial > vim
annotate runtime/ftplugin/fortran.vim @ 33844:58c9f11eae5b v9.0.2134
patch 9.0.2134: ml_get error when scrolling
Commit: https://github.com/vim/vim/commit/c4ffeddfe5bd1824650e9b911ed9245bf56c69e3
Author: Christian Brabandt <cb@256bit.org>
Date: Mon Nov 27 23:25:03 2023 +0100
patch 9.0.2134: ml_get error when scrolling
Problem: ml_get error when scrolling after delete
Solution: mark topline to be validated in main_loop
if it is larger than current buffers line
count
reset_lnums() is called after e.g. TextChanged autocommands and it may
accidentally cause curwin->w_topline to become invalid, e.g. if the
autocommand has deleted some lines.
So verify that curwin->w_topline points to a valid line and if not, mark
the window to have w_topline recalculated in main_loop() in
update_topline() after reset_lnums() returns.
fixes: #13568
fixes: #13578
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 27 Nov 2023 23:30:04 +0100 |
parents | f8e9d5023bf6 |
children | cf2ae76cbbf7 |
rev | line source |
---|---|
7 | 1 " Vim settings file |
3492 | 2 " Language: Fortran 2008 (and older: Fortran 2003, 95, 90, 77, 66) |
29066 | 3 " Version: (v53) 2021 April 06 (updated 2022 May 22) |
5400 | 4 " Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/> |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
5 " Usage: For instructions, do :help fortran-plugin from Vim |
2398 | 6 " Credits: |
22565 | 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, | |
24387 | 10 " Doug Kearns, and Fritz Reese. |
7 | 11 |
12 " Only do these settings when not done yet for this buffer | |
13 if exists("b:did_ftplugin") | |
14 finish | |
15 endif | |
16 | |
3237 | 17 let s:cposet=&cpoptions |
18 set cpoptions&vim | |
19 | |
7 | 20 " Don't do other file type settings for this buffer |
21 let b:did_ftplugin = 1 | |
22 | |
23 " Determine whether this is a fixed or free format source file | |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
24 " if this hasn't been done yet using the priority: |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
25 " buffer-local value |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
26 " > global value |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
27 " > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers |
7 | 28 if !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 | |
20115 | 35 elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$' |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
36 " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
37 let b:fortran_fixed_source = 0 |
20115 | 38 elseif expand("%:e") =~? '^\%(f\|f77\|for\)$' |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
39 " Fixed-form file extension defaults |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
40 let b:fortran_fixed_source = 1 |
7 | 41 else |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
42 " Modern fortran still allows both fixed and free source form |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
43 " Assume fixed source form unless signs of free source form |
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
44 " are detected in the first five columns of the first s:lmax lines. |
7 | 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 | |
7384
aea5ebf352c4
commit https://github.com/vim/vim/commit/256972a9849b5d575b62a6a71be5b6934b5b0e8b
Christian Brabandt <cb@256bit.org>
parents:
5400
diff
changeset
|
47 " the very top of each file and you have a fast computer. |
2398 | 48 let s:lmax = 500 |
7 | 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) | |
2398 | 56 if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' |
7 | 57 let b:fortran_fixed_source = 0 |
58 break | |
59 endif | |
60 let s:ln = s:ln + 1 | |
61 endwhile | |
2398 | 62 unlet! s:lmax s:ln s:test |
7 | 63 endif |
64 endif | |
65 | |
66 " Set comments and textwidth according to source type | |
67 if (b:fortran_fixed_source == 1) | |
68 setlocal comments=:!,:*,:C | |
24387 | 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 | |
7 | 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 | |
24387 | 81 endif |
7 | 82 else |
83 setlocal comments=:! | |
5400 | 84 " Free format allows a textwidth of 132 |
85 setlocal tw=132 | |
7 | 86 endif |
87 | |
88 " Set commentstring for foldmethod=marker | |
89 setlocal cms=!%s | |
90 | |
91 " Tabs are not a good idea in Fortran so the default is to expand tabs | |
92 if !exists("fortran_have_tabs") | |
93 setlocal expandtab | |
94 endif | |
95 | |
5400 | 96 " Set 'formatoptions' to break text lines |
97 setlocal fo+=t | |
7 | 98 |
819 | 99 setlocal include=^\\c#\\=\\s*include\\s\\+ |
3492 | 100 setlocal suffixesadd+=.f08,.f03,.f95,.f90,.for,.f,.F,.f77,.ftn,.fpp |
7 | 101 |
102 " Define patterns for the matchit plugin | |
103 if !exists("b:match_words") | |
104 let s:notend = '\%(\<end\s\+\)\@<!' | |
105 let s:notselect = '\%(\<select\s\+\)\@<!' | |
106 let s:notelse = '\%(\<end\s\+\|\<else\s\+\)\@<!' | |
819 | 107 let s:notprocedure = '\%(\s\+procedure\>\)\@!' |
29066 | 108 let s:nothash = '\%(^\s*#\s*\)\@<!' |
7 | 109 let b:match_ignorecase = 1 |
110 let b:match_words = | |
3492 | 111 \ '(:),' . |
7 | 112 \ '\<select\s*case\>:' . s:notselect. '\<case\>:\<end\s*select\>,' . |
113 \ s:notelse . '\<if\s*(.\+)\s*then\>:' . | |
29066 | 114 \ s:nothash . '\<else\s*\%(if\s*(.\+)\s*then\)\=\>:' . s:nothash . '\<end\s*if\>,'. |
7 | 115 \ 'do\s\+\(\d\+\):\%(^\s*\)\@<=\1\s,'. |
116 \ s:notend . '\<do\>:\<end\s*do\>,'. | |
117 \ s:notelse . '\<where\>:\<elsewhere\>:\<end\s*where\>,'. | |
118 \ s:notend . '\<type\s*[^(]:\<end\s*type\>,'. | |
3492 | 119 \ s:notend . '\<forall\>:\<end\s*forall\>,'. |
120 \ s:notend . '\<associate\>:\<end\s*associate\>,'. | |
121 \ s:notend . '\<enum\>:\<end\s*enum\>,'. | |
7 | 122 \ s:notend . '\<interface\>:\<end\s*interface\>,'. |
123 \ s:notend . '\<subroutine\>:\<end\s*subroutine\>,'. | |
124 \ s:notend . '\<function\>:\<end\s*function\>,'. | |
819 | 125 \ s:notend . '\<module\>' . s:notprocedure . ':\<end\s*module\>,'. |
29066 | 126 \ s:notend . '\<program\>:\<end\s*program\>,'. |
127 \ '\%(^\s*\)\@<=#\s*if\%(def\|ndef\)\=\>:\%(^\s*\)\@<=#\s*\%(elif\|else\)\>:\%(^\s*\)\@<=#\s*endif\>' | |
7 | 128 endif |
129 | |
130 " File filters for :browse e | |
22565 | 131 if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") |
3492 | 132 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" . |
7 | 133 \ "All Files (*.*)\t*.*\n" |
134 endif | |
135 | |
5400 | 136 let b:undo_ftplugin = "setl fo< com< tw< cms< et< inc< sua<" |
7 | 137 \ . "| unlet! b:match_ignorecase b:match_words b:browsefilter" |
138 | |
139 let &cpoptions=s:cposet | |
140 unlet s:cposet | |
141 | |
142 " vim:sw=2 |