arm*_*ndo 5 vim fortran fortran90
我有一个看起来像这样的fortran代码:
open(2,file=filenm(i),status='unknown')
do j=1,num_lines
do k=1,dime
read(2,*) z(k)
enddo
if( j .ge. 1000 ) then
do k=1,dime
sumz(k)=sumz(k)+z(k)
enddo
nsteps=nsteps+1.0
endif
enddo
close(2)
Run Code Online (Sandbox Code Playgroud)
你可以看到压痕不均匀,我希望有这样的东西:
open(2,file=filenm(i),status='unknown')
do j=1,num_lines
do k=1,dime
read(2,*) z(k)
enddo
if( j .ge. 1000 ) then
do k=1,dime
sumz(k)=sumz(k)+z(k)
enddo
nsteps=nsteps+1.0
endif
enddo
close(2)
Run Code Online (Sandbox Code Playgroud)
我可以逐行修复缩进,但代码有点大.我感谢任何评论.
我经历了一个非常类似的尝试让Fortran缩进到vim工作的过程.我仍然没有很好,但我已经取得了一些进展.arutaku发布的脚本(http://www.vim.org/scripts/script.php?script_id=2299)是我开始的地方,但你需要确保它filetype plugin indent on在你的vimrc中.
我还需要一个脚本来确定我是使用固定格式还是自由格式语法,因为在我的环境中我使用两者.这在文档中是推荐的(http://vimdoc.sourceforge.net/htmldoc/syntax.html#ft-fortran-syntax).正如它所指定的那样,我把这个脚本放在~/.vim/ftplugin/fortran.vim:
let s:extfname = expand("%:e")
if s:extfname ==? "f90"
let fortran_free_source=1
unlet! fortran_fixed_source
else
let fortran_fixed_source=1
unlet! fortran_free_source
endif
Run Code Online (Sandbox Code Playgroud)
我还使用脚本,以便我可以按F7自动完成某些构造:http://www.vim.org/scripts/script.php?script_id = 2487 .我也把它放进去了~/.vim/ftplugin/.
我也在我的vimrc中有这些以尝试进一步改进:
let fortran_do_enddo=1
let fortran_more_precise=1
let fortran_have_tabs=1
Run Code Online (Sandbox Code Playgroud)
我相信那些应该与第一个脚本相互作用来控制它的行为,但我不相信它们都适合我.我知道第一个应该正确缩进do/ enddo阻止.问题在于,由于旧式Fortran允许do没有匹配enddo,脚本无法正确缩进它们,除非您可以保证不会使用不匹配的"do"语句.这let fortran_do_enddo=1应该是保证,但它似乎对我不起作用.最后一个应该允许使用选项卡字符,旧的Fortran认为它不好,因此它可以防止它们被标记为错误.那个似乎对我有用.说实话,我不记得中间人应该做什么,也不记得它对我有用.
编辑:
我发现在我的vim安装目录(/usr/share/vim/vim70/indent/在我的例子中)中有第一个脚本的旧版本,我没有访问权限.您可能拥有这些权利,如果它导致您出现问题,请覆盖或删除它.如果像我一样,你无法编辑它,你可以在$ HOME中获取版本来覆盖第一个中的函数.我通过做两件事来做到这一点.首先,我必须删除检查以查看函数是否已经存在(类似的语句if exists("*FortranGetFixedIndent")),然后我必须更改所有函数声明以强制使用该!字符进行覆盖,即function! SebuFortranGetFreeIndent().据我所知,一切现在大致如我所料!