Réécriture du script shell

11

J'ai un grand script shell qui utilise un mélange d'espaces et de tabulations. Je veux ré-indenter le fichier entier basé sur la syntaxe, comme le format d'Eclipse. Existe-t-il un programme (embellir?) Qui fera cela?

J'ai du mal à comprendre la logique avec tout ce qui est coincé, par exemple

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

J'ai appris à appeler des fonctions dans Vim mais cela n'a pas fonctionné.

Emacs - a perdu toutes les nouvelles lignes

jsymolon
la source

Réponses:

13

Emacs peut le faire:

  • charger le fichier dans Emacs
  • appuyez sur Ctrl- spaceen haut du fichier
  • déplacer le curseur en bas du fichier
  • appuyez sur Alt- Xet tapez untabifyensuitereturn
  • appuyez sur Alt- Xet tapez indent-regionensuitereturn

Cela supprimera les onglets et mettra tout en retrait correctement.

Si vous devez le faire plus souvent et que vous n'utilisez pas Emacs comme éditeur, vous souhaiterez peut-être tout regrouper dans un script:

#!/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
la source
1
pas vraiment un gars emacs - mais si le super shell vim ne fonctionne pas. Je vais essayer ça.
jsymolon
1
M->est la liaison habituelle pour end-of-buffer. Parce que retirer vos mains du clavier est mauvais.
dmckee --- chaton ex-modérateur
3
Il est également possible de marquer l'intégralité du tampon C-x h, qui s'exécute mark-whole-buffer.
Victor
Brillant! Deux choses: (i) je dois resélectionner la région après untabifyque tout soit désélectionné, et (2) cela ne servait-il pas simplement à être également dans le menu? Ça mérite de l'être!
alle_meije
5

Dans Vi / Vim une fois que vous avez défini la syntaxe de fichier correcte ( :set syntax=sh), vous pouvez appuyer sur:gg=G (ou 1G=G) pour corriger l'indentation de l'ensemble du fichier.

Voici la commande pour formater l'intégralité du fichier sur place:

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

Remarque: effectuez une sauvegarde avant d'exécuter la commande ci-dessus.

Pour tester d'abord la mise en forme, modifiez le fichier dans Vim et exécutez: :norm gg=G .

Voir aussi: Ré-indentation de code mal indenté chez Vi SE

Kenorb
la source
2
Je viens d'essayer cela (Vim 8.0) et cela n'a pas fonctionné correctement. Je suppose qu'il a essayé de mettre en retrait le script shell comme s'il s'agissait de code C; il a traité des accolades correctement mais pas ifet fimots - clés. Peut-être qu'un plugin est nécessaire?
Keith Thompson
En fait, vous devez définir filetype=sh(ou ft).
lingfish
Cela ne fonctionne pas bien du tout. Cela gâche mon script Bash complexe.
Roel Van de Paar
2

Il semble que shfmt puisse faire l'affaire pour vous. Il formate le code shell / bash, qui comprend l'indentation.

shfmt -l -w script.sh
Daniel
la source
1
Bien que cela puisse répondre à la question, ce serait une meilleure réponse si vous pouviez expliquer pourquoi . Peut-être pouvez-vous donner un exemple d'utilisation?
DavidPostill
GÉNIAL! Ça a marché! J'ai utilisé deux espaces comme ident, donc ma commande étaitshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar
0

Vous voulez probablement Super Shell Indent . Enregistrez-le dans ~ / .vim / indent et lorsque vous serez le prochain dans vim, exécutez:source ~/.vim/indent/sh.vim

Vous souhaitez également probablement configurer une indentation intelligente basée sur des fichiers dans votre .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

Si cela ne vous dérange pas que vim joue avec votre mise en forme, ajoutez également cette ligne à vimrc.

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

Bref, voici ce que vous attendiez. Lorsque vous éditez ensuite un script shell dans vim, en supposant que vous avez activé le retrait intelligent et installé le super identifiant shell, appuyez simplement sur les touches suivantes pour réindenter votre script:gg=G

Carl
la source