15

I have a large shell script that uses a mixture of spaces and tabs. I want to re-indent the whole file based on syntax, like Eclipse's Format. Is there a program (beautify ?) that will do this ?

I'm having a hard time figuring out the logic with everything jammed together e.g.

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

Learned how to call functions in Vim but that didn't work.

Emacs - lost all the newlines

jsymolon
  • 296

4 Answers4

14

Emacs can do that:

  • load the file into Emacs
  • press Ctrl-space at the top of the file
  • move the cursor to the bottom of the file
  • press Alt-X and type untabify then return
  • press Alt-X and type indent-region then return

This will get rid of tabs and indent everything properly.

If you need to do this more often and do not use Emacs as your editor, you might want to pack it all into a 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 ;;
phuclv
  • 30,396
  • 15
  • 136
  • 260
Grumbel
  • 3,782
8

In Vi/Vim once you've set the correct file syntax (:set syntax=sh), you can press: gg=G (or 1G=G) to correct indentation of the entire file.

Here is the command to format the whole file in-place:

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

Note: Make a backup before running above command.

To test the formatting first, edit the file in Vim and run: :norm gg=G.

See also: Re-indenting badly indented code at Vi SE

kenorb
  • 26,615
3

It looks like shfmt could do the trick for you. It formats shell/bash code, which includes indentation.

shfmt -l -w script.sh
Daniel
  • 31
0

You probably want Super Shell Indent. Save it to ~/.vim/indent and when you're next in vim, execute :source ~/.vim/indent/sh.vim

You also probably want to setup file based smart indenting in your .vimrc

" Turn on smart indenting
filetype indent on
set smartindent

If you don't mind vim messing with your formatting, add this line to vimrc too.

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

Anyway, here is what you've been waiting for. When you're next editing a shell script in vim, assuming you've turned on smart indenting and installed super shell ident, just hit the follow keys to reindent your script: gg=G

Carl
  • 147
  • 8