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)

インデントを1行ずつ修正することはできますが、コードは少し大きいです。コメントをいただければ幸いです。

4

4 に答える 4

5

Fortranのインデントをvimで機能させるために、非常によく似たプロセスを実行しました。まだまだ上手とは言えませんが、だいぶ進みました。アルタクが投稿したスクリプト ( http://www.vim.org/scripts/script.php?script_id=2299filetype 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 では一致する がdoなくても a を使用できるため、一致enddoしない 'do' ステートメントを使用しないことを保証できない限り、スクリプトはそれらを適切にインデントできないことです。そのlet fortran_do_enddo=1保証であるはずですが、私にはうまくいかないようです。最後の 1 つは、古い Fortran では不適切と見なされていたタブ文字の使用を許可することになっているため、エラーとしてマークされるのを防ぎます。それは私のために働くようです。正直なところ、真ん中のものが何をすべきか、それが私にとってうまくいくかどうかは覚えていません.

編集:

vim インストール ディレクトリ (私の場合) に最初のスクリプトの古いバージョンがあり、/usr/share/vim/vim70/indent/アクセス権がないことがわかりました。それらの権利を持っている可能性があります。問題が発生している場合は、上書きまたは削除してください。私のように編集できない場合は、 $HOME でバージョンを取得して、最初から関数を上書きできます。これを行うには、2 つのことを行いました。最初に、関数が既に存在するかどうかを確認するチェックを削除する必要がありました ( のようなステートメント)。次に、文字if exists("*FortranGetFixedIndent")を使用して強制的に上書きするようにすべての関数宣言を変更する必要がありました。私が知る限り、すべてが期待どおりに機能するようになりました。!function! SebuFortranGetFreeIndent()

于 2013-07-12T16:26:18.450 に答える
2

gg=Gは機能しますか?

gg: 先頭に移動
=: インデント...
G: ... 最後まで

于 2013-02-06T19:08:55.080 に答える
1

自動インデント書き込み<x>==(コマンド モード) を使用できます。ここxで、 はインデントする行数です。

vim に fortran インデントがない場合は、次のプラグインをロードして==組み合わせを試すことができます: http://www.vim.org/scripts/script.php?script_id=2299

于 2013-02-06T19:09:06.200 に答える