Ri-rientra lo script della shell


11

Ho uno script di shell di grandi dimensioni che utilizza una combinazione di spazi e schede. Voglio reindirizzare l'intero file in base alla sintassi, come il formato di Eclipse. Esiste un programma (abbellire?) Che lo farà?

Sto facendo fatica a capire la logica con tutto inceppato ad es

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

Ho imparato a chiamare le funzioni in Vim ma non ha funzionato.

Emacs: ha perso tutte le nuove linee

Risposte:


13

Emacs può farlo:

  • carica il file in Emacs
  • premere Ctrl- spacenella parte superiore del file
  • sposta il cursore nella parte inferiore del file
  • premere Alt- Xe digitare untabifyquindireturn
  • premere Alt- Xe digitare indent-regionquindireturn

Questo eliminerà le schede e indenterà tutto correttamente.

Se devi farlo più spesso e non usi Emacs come editor, potresti voler comprimere tutto in uno 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 ;;

1
non proprio un ragazzo emacs - ma se il super shell vim non funziona. Ci proverò.
— jsymolon,

1
M->è il solito legame per end-of-buffer. Perché togliere le mani dalla tastiera è male.
— dmckee --- ex gattino moderatore,

3
È inoltre possibile contrassegnare l'intero buffer con C-x h, che viene eseguito mark-whole-buffer.
— Victor,

Brillante! Due cose: (i) devo selezionare nuovamente la regione dopo untabifyche tutto viene deselezionato, e (2) questo non è stato usato solo per essere nel menu? Merita di essere!
— alle_meije,

5

In Vi / Vim dopo aver impostato la sintassi del file corretta ( :set syntax=sh), è possibile premere: gg=G(o 1G=G) per correggere il rientro dell'intero file.

Ecco il comando per formattare l'intero file sul posto:

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

Nota: eseguire un backup prima di eseguire il comando sopra.

Per testare la formattazione prima, modificare il file in Vim ed eseguire: :norm gg=G.

Vedi anche: Ri-rientro del codice con rientro errato in Vi SE


2
Ho appena provato questo (Vim 8.0) e non ha funzionato correttamente. La mia ipotesi è che ha cercato di indentare lo script della shell come se fosse un codice C; ha gestito correttamente, ma non parentesi graffe ife file parole chiave. Forse è richiesto un plug-in?
— Keith Thompson,

In realtà, dovresti impostare filetype=sh(o ft).
— lingfish

Questo non funziona affatto bene. Fa un casino con la mia complessa sceneggiatura di Bash.
— Roel Van de Paar,

2

Sembra che shfmt potrebbe fare il trucco per te. Formatta il codice shell / bash, che include il rientro.

shfmt -l -w script.sh

1
Sebbene ciò possa rispondere alla domanda, sarebbe una risposta migliore se tu potessi fornire qualche spiegazione sul perché lo faccia. Forse puoi dare un esempio di come usarlo?
— DavidPostill

GRANDE! Questo ha funzionato! Ho usato due spazi come ident, quindi il mio comando erashfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
— Roel Van de Paar il

0

Probabilmente vuoi Super Indent Shell . Salvalo su ~ / .vim / indent e quando sarai il prossimo in vim, eseguilo:source ~/.vim/indent/sh.vim

Probabilmente vuoi anche impostare il rientro intelligente basato su file nel tuo .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

Se non ti dispiace vim pasticciare con la tua formattazione, aggiungi anche questa linea a vimrc.

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

Comunque, ecco cosa stavi aspettando. La prossima volta che modificherai uno script di shell in vim, supponendo che tu abbia attivato il rientro intelligente e installato l'ident di super shell, basta premere i seguenti tasti per rientrare nello script:gg=G

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.