Сценарій оболонки повторного відступу


11

У мене є великий сценарій оболонки, який використовує суміш пробілів і вкладок. Я хочу повторно відступити весь файл на основі синтаксису, як-от Формат Eclipse. Чи є програма (прикрасити?), Яка це зробить?

Мені важко розібратися в логіці, коли все заклинило, наприклад

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

Дізналися, як викликати функції у Vim, але це не спрацювало.

Emacs - втратили всі нові рядки

Відповіді:


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 хлопець - але якщо супер оболонка vim не працює. Я спробую це.
jsymolon

1
M->є звичайним зв'язуванням для end-of-buffer. Тому що зняти руки з клавіатури - це зло.
dmckee

3
Також можна зробити маркування всього буфера C-x h, який працює mark-whole-buffer.
Віктор

Блискуче! Дві речі: (i) мені доведеться повторно вибрати регіон після того, untabifyяк все не буде вибрано, і (2) це не просто використовувалося, щоб бути в меню також? Це заслуговує!
alle_meije

5

Після того, як ви встановили правильний синтаксис файлу ( :set syntax=sh), ви можете натиснути: gg=G(або 1G=G), щоб виправити відступ усього файлу.

Ось команда відформатувати весь файл на місці:

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

Примітка: Створіть резервну копію перед запуском над командою.

Щоб перевірити форматування першим, редагувати файл в Vim і виконайте команду: :norm gg=G.

Дивіться також: Повторне відступ коду з відступом на Vi SE


2
Я просто спробував це (Vim 8.0), і він не працював правильно. Я здогадуюсь, що він намагався відступити скрипт оболонки так, ніби це був код C; він обробляв фігурні фігурні дужки правильно, але не, ifта fiключові слова Можливо, потрібен якийсь плагін?
Кіт Томпсон

Насправді вам слід налаштувати filetype=sh(або ft).
lingfish

2

Схоже, shfmt може зробити для вас трюк. Він форматує код shell / bash, який включає відступ.

shfmt -l -w script.sh

1
Хоча це може відповісти на питання, було б кращою відповіддю, якщо ви могли б дати пояснення, чому це так. Можливо, ви можете навести приклад, як ним користуватися?
DavidPostill

0

Ви, мабуть, хочете відступ 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.