重新缩进 shell 脚本

jsy*_*lon 11 linux indentation

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

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

   if [ "$CANCELLATION" ]
   then
   while test $num -gt 0
    do
    if [ "$cjb" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

学习了如何在 Vim 中调用函数,但这不起作用。

Emacs - 丢失了所有换行符

Gru*_*bel 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 ;;
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用 `Cx h` 来标记整个缓冲区,它运行 `mark-whole-buffer`。 (3认同)

ken*_*orb 6

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

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

ex +"set syn=sh" +"norm gg=G" -cwq foobar.sh
Run Code Online (Sandbox Code Playgroud)

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

为了测试在Vim的第一格式,编辑文件并运行::norm gg=G

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

  • 我刚试过这个(Vim 8.0),但它不能正常工作。我的猜测是它试图将 shell 脚本缩进,就好像它是 C 代码一样;它正确处理了大括号,但没有正确处理 `if` 和 `fi` 关键字。也许需要一些插件? (2认同)