เชลล์สคริปต์อีกครั้งเยื้อง


11

ฉันมีเชลล์สคริปต์ขนาดใหญ่ที่ใช้การผสมผสานของช่องว่างและแท็บ ฉันต้องการเยื้องไฟล์ทั้งหมดอีกครั้งตามไวยากรณ์เช่นรูปแบบของ Eclipse มีโปรแกรม (บรรเจิด) ที่จะทำเช่นนี้?

ฉันมีเวลายากในการหาตรรกะกับทุกสิ่งที่ติดกันเช่น

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

เรียนรู้วิธีเรียกใช้ฟังก์ชันใน Vim แต่ไม่ได้ผล

Emacs - สูญเสียบรรทัดใหม่ทั้งหมด

คำตอบ:


13

Emacs สามารถทำได้:

  • โหลดไฟล์ลงใน Emacs
  • กดCtrl- spaceที่ด้านบนของไฟล์
  • เลื่อนเคอร์เซอร์ไปที่ด้านล่างของไฟล์
  • กดAlt- แล้วXพิมพ์untabifyreturn
  • กดAlt- แล้วXพิมพ์indent-regionreturn

สิ่งนี้จะกำจัดแท็บและเยื้องทุกอย่างอย่างถูกต้อง

หากคุณต้องการทำสิ่งนี้บ่อยขึ้นและไม่ได้ใช้ 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 จริงๆ - แต่ถ้า super shell vim ใช้งานไม่ได้ ฉันจะลองดู
jsymolon

1
M->end-of-bufferเป็นปกติผูกพัน เพราะการยกมือของคุณออกจากคีย์บอร์ดเป็นสิ่งที่ชั่วร้าย
dmckee --- ผู้ดูแลอดีตลูกแมว

3
นอกจากนี้ยังมีการทำเครื่องหมายบัฟเฟอร์ทั้งหมดสามารถทำได้ด้วยซึ่งวิ่งC-x h mark-whole-buffer
Victor

ยอดเยี่ยม! สองสิ่ง: (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

หมายเหตุ: ทำการสำรองข้อมูลก่อนที่จะใช้คำสั่งดังกล่าวข้างต้น

:norm gg=Gเพื่อทดสอบการจัดรูปแบบครั้งแรกในการแก้ไขไฟล์ที่เป็นกลุ่มและการทำงาน:

ดูเพิ่มเติม: การเยื้องรหัสเยื้องที่ไม่ดีที่ Vi SE


2
ฉันเพิ่งลองสิ่งนี้ (Vim 8.0) และมันทำงานไม่ถูกต้อง ฉันเดาว่ามันพยายามที่จะเยื้องเชลล์สคริปต์ราวกับว่ามันเป็นรหัส C; มันจัดการวงเล็บปีกกาอย่างถูกต้อง แต่ไม่ifและfiคำหลัก อาจจำเป็นต้องใช้ปลั๊กอินบางอย่าง?
Keith Thompson

ที่จริงแล้วคุณควรจะตั้งค่าfiletype=sh(หรือft)
lingfish

มันใช้งานไม่ได้เลย มันทำให้สับสนของสคริปต์ Bash ที่ซับซ้อนของฉัน
Roel Van de Paar

2

ดูเหมือนว่าshfmtสามารถทำเคล็ดลับให้คุณได้ มันจัดรูปแบบเชลล์ / รหัสทุบตีซึ่งรวมถึงการเยื้อง

shfmt -l -w script.sh

1
ขณะนี้อาจตอบคำถามที่ว่ามันจะเป็นคำตอบที่ดีหากคุณสามารถให้คำอธิบายบางเหตุผลที่มันไม่ให้ บางทีคุณอาจให้ตัวอย่างของวิธีใช้
DavidPostill

ที่ดี! สิ่งนี้ได้ผล! ฉันใช้สองช่องว่างเป็น ident ดังนั้นคำสั่งของฉันคือshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

คุณอาจต้องการซูเปอร์เชลล์เยื้อง บันทึกลงใน ~ / .vim / เยื้องและเมื่อคุณถัดไปเป็นกลุ่มให้ดำเนินการ:source ~/.vim/indent/sh.vim

คุณอาจต้องการเซ็ตอัพไฟล์ตามสมาร์ทเยื้องใน. vimrc ของคุณ

" Turn on smart indenting
filetype indent on
set smartindent

หากคุณไม่สนใจเรื่องการจัดรูปแบบของคุณให้เพิ่มบรรทัดนี้ลงใน vimrc ด้วย

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

อย่างไรก็ตามนี่คือสิ่งที่คุณรอคอย เมื่อคุณแก้ไขเชลล์สคริปต์ในกลุ่มถัดไปโดยสมมติว่าคุณเปิดการเยื้องสมาร์ทและติดตั้ง super shell ident เพียงกดปุ่มติดตามเพื่อใส่สคริปต์ของคุณอีกครั้ง:gg=G

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.