Повторный отступ сценария оболочки

17783
jsymolon

У меня есть большой сценарий оболочки, который использует смесь пробелов и табуляции. Я хочу переопределить весь файл на основе синтаксиса, такого как формат Eclipse. Есть ли программа (украсить?), Которая будет делать это?

Мне трудно разобраться в логике, когда все собрано вместе, например

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

Узнал, как вызывать функции в Vim, но это не сработало.

Emacs - потерял все новые строки

9

4 ответа на вопрос

12
Grumbel

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 ;; 
не совсем парень по emacs - но если супер оболочка vim не работает. Я попробую это. jsymolon 15 лет назад 1
`M->` - обычная привязка для `end-of-buffer`. Потому что отрывать руки от клавиатуры - зло. dmckee 15 лет назад 1
Также пометить весь буфер можно с помощью `Cx h`, который запускает` mark-whole-buffer`. Victor 11 лет назад 3
Brilliant! Две вещи: (i) я должен повторно выбрать регион после «untabify», так как все становится невыбранным, и (2) это не только использовалось, чтобы быть в меню? Это заслуживает того, чтобы быть! alle_meije 6 лет назад 0
4
kenorb

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

Я только что попробовал это (Vim 8.0), и он не работал правильно. Я предполагаю, что он пытался сделать отступ для сценария оболочки, как если бы он был C-кодом; он корректно обрабатывает фигурные скобки, но не ключевые слова `if` и` fi`. Возможно, какой-нибудь плагин требуется? Keith Thompson 6 лет назад 1
0
Carl

Вы, вероятно, хотите, чтобы отступ Super Shell . Сохраните его в ~ / .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, предполагая, что вы включили интеллектуальный отступ и установили супероболочку идентификатора, просто нажмите следующие клавиши, чтобы повторно сделать скрипт:gg=G

0
Daniel

Похоже, что shfmt может помочь вам. Он форматирует код оболочки / bash, который включает отступы.

shfmt -l -w script.sh 
Хотя это может ответить на вопрос, было бы лучше ответить, если бы вы могли дать какое-то объяснение ** почему ** это так. Может быть, вы можете привести пример, как его использовать? DavidPostill 6 лет назад 1

Похожие вопросы