पुनः इंडेंट शेल स्क्रिप्ट


11

मेरे पास एक बड़ी शेल स्क्रिप्ट है जो रिक्त स्थान और टैब के मिश्रण का उपयोग करती है। मैं सिंटैक्स पर आधारित संपूर्ण फ़ाइल को फिर से इंडेंट करना चाहता हूं, जैसे कि ग्रहण का प्रारूप। क्या कोई कार्यक्रम है (सुशोभित?) जो ऐसा करेगा।

मैं एक मुश्किल समय सब कुछ एक साथ जैसे उदाहरण के साथ तर्क लगा रहा हूँ

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

विम में कार्यों को कॉल करने का तरीका सीखा, लेकिन यह काम नहीं किया।

Emacs - सभी newlines खो दिया है

जवाबों:


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 लड़का नहीं है - लेकिन अगर सुपर शेल विम काम नहीं करता है। मैं कोशिश करूँगा कि
jsymolon

1
M->के लिए सामान्य बाध्यकारी है end-of-buffer। क्योंकि अपने हाथों को कीबोर्ड से हटाना बुराई है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

3
इसके अलावा पूरे बफर को चिह्नित किया जा सकता है C-x h, जो चलता है mark-whole-buffer
विक्टर

प्रतिभाशाली! दो बातें: (i) मुझे इस क्षेत्र का फिर से चयन करना है untabifyक्योंकि सबकुछ अचयनित हो जाने के बाद , और (2) इसका उपयोग केवल मेनू में होने के लिए नहीं हुआ? यह होने के योग्य है!
acc_meije

5

Vi / विम में आप सही फ़ाइल वाक्य रचना (निर्धारित किया है एक बार :set syntax=sh), तो आप भी दबा सकते हैं: gg=G(या 1G=G) पूरी फ़ाइल का सही खरोज करने के लिए।

यहाँ पूरी फ़ाइल को इन-फॉर्मेट करने का कमांड दिया गया है:

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

नोट: कमांड से ऊपर चलने से पहले बैकअप बना लें।

पहले स्वरूपण का परीक्षण करने के लिए, फ़ाइल को विम में संपादित करें और चलाएँ :norm gg=G:।

इसे भी देखें: वीई एसई पर बुरी तरह से इंडेंट किए गए कोड को फिर से इंडेंट करना


2
मैं सिर्फ यह (Vim 8.0) की कोशिश की और यह सही ढंग से काम नहीं किया। मेरा अनुमान है कि इसने शेल स्क्रिप्ट को इंडेंट करने की कोशिश की जैसे कि यह सी कोड हो; इसे सही ढंग से नहीं बल्कि घुंघराले ब्रेसिज़ संभाला ifऔर fiकीवर्ड। शायद कुछ प्लगइन की आवश्यकता है?
कीथ थॉम्पसन

दरअसल, आपको सेटिंग filetype=sh(या ft) होनी चाहिए ।
लिंगफिश

यह बिल्कुल भी अच्छा काम नहीं करता है। यह मेरे जटिल बैश स्क्रिप्ट की गड़बड़ी करता है।
Roel Van de Paar

2

ऐसा लगता है कि shfmt आपके लिए चाल कर सकता है। यह शेल / बैश कोड को प्रारूपित करता है, जिसमें इंडेंटेशन शामिल है।

shfmt -l -w script.sh

1
हालांकि यह प्रश्न का उत्तर दे सकता है, यह एक बेहतर उत्तर होगा यदि आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि ऐसा क्यों होता है। आप इसका उपयोग कैसे करें का एक उदाहरण दे सकते हैं?
DavidPostill

महान! यह काम किया! मैंने पहचान के रूप में दो स्थानों का उपयोग किया, इसलिए मेरी कमान थीshfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
रोएल वान डे पार

0

आप शायद सुपर शेल इंडेंट चाहते हैं । इसे ~ / .vim / indent में सहेजें और जब आप अगली बार 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

वैसे भी, यहाँ वही है जिसकी आप प्रतीक्षा कर रहे हैं। जब आप अगली बार शेल स्क्रिप्ट का संपादन कर रहे हों, तो यह मानते हुए कि आपने स्मार्ट इंडेंटिंग और सुपर शेल पहचान स्थापित की है, बस अपनी स्क्रिप्ट को रेंडर करने के लिए फॉलो कीज़ को हिट करें:gg=G

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.