我有一个大型 shell 脚本,其中混合使用了空格和制表符。我想根据语法(如 Eclipse 的格式)重新缩进整个文件。有没有可以做到这一点的程序(美化?)?
我很难弄清楚所有东西都挤在一起的逻辑,例如
if [ "$CANCELLATION" ]
then
while test $num -gt 0
do
if [ "$cjb" -gt 0 ]
学习了如何在 Vim 中调用函数,但是没有用。
Emacs - 丢失所有换行符
答案1
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 ;;
答案2
在 Vi/Vim 中,一旦您设置了正确的文件语法 ( :set syntax=sh
),您就可以按:(gg=G或1G=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