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.