hindentコマンドを利用して、指定したディレクトリ以下のすべてのHaskellソースの自動インデントを行うワンライナー
for f in `find . -name "*.hs"`; do cat $f | (hindent --style chris-done > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
hindentはソースを改行した際にtrailing whitespaceを残すことがあるため、それを削除する機能も追加したバージョン
for f in `find . -name "*.hs"`; do cat $f | hindent --style chris-done | (sed 's/ *$//' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
上記プラス、hindentはソースの最終行の改行を削除してしまうので最終行に改行を必ず入れるバージョン
for f in `find . -name "*.hs"`; do cat $f | hindent --style chris-done | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
上記プラス、hindentはたまにエラーになるためどのファイルがエラーになったかも表示するようにしたバージョン
for f in `find . -name "*.hs"`; do printf "$f ... "; cat $f | hindent --style chris-done | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; echo done; else break; fi; done
上記プラス、stylish-haskellも併用したバージョン
for f in `find . -name "*.hs"`; do printf "$f ... "; cat $f | hindent --style chris-done | stylish-haskell | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; echo done; else break; fi; done