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


11

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

私はすべてが一緒に詰まった状態でロジックを理解するのに苦労しています

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

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

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

回答:


13

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

  • Emacsにファイルをロードします
  • 押すCtrl- spaceファイルの上部
  • カーソルをファイルの下部に移動します
  • プレスAlt- Xとタイプuntabify後、return
  • プレスAlt- Xとタイプindent-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 ;;

1
実際にはemacsの男ではありません-しかし、スーパーシェルvimが機能しない場合。やってみます。
jsymolon 2009

1
M->の通常のバインディングですend-of-buffer。キーボードから手を離すのは悪いからです。
dmckee ---元モデレーターの子猫

3
また、バッファ全体をマークするにはC-x h、を実行しmark-whole-bufferます。
ビクター

鮮やかさ!2つあります。(i)untabifyすべてが選択解除された後、リージョンを再選択する必要があります。(2)これは、メニューに存在するためだけに使用したのではありませんか?それに値する!
alle_meije 2018

5

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でひどくインデントされたコード再度インデントする


2
私はこれを試したところ(Vim 8.0)、正しく動作しませんでした。私の推測では、Cスクリプトのようにシェルスクリプトをインデントしようとしました。中括弧は正しく処理されましたが、ifand fiキーワードは処理されませんでした。おそらくいくつかのプラグインが必要ですか?
キーストンプソン、

実際には、設定する必要がありますfiletype=sh(またはft)。
リンフィッシュ

これはまったくうまくいきません。それは私の複雑なBashスクリプトを混乱させます。
Roel Van de Paar

2

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

shfmt -l -w script.sh

1
これで質問に答えることができるかもしれませんが、なぜそうするのかについての説明を提供できれば、より良い答えになります。たぶんあなたはそれをどのように使うかの例を与えることができますか?
DavidPostill

すごい!これはうまくいった!IDとして2つのスペースを使用したので、私のコマンドはshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

おそらく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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.