Re-indentasi skrip shell


11

Saya memiliki skrip shell besar yang menggunakan campuran spasi dan tab. Saya ingin inden kembali seluruh file berdasarkan sintaks, seperti Format Eclipse. Apakah ada program (mempercantik?) Yang akan melakukan ini?

Saya mengalami kesulitan mencari tahu logika dengan semuanya macet bersama misalnya

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

Mempelajari cara memanggil fungsi di Vim tetapi itu tidak berhasil.

Emacs - kehilangan semua baris baru

Jawaban:


13

Emacs dapat melakukan itu:

  • memuat file ke Emacs
  • tekan Ctrl- spacedi bagian atas file
  • pindahkan kursor ke bagian bawah file
  • press Alt- Xdan jenis untabifykemudianreturn
  • press Alt- Xdan jenis indent-regionkemudianreturn

Ini akan menghilangkan tab dan membuat indentasi semuanya dengan benar.

Jika Anda perlu melakukan ini lebih sering dan tidak menggunakan Emacs sebagai editor Anda, Anda mungkin ingin memasukkan semuanya ke dalam skrip:

#!/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
bukan benar-benar seorang cowok emacs - tetapi jika vim shell super tidak bekerja. Saya akan mencobanya.
jsymolon

1
M->adalah pengikat yang biasa untuk end-of-buffer. Karena melepas tangan Anda dari keyboard itu jahat.
dmckee --- ex-moderator kitten

3
Juga menandai seluruh buffer dapat dilakukan dengan C-x h, yang berjalan mark-whole-buffer.
Victor

Cemerlang! Dua hal: (i) Saya harus memilih kembali daerah setelah untabifysemuanya menjadi tidak dipilih, dan (2) apakah ini tidak hanya digunakan untuk berada di menu juga? Layak untuk menjadi!
alle_meije

5

Di Vi / Vim setelah Anda mengatur sintaks file yang benar ( :set syntax=sh), Anda dapat menekan: gg=G(atau 1G=G) untuk memperbaiki indentasi seluruh file.

Berikut adalah perintah untuk memformat seluruh file di tempat:

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

Catatan: Buat cadangan sebelum menjalankan perintah di atas.

Untuk menguji format pertama, mengedit file dalam Vim dan jalankan: :norm gg=G.

Lihat juga: Mengindeks ulang kode yang indentasi buruk di Vi SE


2
Saya baru saja mencoba ini (Vim 8.0) dan tidak berfungsi dengan benar. Dugaan saya adalah ia mencoba membuat indentasi skrip shell seolah-olah itu adalah kode C; itu menangani kurung kurawal dengan benar tetapi tidak ifdan fikata kunci. Mungkin diperlukan beberapa plugin?
Keith Thompson

Sebenarnya, Anda harus mengatur filetype=sh(atau ft).
lingfish

Ini tidak bekerja sama sekali. Itu membuat berantakan skrip Bash kompleks saya.
Roel Van de Paar

2

Sepertinya shfmt bisa melakukan trik untuk Anda. Ini memformat kode shell / bash, yang mencakup lekukan.

shfmt -l -w script.sh

1
Meskipun ini mungkin menjawab pertanyaan, itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan penjelasan mengapa itu bisa terjadi. Mungkin Anda bisa memberikan contoh cara menggunakannya?
DavidPostill

BAGUS! Ini berhasil! Saya menggunakan dua spasi sebagai ident, jadi perintah saya adalahshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

Anda mungkin menginginkan Super Shell Indent . Simpan ke ~ / .vim / indent dan ketika Anda berikutnya di vim, jalankan:source ~/.vim/indent/sh.vim

Anda juga mungkin ingin mengatur indentasi file berbasis di .vimrc Anda

" Turn on smart indenting
filetype indent on
set smartindent

Jika Anda tidak keberatan vim mengacaukan pemformatan Anda, tambahkan baris ini ke vimrc juga.

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

Bagaimanapun, inilah yang Anda tunggu-tunggu. Saat Anda selanjutnya mengedit skrip shell di vim, dengan asumsi Anda telah mengaktifkan indentasi pintar dan menginstal super shell ident, cukup tekan tombol ikuti untuk memasang kembali skrip Anda:gg=G

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.