6

我有一个看起来像这样的 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

4 回答 4

5

我经历了一个非常相似的过程,试图让 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

我还使用了一个脚本,这样我就可以按 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 允许 ado没有匹配enddo,因此脚本无法正确缩进它们,除非您可以保证不会使用不匹配的 'do' 语句。应该是那种保证,但它似乎对let fortran_do_enddo=1我不起作用。最后一个应该允许使用制表符,旧的 Fortran 认为这是不好的,因此它可以防止它们被标记为错误。那个似乎对我有用。老实说,我不记得中间那个应该做什么,也不记得它是否对我有用。

编辑:

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

于 2013-07-12T16:26:18.450 回答
2

gg=G有效吗?

gg: 到顶部
=: 缩进...
G: ... 直到最后

于 2013-02-06T19:08:55.080 回答
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

于 2016-08-03T02:30:48.440 回答
1

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

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

于 2013-02-06T19:09:06.200 回答