Shell-Skript erneut einrücken

17950
jsymolon

Ich habe ein großes Shell-Skript, das eine Mischung aus Leerzeichen und Registerkarten verwendet. Ich möchte die gesamte Datei basierend auf der Syntax wie beim Eclipse-Format erneut einrücken. Gibt es ein Programm (Verschönerung?), Das dies tut?

Es fällt mir schwer, die Logik herauszufinden, wenn alles zusammengeklemmt ist, zB

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

Ich habe gelernt, wie man Funktionen in Vim aufruft, aber das hat nicht funktioniert.

Emacs - alle Newlines verloren

9

4 Antworten auf die Frage

12
Grumbel

Emacs kann das:

  • Laden Sie die Datei in Emacs
  • drücken Sie Ctrl- spaceoben in der Datei
  • Bewegen Sie den Cursor zum Ende der Datei
  • drücken Sie Alt- Xund geben Sie untabifydann einreturn
  • drücken Sie Alt- Xund geben Sie indent-regiondann einreturn

Dadurch werden Tabulatoren entfernt und alles richtig eingerückt.

Wenn Sie dies öfter tun müssen und Emacs nicht als Editor verwenden, möchten Sie möglicherweise alles in ein Skript packen:

#!/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 ;; 
nicht wirklich ein emacs typ - aber wenn die super shell vim nicht funktioniert. Ich werde das versuchen. jsymolon vor 15 Jahren 1
"M->" ist die übliche Bindung für "Pufferende". Denn es ist böse, die Hände von der Tastatur zu nehmen. dmckee vor 15 Jahren 1
Das Markieren des gesamten Puffers kann auch mit "Cx h" durchgeführt werden, das den "Mark-Pufferspeicher" ausführt. Victor vor 11 Jahren 3
Brillant! Zwei Dinge: (i) Ich muss die Region nach "untabify" erneut auswählen, da alles nicht ausgewählt wird, und (2) war dies nicht immer nur im Menü? Es verdient es zu sein! alle_meije vor 6 Jahren 0
4
kenorb

Wenn Sie in Vi / Vim die richtige Dateisyntax ( :set syntax=sh) eingestellt haben, können Sie: gg=G(oder 1G=G) drücken, um die Einrückung der gesamten Datei zu korrigieren.

Hier ist der Befehl zum Formatieren der gesamten Datei:

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

Hinweis: Erstellen Sie ein Backup, bevor Sie den obigen Befehl ausführen.

Um die Formatierung zuerst zu testen, bearbeiten Sie die Datei in Vim und auszuführen: :norm gg=G.

Siehe auch: Erneutes Einrücken von falsch eingerücktem Code bei Vi SE

Ich habe es gerade ausprobiert (Vim 8.0) und es hat nicht richtig funktioniert. Meine Vermutung ist, dass versucht wurde, das Shell-Skript so einzurücken, als wäre es C-Code. es behandelte geschweifte Klammern korrekt, aber nicht die Schlüsselwörter "if" und "fi". Vielleicht ist ein Plugin erforderlich? Keith Thompson vor 6 Jahren 1
0
Carl

Sie wollen wahrscheinlich Super Shell Indent . Speichern Sie es in ~ / .vim / indent und wenn Sie das nächste Mal in vim sind, führen Sie es aus:source ~/.vim/indent/sh.vim

Sie möchten wahrscheinlich auch das dateibasierte intelligente Einrücken in .vimrc einrichten

" Turn on smart indenting filetype indent on set smartindent 

Wenn Sie nichts dagegen haben, dass sich vim mit Ihrer Formatierung beschäftigt, fügen Sie diese Zeile auch zu vimrc hinzu.

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

Wie auch immer, hier ist das, worauf Sie gewartet haben. Wenn Sie das nächste Mal ein Shell-Skript in vim bearbeiten, vorausgesetzt, Sie haben die intelligente Einrückung aktiviert und die Super-Shell-ID installiert, drücken Sie einfach die folgenden Tasten, um das Skript erneut anzuzeigen:gg=G

0
Daniel

Es sieht so aus, als könnte shfmt den Trick für Sie tun. Es formatiert Shell / Bash-Code, der Einrückungen enthält.

shfmt -l -w script.sh 
Obwohl dies die Frage beantworten kann, wäre es eine bessere Antwort, wenn Sie eine Erklärung liefern könnten, warum dies so ist. Pehaps können Sie ein Beispiel geben, wie man es benutzt? DavidPostill vor 6 Jahren 1