सभी लंबित कोष्ठकों को बंद करना


14

लिस्प कोड लिखते समय, कभी-कभी मैं एक नेस्टेड अभिव्यक्ति में गहरा होता हूं और मैं चाहता हूं कि सभी लापता समापन कोष्ठक सम्मिलित करें। अभी मैं उन्हें केवल तब तक सम्मिलित कर रहा हूं जब तक कि मुझे एक बेमेल पैरेल नहीं मिल जाता, लेकिन यह बहुत कुशल नहीं है।
क्या सभी लापता कोष्ठकों को सम्मिलित करने की कोई आज्ञा है?

FYI करें, मैं स्मार्टपैरेन्स का उपयोग कर रहा हूँ स्वचालित रूप से मिलान वाले पार्न्स को सम्मिलित करने के लिए। फिर भी, कभी-कभी मुझे ऐसा करने की ज़रूरत होती है।


2
एफडब्ल्यूआईडब्ल्यू, फ्रांज लिस्प (सीएल से पहले) में एक सुविधा थी जहां आप ]सुपर अनुरोध के रूप में कार्य करते हैं, जो आपके अनुरोध के अनुसार सभी खुले पार्न को बंद करते हैं।
ड्रू

2
मैंने अतीत में समान कार्यप्रणाली का उपयोग किया है। तब से मैंने पैराडिट का उपयोग करना शुरू कर दिया है , जो शुरू होने से पहले समस्या को रोकता है। केवल चेतावनी यह है कि कोड में चिपकाने से एक ही संतुलन उपचार नहीं होता है।
एलारसन

जवाबों:


6

यहां एक फ़ंक्शन है जो सभी अप्रयुक्त कोष्ठकों और अन्य मिलान किए गए जोड़े को बंद करता है। यह Emacs के सेक्सप पार्सिंग पर निर्भर करता है। यह केवल एकल-वर्ण मिलान वाले जोड़े का समर्थन करता है, इसलिए ऐसा कुछ {-बंद हो जाएगा }, नहीं -}। लिस्प के लिए, इससे कोई फर्क नहीं पड़ता।

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

IIUC, इसके लिए यह आवश्यक है कि बिंदु मिलान किए गए कोष्ठक के किसी भी सेट के अंदर न हो। मैं इस धारणा के तहत था कि OQ को एक लिस्प अभिव्यक्ति के अंदर से काम करने की आवश्यकता है, जहां किए गए कोष्ठक बेमेल हो जाएंगे या अन्य नहीं करेंगे।
मालाबार

@ मलबर्बा यह सभी पहले से खोले गए कोष्ठकों को बंद कर देता है, चाहे वे बिंदु के बाद पहले से मेल खाते हुए कोष्ठक हों या नहीं। मैं इस सवाल को कैसे समझ सकता हूं, लेकिन यह इस बिंदु पर स्पष्ट रूप से स्पष्ट नहीं है। आपकी व्याख्या के तहत, समापन सीमांकक कहां डाला जाएगा? उदाहरण के लिए ([-!-foo], क्या आप ])बिंदु पर, या )उसके बाद सम्मिलित करते हैं foo]?
गिल्स एसओ-

मेरी समझ से, यदि आपके पास है ([-!-foo], तो मैं )बाद में डालूंगा foo]। लेकिन मैं निश्चित रूप से गलत हो सकता है। शायद @rlazo विस्तृत कर सकते हैं।
मालाबार

मेरे उपयोग के मामले के लिए, @Gilles सही है, मुझे इस बात से कोई फ़र्क नहीं पड़ता कि बिंदु के बाद सीमांकक बंद हो गया है, मैं बिंदु से पहले सब कुछ बंद करना चाहता हूं।
rlazo

3

मुझे पता चला है कि यदि आपके पास कीचड़ स्थापित है, तो ऐसा करने के लिए एक कमांड है, जिसे कहा जाता है slime-close-all-parens-in-sexp


हम्म ... तो यह वर्तमान लाइन पर बंद होने के लिए प्रकट होता है। यह अच्छा हो सकता है अगर वहाँ एक दृष्टिकोण था जो "वर्तमान ब्लॉक" को बंद कर दिया। यह फ़ाइल के अंत में जाकर और तब तक बैकवर्ड सेक्सप को प्राप्त करने तक प्राप्त किया जा सकता है जब तक कि कोई चीज़ बंद न हो।
आरएच

1

ऐसा करने के लिए एक बहुत ही आदिम (और लगभग निश्चित रूप से गलत) तरीका है

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

अन्य सीमाओं के बीच, यह मानता है कि सभी कोष्ठक जिन्हें डालने की आवश्यकता है:

  • बंद करना
  • वर्तमान स्थान पर जरूरत है

मुझे लगता है कि यह आपके विशिष्ट उपयोग-मामले के लिए उपयोगी होने के लिए पर्याप्त हो सकता है


यह एक अनंत लूप में फंस जाता है यदि आपके पास बहुत सारे समापन कोष्ठक हैं।
एमिल विक्रोत्तम

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