Re-recuar o script de shell


11

Eu tenho um script de shell grande que usa uma mistura de espaços e guias. Quero reentrar o arquivo inteiro com base na sintaxe, como o formato do Eclipse. Existe um programa (embelezar?) Que fará isso?

Estou tendo dificuldade em descobrir a lógica com tudo encravado, por exemplo

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

Aprendeu como chamar funções no Vim, mas isso não funcionou.

Emacs - perdeu todas as novas linhas

Respostas:


13

O Emacs pode fazer isso:

  • carrega o arquivo no Emacs
  • pressione Ctrl- spacena parte superior do arquivo
  • mova o cursor para a parte inferior do arquivo
  • de imprensa Alt- Xe tipo untabify, em seguida,return
  • de imprensa Alt- Xe tipo indent-region, em seguida,return

Isso vai se livrar das guias e recuar tudo corretamente.

Se você precisar fazer isso com mais frequência e não usar o Emacs como editor, convém agrupar tudo em um 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
não é realmente um cara do emacs - mas se o super shell vim não funcionar. Eu vou tentar isso.
jsymolon

1
M->é a ligação usual para end-of-buffer. Porque tirar as mãos do teclado é ruim.
dmckee --- ex-moderador gatinho

3
Também é possível marcar o buffer inteiro C-x h, que é executado mark-whole-buffer.
213 Victor Victor

Brilhante! Duas coisas: (i) eu tenho que selecionar novamente a região depois untabifyque tudo fica desmarcado e (2) isso não costumava estar apenas no menu? Merece ser!
Alle_meije 26/07/2018

5

No Vi / Vim, depois de definir a sintaxe correta do arquivo ( :set syntax=sh), você pode pressionar: gg=G(ou 1G=G) para corrigir o recuo do arquivo inteiro.

Aqui está o comando para formatar o arquivo inteiro no local:

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

Nota: Faça um backup antes de executar o comando acima.

Para testar a formatação primeiro, editar o arquivo no Vim e execute: :norm gg=G.

Veja também: Re-recuando código mal recuado no Vi SE


2
Eu apenas tentei isso (Vim 8.0) e não funcionou corretamente. Meu palpite é que ele tentou recuar o script de shell como se fosse código C; manipulou chaves corretamente, mas não ife fipalavras - chave. Talvez algum plugin seja necessário?
21418 Keith Thompson

Na verdade, você deve definir filetype=sh(ou ft).
precisa saber é o seguinte

Isso não funciona bem. Isso atrapalha meu script Bash complexo.
Roel Van de Paar

2

Parece que o shfmt pode fazer o truque para você. Ele formata o código shell / bash, que inclui recuo.

shfmt -l -w script.sh

1
Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação para isso. Talvez você possa dar um exemplo de como usá-lo?
DavidPostill

ÓTIMO! Isso funcionou! Eu usei dois espaços como ident, então meu comando foishfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

Você provavelmente quer o Super Shell Indent . Salve-o em ~ / .vim / indent e quando você for o próximo no vim, execute:source ~/.vim/indent/sh.vim

Você provavelmente também deseja configurar o recuo inteligente baseado em arquivo em seu arquivo .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

Se você não se importa de o vim mexer com sua formatação, adicione esta linha ao vimrc também.

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

Enfim, aqui está o que você estava esperando. Na próxima edição de um script de shell no vim, assumindo que você ativou o recuo inteligente e instalou o super shell ident, basta pressionar as seguintes teclas para reinserir o script:gg=G

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.