2011-08-11 27 views
20

हाल ही में मैंने M-x ielm (Emacs self-REPL) खोजा है और सुखद आश्चर्यचकित था कि उस मोड में एक कार्य टैब-पूर्णता है। कहें, मैं ecb- टाइप करना शुरू कर सकता हूं, फिर टैब दबाएं और ielm मुझे दिखाएगा कि ईसीबी द्वारा कौन से फ़ंक्शंस का खुलासा किया गया है। अन्वेषण के लिए बहुत सुविधाजनक!emacs - Emacs Lisp मोड में स्वत: पूर्णता

हालांकि, जब मैं अपनी *.el फ़ाइलों में से एक संपादित करना शुरू करता हूं (Emacs Lisp प्रमुख मोड में), TAB अब स्वत: पूर्ण के रूप में काम नहीं करता है और इंडेंटेशन करता है, जो मुझे दुर्भाग्यपूर्ण लगता है।

मैंने यह पता लगाने की कोशिश की कि ielm के भीतर स्वत: पूर्णता कैसे काम करती है ताकि संभवतः इसे Emacs Lisp मोड में ट्रांसप्लेंट किया जा सके। हालांकि, जाहिर है, ielm में स्वत: पूर्णता comint-dynamic-complete का उपयोग करती है, जहां तक ​​मैं समझता हूं, केवल comint-आधारित बफर में काम करता है। मुझे लगता है, इसका मतलब है कि मैं यहां भाग्य से बाहर हूं।

तो, ठीक है, मैं Emacs Lisp के लिए स्वत: पूर्णता कैसे सक्षम करूं?

उत्तर

28

Emacs के हाल के संस्करणों में, आप में निर्मित कार्यशीलता का एक अल्पज्ञात टुकड़ा है जो टैब पूरा होने के लिए सक्षम बनाता है का उपयोग कर सकते मोड की सेटिंग्स के अनुसार इंडेंटेशन समायोजित करने के लिए, लेकिन अगर इंडेंटेशन पहले से ही सही है, तो पूरा हो रहा है। यह आमतौर पर वांछित व्यवहार होता है, और आईएमएचओ smart-tab जैसे तृतीय-पक्ष प्लगइन से बेहतर काम करता है।

नोट, हालांकि, कुछ मोड में, TABindent-for-tab-command से बाध्य नहीं है, इसलिए उन मोड के लिए और अधिक रिबंडिंग आवश्यक है, उदा। smart-tab के साथ। साथ ही, जब मोड में "बाउंस इंडेंट" होता है (उदा। python-mode), यह तकनीक भी काम नहीं करेगी।

2

मैं दोनों खिसकने और पूरा समय पर उपयोगी पाते, तो मैं एक समारोह है कि क्या आखिरी बात मैंने किया था पाठ या नहीं डालने दिया गया था के आधार पर चुनता है:

(global-set-key [tab] 'indent-or-expand) 
(defun indent-or-expand() 
    "Either indent according to mode, or expand the word preceding point." 
    (interactive) 
    (if (or 
     (eq last-command 'self-insert-command) 
     (eq last-command 'dabbrev-expand)) 
     (progn 
     (setq this-command 'dabbrev-expand) 
     (dabbrev-expand nil)) 
    (indent-according-to-mode))) 

आप शायद dabbrev के बजाय comint-dynamic-complete उपयोग कर सकते हैं यदि आप चाहते हैं, लेकिन मुझे लगता है कि dabbrev emacs lisp के लिए बहुत अच्छा काम करता है - खासकर जब completer.el के साथ संयुक्त होता है, जो f-f-r-o को find-file-read-only में भी बढ़ा सकता है। - जो आम तौर पर indent-for-tab-command के लिए बाध्य है - पहली कोशिश करता

(setq tab-always-indent 'complete) 
(add-to-list 'completion-styles 'initials t) 

इस स्थापना के साथ, TAB:

+0

स्मार्ट विचार। आकस्मिक रूप से आवेदक पूरा करने पर आप केवल इंडेंट करना चाहते थे, कभी भी अच्छी बात नहीं होती है। – phils

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