web-dev-qa-db-ja.com

シェルスクリプトを再インデントする

スペースとタブを組み合わせて使用​​する大きなシェルスクリプトがあります。 Eclipseのフォーマットなどの構文に基づいてファイル全体を再インデントしたいと思います。これを行うプログラム(美化?)はありますか?

すべてが詰まっているロジックを理解するのに苦労しています。

   if [ "$CANCELLATION" ]
   then
   while test $num -gt 0
    do
    if [ "$cjb" -gt 0 ]

Vimで関数を呼び出す方法を学びましたが、うまくいきませんでした。

Emacs-すべての改行を失った

11
jsymolon

Emacsはそれを行うことができます:

  • emacsにファイルをロードします
  • 押す Ctrl-space ファイルの先頭に
  • カーソルをファイルの一番下に移動します
  • 押す Alt-Xuntabifyと入力してから return
  • 押す Alt-Xindent-regionと入力してから return

これにより、タブが削除され、すべてが適切にインデントされます。

これをより頻繁に行う必要があり、エディターとしてEmacsを使用しない場合は、すべてをスクリプトにパックすることをお勧めします。

#!/usr/bin/emacs --script

(setq require-final-newline 'visit)

(defun indent-files (files)
  (cond (files
         (find-file (car files))
         (untabify (point-min) (point-max))
         (indent-region (point-min) (point-max))
         (save-buffer)
         (kill-buffer)
         (indent-files (cdr files)))))

(indent-files command-line-args-left)

;; EOF ;;
13
Grumbel

Vi/Vimでは、正しいファイル構文(:set syntax=sh)、押すことができます: gg=G (または 1G=G)ファイル全体のインデントを修正します。

ファイル全体をインプレースでフォーマットするコマンドは次のとおりです。

ex +"set syn=sh" +"norm gg=G" -cwq foobar.sh

注:上記のコマンドを実行する前に、バックアップを作成してください。

最初にフォーマットをテストするには、Vimでファイルを編集して、次のコマンドを実行します。:norm gg=G

参照: ひどくインデントされたコードの再インデント Vi SE

5
kenorb

shfmt があなたのためにトリックをすることができるように見えます。インデントを含むシェル/ bashコードをフォーマットします。

shfmt -l -w script.sh
2
Daniel

あなたはおそらく Super Shell Indent を望みます。それを〜/ .vim/indentに保存し、次にvimに入るときに、:source ~/.vim/indent/sh.vimを実行します。

また、.vimrcでファイルベースのスマートインデントを設定することもできます。

" Turn on smart indenting
filetype indent on
set smartindent

Vimがフォーマットをいじることを気にしない場合は、この行をvimrcにも追加します。

" When you load/save a Shell script, auto indent it
autocmd BufRead,BufWritePre *.sh normal gg=G

とにかく、これがあなたが待ち望んでいたものです。次にvimでシェルスクリプトを編集するときに、スマートインデントをオンにし、スーパーシェルIDをインストールしたと仮定して、次のキーを押してスクリプトを再度インデントします:gg=G

0
Carl