Volver a sangrar script de shell

11

Tengo un script de shell grande que usa una mezcla de espacios y pestañas. Quiero volver a sangrar todo el archivo según la sintaxis, como el formato de Eclipse. ¿Hay un programa (embellecer?) Que hará esto?

Me está costando entender la lógica con todo atascado, p. Ej.

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

Aprendí a llamar a funciones en Vim pero eso no funcionó.

Emacs: perdió todas las nuevas líneas

jsymolon
fuente

Respuestas:

13

Emacs puede hacer eso:

  • cargar el archivo en Emacs
  • presione Ctrl- spaceen la parte superior del archivo
  • mueve el cursor al final del archivo
  • presione Alt- Xy untabifyluego escribareturn
  • presione Alt- Xy indent-regionluego escribareturn

Esto eliminará las pestañas e indentará todo correctamente.

Si necesita hacer esto con más frecuencia y no usa Emacs como editor, es posible que desee empaquetarlo todo en 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
fuente
1
no es realmente un chico emacs, pero si el super shell vim no funciona. Lo intentaré
jsymolon
1
M->es el enlace habitual para end-of-buffer. Porque quitar las manos del teclado es malo.
dmckee --- ex-gatito moderador
3
También se puede marcar todo el búfer C-x h, que se ejecuta mark-whole-buffer.
Victor
¡Brillante! Dos cosas: (i) tengo que volver a seleccionar la región después, untabifyya que todo no se selecciona, y (2) ¿esto no solo solía estar también en el menú? Se merece ser!
alle_meije
5

En Vi / Vim una vez que haya establecido la sintaxis correcta del archivo ( :set syntax=sh), puede presionar: gg=G(o 1G=G) para corregir la sangría de todo el archivo.

Aquí está el comando para formatear todo el archivo en el lugar:

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

Nota: Realice una copia de seguridad antes de ejecutar el comando anterior.

Para probar primero el formato, editar el archivo en Vim y ejecute: :norm gg=G.

Ver también: Re-sangrado de código mal sangrado en Vi SE

kenorb
fuente
2
Acabo de probar esto (Vim 8.0) y no funcionó correctamente. Supongo que trató de sangrar el script de shell como si fuera un código C; que maneja las llaves correctamente pero no ify fipalabras clave. Tal vez se requiere algún complemento?
Keith Thompson
En realidad, deberías estar configurando filetype=sh(o ft).
lingfish
Esto no funciona bien en absoluto. Hace un desastre mi complejo script Bash.
Roel Van de Paar
2

Parece que shfmt podría hacer el truco por ti. Formatea el código shell / bash, que incluye sangría.

shfmt -l -w script.sh
Daniel
fuente
1
Si bien esto puede responder la pregunta, sería una mejor respuesta si pudiera proporcionar alguna explicación de por qué lo hace. ¿Quizás puedas dar un ejemplo de cómo usarlo?
DavidPostill
¡ESTUPENDO! Esto funcionó! Usé dos espacios como ident, así que mi comando fueshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar
0

Probablemente quieras Super Shell Indent . Guárdelo en ~ / .vim / indent y cuando sea el próximo en vim, ejecute:source ~/.vim/indent/sh.vim

También es probable que desee configurar una sangría inteligente basada en archivos en su .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

Si no le importa que vim juegue con su formato, agregue esta línea también a vimrc.

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

De todos modos, esto es lo que has estado esperando. La próxima vez que edite una secuencia de comandos de shell en vim, suponiendo que haya activado la sangría inteligente e instalado la identificación de super shell, simplemente presione las siguientes teclas para reiniciar su secuencia de comandos:gg=G

Carl
fuente