Kịch bản shell lại thụt


11

Tôi có một tập lệnh shell lớn sử dụng hỗn hợp các khoảng trắng và tab. Tôi muốn thụt lại toàn bộ tệp dựa trên cú pháp, như Định dạng của Eclipse. Có một chương trình (làm đẹp?) Sẽ làm điều này?

Tôi đang có một thời gian khó khăn để tìm ra logic với mọi thứ bị kẹt lại với nhau, vd

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

Đã học cách gọi các hàm trong Vim nhưng không được.

Emacs - mất tất cả các dòng mới

Câu trả lời:


13

Emacs có thể làm điều đó:

  • tải tập tin vào Emacs
  • nhấn Ctrl- spaceở đầu tập tin
  • di chuyển con trỏ xuống dưới cùng của tập tin
  • nhấn Alt- Xvà gõ untabifyrồireturn
  • nhấn Alt- Xvà gõ indent-regionrồireturn

Điều này sẽ thoát khỏi các tab và thụt lề mọi thứ đúng cách.

Nếu bạn cần làm điều này thường xuyên hơn và không sử dụng Emacs làm trình chỉnh sửa của mình, bạn có thể muốn đóng gói tất cả thành một tập lệnh:

#!/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
không thực sự là một anh chàng emacs - nhưng nếu vim siêu vỏ không hoạt động. Tôi sẽ thử điều đó.
jsymolon

1
M->là ràng buộc thông thường cho end-of-buffer. Bởi vì lấy tay ra khỏi bàn phím là xấu xa.
dmckee --- ex-moderator mèo con

3
Cũng đánh dấu toàn bộ bộ đệm có thể được thực hiện với C-x h, chạy mark-whole-buffer.
Victor

Xuất sắc! Hai điều: (i) Tôi phải chọn lại khu vực sau khi untabifymọi thứ không được chọn và (2) đã làm điều này không chỉ sử dụng để có trong menu? Nó xứng đáng được!
alle_meije

5

Trong Vi / Vim khi bạn đã đặt đúng cú pháp tệp ( :set syntax=sh), bạn có thể nhấn: gg=G(hoặc 1G=G) để sửa lỗi thụt lề của toàn bộ tệp.

Đây là lệnh để định dạng toàn bộ tập tin tại chỗ:

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

Lưu ý: Tạo một bản sao lưu trước khi chạy lệnh trên.

Để kiểm tra định dạng trước, hãy chỉnh sửa tệp trong Vim và chạy : :norm gg=G.

Xem thêm: Tái thụt mã thụt lề xấu tại Vi SE


2
Tôi mới thử cái này (Vim 8.0) và nó không hoạt động chính xác. Tôi đoán là nó đã cố gắng thụt vào tập lệnh shell như thể nó là mã C; nó xử lý các dấu ngoặc nhọn chính xác nhưng không iffitừ khóa. Có lẽ một số plugin là cần thiết?
Keith Thompson

Trên thực tế, bạn nên thiết lập filetype=sh(hoặc ft).
cá lăng

Điều này không hoạt động tốt cả. Nó làm cho một mớ hỗn độn của kịch bản Bash phức tạp của tôi.
Roel Van de Paar

2

Có vẻ như shfmt có thể làm điều đó cho bạn. Nó định dạng mã shell / bash, bao gồm thụt lề.

shfmt -l -w script.sh

1
Trong khi điều này có thể trả lời câu hỏi, nó sẽ là một câu trả lời tốt hơn nếu bạn có thể cung cấp một số lời giải thích tại sao nó làm như vậy. Pehaps bạn có thể cho một ví dụ về cách sử dụng nó?
DavidPostill

TUYỆT QUÁ! Điều này đã làm việc! Tôi đã sử dụng hai khoảng trắng làm định danh, vì vậy lệnh của tôi làshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

Bạn có thể muốn Super Shell Indent . Lưu nó vào ~ / .vim / thụt lề và khi bạn tiếp theo trong vim, hãy thực thi:source ~/.vim/indent/sh.vim

Bạn cũng có thể muốn thiết lập tệp dựa trên thụt lề thông minh trong .vimrc của bạn

" Turn on smart indenting
filetype indent on
set smartindent

Nếu bạn không nhớ vim lộn xộn với định dạng của mình, hãy thêm dòng này vào vimrc.

" When you load/save a shell script, auto indent it
autocmd BufRead,BufWritePre *.sh normal gg=G

Dù sao, đây là những gì bạn đã chờ đợi. Khi bạn tiếp tục chỉnh sửa tập lệnh shell trong vim, giả sử bạn đã bật thụt lề thông minh và cài đặt siêu nhận dạng shell, chỉ cần nhấn các phím theo dõi để giới thiệu lại tập lệnh của bạn:gg=G

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.