重新缩进 shell 脚本

重新缩进 shell 脚本

我有一个大型 shell 脚本,其中混合使用了空格和制表符。我想根据语法(如 Eclipse 的格式)重新缩进整个文件。有没有可以做到这一点的程序(美化?)?

我很难弄清楚所有东西都挤在一起的逻辑,例如

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

学习了如何在 Vim 中调用函数,但是没有用。

Emacs - 丢失所有换行符

答案1

Emacs 可以做到这一点:

  • 将文件加载到 Emacs
  • 按文件顶部的Ctrl-space
  • 将光标移至文件底部
  • Alt-然后X输入untabifyreturn
  • Alt-然后X输入indent-regionreturn

这将删除制表符并正确缩进所有内容。

如果您需要更频繁地执行此操作并且不使用 Emacs 作为编辑器,则可能需要将其全部打包到脚本中:

#!/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 ;;

答案2

在 Vi/Vim 中,一旦您设置了正确的文件语法 ( :set syntax=sh),您就可以按:(gg=G1G=G)来纠正整个文件的缩进。

以下是就地格式化整个文件的命令:

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

注意:运行上述命令之前请先进行备份。

为了首先测试格式,请在 Vim 中编辑文件并运行::norm gg=G

也可以看看:重新缩进错误缩进的代码在 Vi SE

答案3

看起来像移動可以帮你解决问题。它格式化 shell/bash 代码,其中包括缩进。

shfmt -l -w script.sh

答案4

你可能想要超级壳牌压痕将其保存到 ~/.vim/indent 并在下次进入 vim 时执行:source ~/.vim/indent/sh.vim

你可能还想在 .vimrc 中设置基于文件的智能缩进

" Turn on smart indenting
filetype indent on
set smartindent

如果您不介意 vim 弄乱您的格式,也可以将这一行添加到 vimrc 中。

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

无论如何,这就是您一直在等待的。当您下次在 vim 中编辑 shell 脚本时,假设您已打开智能缩进并安装了 super shell ident,只需按下以下键即可重新缩进脚本:gg=G

相关内容