重新缩进shell脚本


11

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

我很难弄清所有东西混杂在一起的逻辑,例如

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

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

Emacs-失去了所有换行符

Answers:


13

Emacs可以做到:

  • 将文件加载到Emacs
  • Ctrl- space文件顶部
  • 将光标移到文件底部
  • Alt- X和类型untabify,然后return
  • Alt- X和类型indent-region,然后return

这将摆脱标签并适当缩进所有内容。

如果您需要更频繁地执行此操作并且不使用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 ;;

1
不是真正的emacs家伙-但是超级shell vim无法正常工作。我会尝试的。
jsymolon

1
M->是的常用绑定end-of-buffer。因为从键盘上拿开手是邪恶的。
dmckee ---前主持人小猫,

3
也标志着整个缓冲区是可以做到的C-x h,它运行mark-whole-buffer
维克多

辉煌!两件事:(i)在untabify所有内容均未选中之后,我必须重新选择区域;以及(2)这不仅用于菜单吗?值得成为!
alle_meije

5

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

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

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

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

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

另请参见:在Vi SE中重新缩进严重缩进的代码


2
我只是尝试了此(Vim 8.0),但无法正常工作。我的猜测是,它试图将shell脚本缩进为C代码。它正确但不办理大括号iffi关键字。也许需要一些插件?
基思·汤普森

实际上,您应该进行设置filetype=sh(或ft)。
lingfish

这根本无法正常工作。它弄乱了我复杂的Bash脚本。
Roel Van de Paar,

2

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

shfmt -l -w script.sh

1
虽然这可以回答问题,但是如果您可以提供解释为什么会这样做会更好。也许您可以举一个使用它的例子?
DavidPostill

大!这工作了!我使用两个空格作为标识,所以我的命令是shfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

您可能需要Super Shell Indent。将其保存到〜/ .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脚本时,假设您已打开智能缩进并安装了超级shell ident,只需按以下键即可重新缩进脚本:gg=G

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.