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

11

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

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

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

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

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

jsymolon
источник

Ответы:

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

В 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.

kenorb
источник
2
Я только что попробовал это (Vim 8.0), и он не работал правильно. Я предполагаю, что он пытался сделать отступ для сценария оболочки, как если бы он был C-кодом; это правильно , но не обрабатываются фигурные скобки ifи fiключевые слова. Возможно, какой-нибудь плагин требуется?
Кит Томпсон
На самом деле, вы должны установить filetype=sh(или ft).
Lingfish
Это не очень хорошо работает. Это запутывает мой сложный скрипт Bash.
Роэль Ван де Паар
2

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

shfmt -l -w script.sh
Даниил
источник
1
Хотя это может ответить на вопрос, было бы лучше, если бы вы могли объяснить, почему это так. Возможно, вы можете привести пример, как его использовать?
DavidPostill
ВЕЛИКИЙ! Это сработало! Я использовал два пробела в качестве идентификатора, поэтому моя команда былаshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Роэль Ван де Паар
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, предполагая, что вы включили интеллектуальный отступ и установили супер-идентификатор оболочки, просто нажмите следующие клавиши, чтобы заново создать отступ для вашего сценария:gg=G

деревенщина
источник