2009-05-27 19 views
11

बदलने जैसे C प्रोग्रामिंग मोड में paredit उपयोग करते समय, टाइपिंग (कोष्ठक जब मैं एक समारोह कॉल करने के लिए कोशिश कर रहा हूँ से पहले एक स्थान डालें, मेरे साथ छोड़ने देगा:Paredit प्रारूपण

foo() 

वहाँ एक रास्ता है पेरेडिट के स्रोत को बदले बिना अंतरिक्ष के सम्मिलन को अक्षम करने के लिए?

उत्तर

13

वैसे, जिस तरह से पारेरिट काम पर प्रतीत होता है वह यह है कि यह सिंटैक्स टेबल की जांच करता है कि यह देखने के लिए कि क्या आप किसी शब्द/प्रतीक/आदि के बाद एक जोड़ी डाल रहे हैं, इस मामले में यह एक जगह को सम्मिलित करने के लिए मजबूर करता है। आपको उस कार्यक्षमता को ओवरराइड करने की आवश्यकता है - जिसे कई अलग-अलग तरीकों से किया जा सकता है: सलाह, फ़ंक्शन निर्धारक को फिर से परिभाषित करें जी अंतरिक्ष, वाक्य रचना तालिका बदल रहा है, आदि

मैं सीधे आगे की कोशिश करेंगे:

(defun paredit-space-for-delimiter-p (endp delimiter) 
    (and (not (if endp (eobp) (bobp))) 
     (memq (char-syntax (if endp (char-after) (char-before))) 
      (list ?\" ;; REMOVED ?w ?_ 
        (let ((matching (matching-paren delimiter))) 
        (and matching (char-syntax matching))))))) 

यह स्पष्ट रूप से सभी स्थानों पर जहां आप paredit उपयोग करने के लिए लागू होगी। यदि आप कुछ और मोड विशिष्ट चाहते हैं, तो आप and कथन (उदा। (and ... (memq major-mode '(c-mode lisp-mode)))) में कुछ स्थितियां जोड़ सकते हैं।

तो ... मुझे लगता है कि मैंने "स्रोत" बदल दिया है, लेकिन आप defadvice के टुकड़े के साथ एक ही काम कर सकते हैं ... यह सब कुछ elisp है, तो अंतर न्यूनतम है। इस प्रकार के व्यवहार को नियंत्रित करने के लिए एक सेटिंग प्रतीत नहीं होती है।

+2

मैं एक लंबे समय के लिए इस चाहता था देखें के बाद से मैं autopair.el _very_ धीमी गति से लगता है। पेरेडिट अब 'सी-मोड 'में एक आकर्षण की तरह काम करता है। धन्यवाद! :) –

+0

के लिए मोड विशिष्ट जा रहा है, एक भी लिख सकते हैं '(defvar-स्थानीय मेरी-paredit-नो-डालने अंतरिक्ष शून्य)' और 'उपयोग (और ... मेरी-paredit-नो-डालने अंतरिक्ष) की' बजाय '(और ... (memq major-mode '(c-mode lisp-mode)))) और फिर' my-paredit-no-insert-space' को' c-mode-common- से 't' पर सेट करें। hook'। इस तरह अंतर प्राथमिकताओं वाले दो लोग 'paredit-space-for-delimiter-p' –

+0

' की एक ही नई परिभाषा का उपयोग कर सकते हैं, यदि आप कुछ और मोड विशिष्ट चाहते हैं, तो आप उस स्थिति और कथन में कुछ शर्तों को जोड़ सकते हैं - मैं चाहता हूं कुछ तरीकों से इसे ओवरराइड न करें, लेकिन मुझे समझ में नहीं आता कि कौन सा 'if' कथन मैं शर्त जोड़ सकता हूं। क्या आप स्पष्ट कर सकते हैं? – Max

4

खैर, Paredit एस भाव का निर्माण किया संपादन भाषाओं के लिए आदर्श है। अगर आपको यह पसंद है कि यह स्वचालित रूप से बंद होने वाले माता-पिता को कैसे सम्मिलित करता है, तो सुविधा skeleton-pair का उपयोग करें।

(setq skeleton-pair t) 
(global-set-key "(" 'skeleton-pair-insert-maybe) 
+0

अच्छा बिंदु। मैं कंकाल-जोड़ी के बारे में भूल गया। मैं emacs lisp के साथ चारों ओर mucking के लिए Paredit करने के लिए इतना उपयोग किया जाता है। मुझे इसे अपनी गैर-लिस्पी भाषाओं के लिए सेट अप करने की आवश्यकता है .. –

+3

दरअसल, पेरेडिट मोड एस-अभिव्यक्ति-आधारित भाषाओं के साथ-साथ मिलान किए गए डिलीमीटर की वैधता को लागू करने के लिए बेहद उपयोगी है; यह सिर्फ सम्मिलन के बारे में नहीं है। – technomancy

5

, paredit-space-for-delimiter-predicates

+0

यह (मोड नाम के लिए समायोजन, या अपने मोड के हुक करने के लिए 'dolist' और इस बात का सरल इसके अलावा 'लैम्ब्डा()' का भी हटाने की आवश्यकता हो सकती है (यदि केवल एक मोड वाले)) इस संबंध में ब्याज की हो सकता है: https://gist.github.com/remvee/879305 – dimsuz

संबंधित मुद्दे