Shell-Skript erneut einrücken

11

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

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

   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 - hat alle Zeilenumbrüche verloren

jsymolon
quelle

Antworten:

13

Emacs kann das:

  • Laden Sie die Datei in Emacs
  • Presse Ctrl- spaceam Anfang der Datei
  • Bewegen Sie den Cursor an den unteren Rand der Datei
  • Drücken Sie Alt- Xund geben Sie untabifydann einreturn
  • Drücken Sie Alt- Xund geben Sie indent-regiondann einreturn

Dadurch werden Tabs entfernt und alles richtig eingerückt.

Wenn Sie dies häufiger 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 ;;
Grumbel
quelle
1
Nicht wirklich ein Emacs-Typ - aber wenn das Super-Shell-Vim nicht funktioniert. Ich werde das versuchen.
Jsymolon
1
M->ist die übliche Bindung für end-of-buffer. Weil es böse ist, die Hände von der Tastatur zu nehmen.
dmckee --- Ex-Moderator Kätzchen
3
Es kann auch das Markieren des gesamten Puffers erfolgen C-x h, der ausgeführt wird mark-whole-buffer.
Victor
Brillant! Zwei Dinge: (i) Ich muss die Region danach erneut auswählen, untabifyda alles nicht mehr ausgewählt wird, und (2) war dies nicht nur im Menü? Es hat es verdient!
alle_meije
5

Wenn Sie in Vi / Vim die richtige Dateisyntax ( :set syntax=sh) festgelegt haben, können Sie: gg=G(oder 1G=G) drücken , um den Einzug 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 eine Sicherungskopie, bevor Sie den obigen Befehl ausführen.

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

Siehe auch: Schlecht eingerückten Code bei Vi SE erneut einrücken

Kenorb
quelle
2
Ich habe es gerade versucht (Vim 8.0) und es hat nicht richtig funktioniert. Ich vermute, dass es versucht hat, das Shell-Skript einzurücken, als wäre es C-Code. Es behandelte geschweifte Klammern korrekt, aber nicht ifund fiSchlüsselwörter. Vielleicht ist ein Plugin erforderlich?
Keith Thompson
Eigentlich sollten Sie einstellen filetype=sh(oder ft).
Lingfish
Das funktioniert überhaupt nicht gut. Mein komplexes Bash-Skript wird durcheinander gebracht.
Roel Van de Paar
2

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
Daniel
quelle
1
Dies könnte zwar die Frage beantworten, aber es wäre eine bessere Antwort, wenn Sie eine Erklärung dafür liefern könnten . Vielleicht können Sie ein Beispiel geben, wie man es benutzt?
DavidPostill
GROSS! Das hat funktioniert! Ich habe zwei Leerzeichen als Ident verwendet, also war mein Befehlshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar
0

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

Sie möchten wahrscheinlich auch ein dateibasiertes intelligentes Einrücken in Ihrer .vimrc einrichten

" Turn on smart indenting
filetype indent on
set smartindent

Wenn es Ihnen nichts ausmacht, mit Ihrer Formatierung herumzuspielen, 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, worauf Sie gewartet haben. Wenn Sie das nächste Mal ein Shell-Skript in vim bearbeiten, drücken Sie einfach die folgenden Tasten, um Ihr Skript erneut einzubinden, vorausgesetzt, Sie haben Smart Indenting aktiviert und Super Shell Ident installiert.gg=G

Carl
quelle