2010-11-12 10 views
23

कृपया मेरी मदद Emacs Haskell-मोड में उचित खरोज की स्थापनाEmacs हास्केल खरोज

जब मैं एडीटी या एक रिकॉर्ड की तरह कुछ नीचे टाइप करने के लिए कोशिश कर रहा हूँ, मैं <ENTER> दबाने के बाद गलत स्तंभ पर हो रही है, और <TAB> दाएं तब तक स्विच करें जब तक कि मैं | या ';' दर्ज नहीं करता!

data MyADT = Oh 
      | Hi 
      | Hello 
      | <- the cursor is here again! 

समस्या को हल करने की कोशिश कर रहा

(define-key global-map (kbd "RET") 'reindent-then-newline-and-indent) 

मेरी .emacs फ़ाइल में सेट है, लेकिन यह <enter> भी दबाने पर वर्तमान पंक्ति इंडेंट नहीं होगा!

एक और अजीब व्यवहार: मामले की खरोज

oneChar c = case lookup c simpleEscapes of 
    | <- what? here?! 
+1

'मामला' मामला सही व्यवहार है। – jrockway

+1

यदि आप दो बार टैब दबाते हैं, तो यह '|' सही इंडेंटेशन में। – edon

+0

यदि अभी तक कोई '|' नहीं है, तो यह नहीं है। तो मुझे टैब –

उत्तर

3

मैं लाइन

;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent) 

और अब मैं एक अच्छा "टैब" व्यवहार हो रही है टिप्पणी की: कम से कम, यह मुझे चुनने की अनुमति देता एक कॉलम और मुझे पसंद करने वाले व्यक्ति को टाई नहीं करता है। लेकिन सभी में कोई ऑटो मांगपत्र मुझे एक छोटा सा गुस्सा दिलाती है, तो मैं इसे एक अस्थायी समाधान

9

है आशा करती हूं कि ऐसा लगता है जैसे आप टाइप <Enter> और फिर "|" और फिर <Tab>। अगर मैं ऐसा करता हूं, तो मुझे वही परिणाम मिलते हैं। लेकिन अगर मैं <Enter> लिखते हैं और फिर <Tab> और फिर <Tab> फिर यह स्वचालित रूप से "|" और यह लाइनें सम्मिलित करता है सही ढंग से, जैसे इतना:

data MyADT = Oh 
      | Hi 
      |<Cursor> 

जब मैं M-x eval-expression haskell-version <Enter> उपयोग करते हुए मेरे Haskell-मोड संस्करण की जांच मैं "v2_4" मिल ।

Emacs हैकसेल मोड स्रोत कोड का पूरी तरह से विश्लेषण नहीं करता है, इसलिए "स्वचालित" विशेषताएं अनुमानित हैं, मुझे लगता है। <Tab> कई संभावित इंडेंटेशन के माध्यम से एक नई लाइन चक्र पर कई बार टाइपिंग, और कभी-कभी बीजगणितीय डेटा प्रकारों के लिए "|" जैसे टेक्स्ट भी सम्मिलित करता है।

4

चेतावनी: मैं हास्केल उपयोगकर्ता नहीं हूं, इसलिए नमक के अनाज के साथ इसे लें।

जब आप Hello के बाद आरईटी प्रेस, Emacs आप एक | जोड़ने के लिए जा रहे हैं पता नहीं है (quick search आपको दिखाता है कि अन्य प्रतीक हो सकते हैं)। हास्केल लोगों ने में H के नीचे सीधे रेखांकित करने के लिए उचित इंडेंटेशन समझा है। अगर इंडेंटेशन को ऊपर दिए गए लाइन पर | के साथ स्वचालित रूप से लाइन करना था, तो उन सभी मामलों में जहां आप | टाइप करें, अनुचित इंडेंटेशन का परिणाम होगा। यदि आप करते हैं तो शापित हो, यदि आप नहीं करते हैं ...

अन्य प्रोग्रामिंग मोड (सी/सी ++, लिस्प, टीसीएल, ...) एक ही समस्या है - वे समय से पहले नहीं जानते कि आप क्या जा रहे हैं अगली पंक्ति में डालने के लिए, इसलिए इंडेंटेशन जो मैं आशा करता हूं वह नहीं है।

एक समाधान "electric" कुंजी का उपयोग करना है, जो कहता है कि वे अक्षर डालते हैं और फिर से इंडेंटेशन को मजबूर करते हैं। आप को आसानी से परिभाषित कर सकते हैं निम्न कोड के साथ बिजली होने के लिए:

(defun haskell-electric-|() 
    "it's electric! (insert | and indent as long as the | follows whitespace)" 
    (interactive) 
    (insert "|") 
    (if (string-match-p "^\\s-*|" (buffer-substring (line-beginning-position) 
                (point))) 
     (haskell-indentation-indent-line))) 
(define-key haskell-mode-map "|" 'haskell-electric-|) 

मैं यह सुनिश्चित करें कि | डाला इसमें केवल रिक्त स्थान से पहले है, तो आप अनुकूलित कर सकते हैं एक चेक कहा कि हालांकि आप चाहते हैं या चेक पूरी तरह निकाल दें।

मुझे लगता है कि हास्केल में अन्य प्रतीक भी हो सकते हैं जो बिजली बनाने के लायक होंगे।

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