在Vim中缩进Fortran代码

时间:2013-02-06 19:05:19

标签: 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)

你可以看到压痕不均匀,我想要一些东西 像这样:

   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)

我可以逐行修复缩进,但代码有点大。 我感谢任何评论。

4 个答案:

答案 0 :(得分:5)

我经历了一个非常类似的尝试让Fortran缩进到vim工作的过程。我仍然没有很好,但我已经取得了一些进展。 arutaku发布的脚本(http://www.vim.org/scripts/script.php?script_id=2299)是我开始的地方,但您需要确保{vmrc中有filetype plugin indent on

我还需要一个脚本来确定我是使用固定格式还是自由格式语法,因为在我的环境中我使用两者。这在文档中是推荐的(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

我还使用脚本,以便我可以按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

我相信那些应该与第一个脚本互动来控制它的行为,但我不相信它们都适合我。我知道第一个应该正确缩进do / enddo块。问题在于,由于旧式Fortran允许do没有匹配的enddo,因此脚本无法正确缩进它们,除非您可以保证不会使用不匹配的“do”语句。 let fortran_do_enddo=1应该是保证,但它似乎对我不起作用。最后一个应该允许使用选项卡字符,旧的Fortran认为它不好,因此它可以防止它们被标记为错误。那个似乎对我有用。说实话,我不记得中间人应该做什么,也不记得它对我有用。

修改

我发现在我的vim安装目录(在我的情况下为/usr/share/vim/vim70/indent/)中有第一个脚本的旧版本,我没有访问权限。您可能拥有这些权利,如果它导致您出现问题,请覆盖或删除它。如果像我一样,你无法编辑它,你可以在$ HOME中获取版本来覆盖第一个中的函数。我通过做两件事来做到这一点。首先我必须删除检查以查看函数是否已经存在(像if exists("*FortranGetFixedIndent")这样的语句)然后我必须通过使用!字符来改变所有函数声明以强制覆盖,即{{ 1}}。据我所知,现在一切都和我期望的一样!

答案 1 :(得分:2)

gg = G 有效吗?

gg:转至顶部
=:缩进...
G:......直到结束

答案 2 :(得分:2)

尝试:https://sourceforge.net/projects/findent/files/

来自自述文件:

findent:缩进/美化/转换Fortran来源

  • findent支持Fortran-2008

  • findent可以从固定形式转换为自由形式

  • Unix和Windows的二进制文件(分别为findent和findent.exe)

  • 用于处理Unix和Windows可用调用中的一个或多个文件的包装器(分别为wfindent和wfindent.bat)

  • (g)vim用户:findent可以作为插件使用' ='来格式化您的编辑文件。命令

  • gui frontent可在单独的包中找到:jfindent

答案 3 :(得分:1)

您可以使用自动缩进写入<x>==(在命令模式下),其中x是要缩进的行数。

如果vim没有fortran缩进,您可以加载以下插件并尝试==组合:http://www.vim.org/scripts/script.php?script_id=2299