Powtórz wcięcie skryptu powłoki

11

Mam duży skrypt powłoki, który używa kombinacji spacji i tabulatorów. Chcę ponownie wciąć cały plik na podstawie składni, na przykład Format Eclipse. Czy istnieje program (upiększający?), Który to zrobi?

Trudno mi zrozumieć logikę, gdy wszystko jest ze sobą zablokowane, np

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

Nauczył się, jak wywoływać funkcje w Vimie, ale to nie działało.

Emacs - stracił wszystkie nowe linie

jsymolon
źródło

Odpowiedzi:

13

Emacs może to zrobić:

  • załaduj plik do Emacsa
  • naciśnij Ctrl- spaceu góry pliku
  • przesuń kursor na dół pliku
  • naciśnij Alt- Xi wpisz untabifynastępniereturn
  • naciśnij Alt- Xi wpisz indent-regionnastępniereturn

Spowoduje to pozbycie się zakładek i właściwe wcięcie wszystkiego.

Jeśli musisz to robić częściej i nie używasz Emacsa jako edytora, możesz spakować wszystko do skryptu:

#!/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
źródło
1
tak naprawdę nie jest facetem emacsa - ale jeśli vim super shell nie działa. Spróbuję tego.
jsymolon
1
M->jest zwykłym obowiązkiem dla end-of-buffer. Ponieważ zdejmowanie rąk z klawiatury jest złe.
dmckee --- były moderator kociak
3
Można również oznaczyć cały bufor C-x h, który działa mark-whole-buffer.
Victor
Znakomity! Dwie rzeczy: (i) po czym muszę ponownie wybrać region, untabifyponieważ wszystko jest niezaznaczone, i (2) czy to nie tylko kiedyś znajdowało się w menu? Zasługuje na to!
alle_meije
5

W Vi / Vim po ustawieniu poprawnej składni pliku ( :set syntax=sh) możesz nacisnąć: gg=G(lub 1G=G), aby poprawić wcięcie całego pliku.

Oto polecenie formatowania całego pliku w miejscu:

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

Uwaga: wykonaj kopię zapasową przed uruchomieniem powyższej komendy.

Aby przetestować formatowanie pierwsze, należy edytować plik w vim i uruchomić: :norm gg=G.

Zobacz także: Ponowne wcięcie źle wciętego kodu w Vi SE

kenorb
źródło
2
Właśnie próbowałem tego (Vim 8.0) i to nie działało poprawnie. Domyślam się, że próbował wciąć skrypt powłoki tak, jakby to był kod C; to obchodzić nawiasów klamrowych poprawnie, ale nie ifi fisłowa kluczowe. Być może wymagana jest wtyczka?
Keith Thompson
Właściwie powinieneś ustawić filetype=sh(lub ft).
lingfish
To w ogóle nie działa dobrze. Robi bałagan w moim złożonym skrypcie Bash.
Roel Van de Paar
2

Wygląda na to, że shfmt może załatwić sprawę . Formatuje kod powłoki / bash, który obejmuje wcięcia.

shfmt -l -w script.sh
Daniel
źródło
1
Chociaż może to odpowiedzieć na pytanie, lepszym rozwiązaniem byłoby podanie wyjaśnienia, dlaczego tak się dzieje. Może możesz podać przykład, jak z niego korzystać?
DavidPostill
ŚWIETNY! To zadziałało! Użyłem dwóch spacji jako identyfikatora, więc moim poleceniem byłoshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar,
0

Prawdopodobnie chcesz wcięcia Super Shell . Zapisz go w ~ / .vim / indent, a kiedy będziesz następny w vimie, uruchom:source ~/.vim/indent/sh.vim

Prawdopodobnie zechcesz również skonfigurować inteligentne wcięcie w pliku w .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

Jeśli nie masz nic przeciwko vimowi bałaganowaniu przy formatowaniu, dodaj również ten wiersz do vimrc.

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

W każdym razie oto, na co czekałeś. Kiedy następnym razem edytujesz skrypt powłoki w vimie, zakładając, że włączyłeś inteligentne wcięcia i zainstalowałeś identyfikator super powłoki, po prostu naciśnij następujące klawisze, aby ponownie uruchomić skrypt:gg=G

Carl
źródło