2010-09-27 9 views
6

मैंने अभी emacs का उपयोग करना शुरू कर दिया है, और एक ऐसी सुविधा है जिसे मैं वास्तव में पसंद करूंगा, और थोड़ा सा खोज करना फलहीन था। मुझे उम्मीद है कि किसी और ने ऐसा किया है क्योंकि मैं अभी तक elisp सीखना नहीं चाहता।मैं स्वचालित ब्रेसिज़ को स्वचालित रूप से बंद करने के लिए emacs कैसे प्राप्त कर सकता हूं

void foo()<cursor> 

मैं टाइपिंग एक "{" ऐसा

void foo(){ 
    <cursor> 
} 

मैं केवल cc-मोड में होने के लिए चाहते हैं, और केवल एक लाइन के अंत में जब नहीं पैदा करने के लिए चाहते हैं एक स्ट्रिंग/टिप्पणी/आदि

पहली बात जो दिमाग में आई थी वह हमेशा ऐसा करने के लिए "{" को पुनर्जीवित कर रही थी (मुझे यह पता लगाना था कि यह कैसे करना है), लेकिन इसे केवल तभी करना मुश्किल होगा सही समय।

किसी भी संकेत की सराहना की जाएगी।

+0

मुझे लगता है कि इस http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs –

+0

मैं उस सवाल को देखा की डुप्लीकेट, लेकिन यह सिर्फ समापन कोष्ठक जोड़ने के बारे में/था ब्रेस/आदि। मैं इसे दो बार, इंडेंट, और कर्सर को रिक्त लाइन पर – Bwmat

उत्तर

5

यह यह करना होगा:

(defun my-c-mode-insert-lcurly() 
    (interactive) 
    (insert "{") 
    (let ((pps (syntax-ppss))) 
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment 
     (c-indent-line) 
     (insert "\n\n}") 
     (c-indent-line) 
     (forward-line -1) 
     (c-indent-line)))) 

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly) 
+0

धन्यवाद, यह बहुत अच्छा काम करता है। – Bwmat

2

yasnippet (या Emacs विकी पृष्ठ yasnippet पर) का प्रयास करें। Emacs के लिए कई पैकेज हैं जो इस तरह की चीज करने में सहायता करते हैं, लेकिन यसिपिपेट में वर्तमान में गति है और यह बहुत विस्तार योग्य है। वीडियो देखें।

+0

को दोबारा बदलना चाहता हूं, यह वास्तव में अच्छा लगता है, मैं इसे देखता हूं – Bwmat

+0

यह आदर्श नहीं लगता है, मुझे इसे विस्तारित करने के लिए टैब दबाए जाने की आवश्यकता है और यह काम नहीं करता है अगर "{" और इससे पहले जो भी हो, उसके बीच कोई जगह नहीं है। – Bwmat

+0

आप अंतरिक्ष को हटाने के लिए शायद टेम्पलेट में संशोधित कर सकते हैं। टेम्पलेट्स को संशोधित/बनाना बहुत आसान है। –

1

आपको अपनी इच्छानुसार ऐसा करने के लिए emacs-lisp में प्रवेश करने की आवश्यकता होगी, क्योंकि YASnippet आपके लिए कुछ अच्छा करेगा लेकिन वास्तव में आप जो भी मांग रहे हैं उससे नहीं।

मुझे लगता है कि ऐसा करने का सबसे आसान तरीका सीसी-मोड कुंजी-मानचित्र में आरईटी कुंजी पर एक फ़ंक्शन को बांधना होगा।

समारोह {, और इसलिए यदि आवश्यक आरईटी, आरईटी, टैब, प्रदर्शन} कि पिछले वर्ण एक है की जाँच करनी चाहिए, ऊपर, टैब पाने के लिए कर्सर जहां आप चाहते हैं और बंद } डाला गया।

आप एक संतुलित समापन } के लिए यह जांच करके अधिक मजबूत बना सकते हैं लेकिन यह अधिक जटिल होगा, और मैं यह अतिरिक्त पॉलिशिंग सुविधा के बिना कैसा महसूस करता हूं यह देखने की सलाह दूंगा।

यदि आप चाहें तो मैं आपके लिए फ़ंक्शन और कुंजी-मानचित्र बाध्यकारी लिख सकता हूं, लेकिन चूंकि आपने यह जानने के बारे में पूछा कि यह कैसा हो गया है, तो अगर आपको इसकी आवश्यकता हो तो मैं अधिक सहायता मांगने के लिए इसे छोड़ दूंगा ।

वैकल्पिक रूप से, मैं autopair.el मेरे लिए यह अच्छी तरह से पर्याप्त है कि लगता है, और मैं नई-पंक्तियों खुद ही करता हूं;)

+0

यही मैंने सोचा था। लिस्प फ़ंक्शन के अंदर, एक आसान तरीका है, जांच करें कि क्या मैं एक टिप्पणी/स्ट्रिंग में हूं और क्या मैं लाइन के अंत में हूं? मुझे पता है कि सीसी-मोड यह आंतरिक रूप से करता है और अगर मैं इसका उपयोग कर सकता हूं तो यह वास्तव में आसान होगा। – Bwmat

+0

आप यह निर्धारित करने के लिए चीज-ऑन-पॉइंट का उपयोग कर सकते हैं कि आप किस संदर्भ में हैं। – ocodo

3

मैं दिल से आप उत्कृष्ट autopair नाबालिग मोड आज़माने के लिए सलाह देते हैं - यह एक बहुत करता है बस ब्रेसिज़ डालने से अधिक और Emacs को उस क्षेत्र में बहुत अधिक आईडीई बनाता है। मुझे लगता है कि सीसी-मोड में इलेक्ट्रिक ब्रेसिज़ सेटिंग के साथ संयोजन करने से आप जितना व्यवहार चाहते हैं उतना ही कम आपको कम कर देंगे।

8

नवीनतम Emacs पर आप का उपयोग कर सकते हैं:

electric-pair-mode is an interactive compiled Lisp function. 

(electric-pair-mode &optional ARG) 

Automatically pair-up parens when inserting an open paren. 

इस Emacs में 24.1 एकीकृत है (वास्तव में सीवीएस)

1

आप रखने के लिए चाहते हो सकता है एक खाली फंक्शन बॉडी का विकल्प, इस मामले में आप बंद लाइन को उसी लाइन पर रहने के लिए चाहते हैं। यदि ऐसा है, तो आप इस वैकल्पिक समाधान का प्रयास कर सकते हैं:

  1. पिछले उत्तरों में उल्लिखित संकुलों पर स्वचालित रूप से समापन ब्रेस जोड़ने के लिए निर्भर करें।
  2. जब आप फ़ंक्शन बॉडी में कथन जोड़ना चाहते हैं, तो आप Return कुंजी दबाएं (जबकि स्वचालित रूप से जोड़ा गया बंद ब्रेस अभी भी कर्सर के नीचे है)। 'वापसी' कुंजी के रूप में निम्नानुसार बाध्य है:

    ;; automatic first line in function            
    (defun my-c-mode-insert-funline() 
        (interactive) 
        (newline-and-indent) 
        (when (looking-at "}") 
        (newline-and-indent) 
        (forward-line -1) 
        (c-indent-line))) 
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline) 
    
2

Emacs 24 या नए संस्करण में बिजली-जोड़ी-मोड चालू करें।

(electric-pair-mode 1) 
संबंधित मुद्दे

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