2010-09-01 9 views
5

मैं स्केला-मोड के तहत Emacs में निम्न कोड (स्काला 2.8 पैकेज से):Emacs स्केला मोड न्यू लाइन और मांगपत्र weirdness

object t1 { 
    def main (args: List[String]) = { 
    println("Hello") 
    } 
} 

मैं अपने वापस कुंजी newline-and-indent लिए निर्धारित किया है। जब मैं बार-बार अंतिम ब्रेस के बाद वापसी पर हिट करता हूं, तो यह एक खाली रेखा के लिए बाएं कॉलम पर जाता है। जब मैं दोबारा वापसी करता हूं, तो इंडेंट दो रिक्त स्थान। फिर यह इसके बाद इस इंडेंटेशन पर रहता है। जाहिर है यह ऐसा नहीं करना चाहिए।

हालांकि, जब मैं एम-एक्स द्वारा बार-बार newline-and-indent चलाता हूं और newline-and-indent टाइप करता हूं, तो मुझे दो-स्पेस इंडेंटेशन नहीं मिलता है। यह reindent-then-newline-and-indent के लिए जाता है।

यह अंतर क्यों है?

उत्तर

5

आपकी समस्या इस तथ्य से उत्पन्न हो रही है कि आपने enter को newline-and-indent पर रीबाउंड किया है, जो scala-mode का उपयोग करते समय बेवकूफ़ प्रतीत नहीं होता है। newline-and-indentindent-according-to-mode पर कॉल करना समाप्त होता है, जो कुछ अवांछित सेटिंग्स के लिए जांच करता है, यदि आवश्यक हो तो उनके चारों ओर काम करता है, और यदि सब ठीक है, तो indent-line-function पर कॉल करना समाप्त होता है, जो एक बफर स्थानीय चर है।

चूंकि यह मोड-विशिष्ट है, मोड अपने indent-line-function को परिभाषित करते हैं। सबसे सुंदर संगत व्यवहार है, लेकिन स्काला के समारोह scala-indent-line, यहाँ देखा है:

(defun scala-indent-line() 
    "Indent current line as smartly as possible. 
When called repeatedly, indent each time one stop further on the right." 
    (interactive) 
    (if (or (eq last-command this-command) 
      (eq last-command 'scala-undent-line)) 
     (scala-indent-line-to (+ (current-indentation) scala-mode-indent:step)) 
    (let 
    ((indentation (scala-indentation))) 
     (scala-indent-line-to indentation)))) 

इस बारे में अजीब बात यह है कि यह बार-बार कॉल और इंडेंट आगे का पता लगाता है हर बार खत्म हो गया है। एम-एक्स का उपयोग करते समय, last-commandscala-indent-line नहीं है, यह execute-extended-command है। इसलिए, एम-एक्स का उपयोग करते समय, यह सही इंडेंटेशन स्तर पर इंडेंट जारी है। जब एक कुंजी से बंधे होते हैं, हालांकि, यह नोटिस करता है कि इसे तुरंत पहले निष्पादित किया गया था और एक अतिरिक्त स्तर को इंडेंट किया गया था।

प्रभाव संचयी नहीं है ... मुझे लगता है कि यह फ़ंक्शन के अंत में अजीब कमांड सेट की वजह से है, जो प्रारंभ में लाइन को इंडेंट करता है, लेकिन फिर (scala-indentation) के साथ सही इंडेंटेशन के लिए जांच करता है और तदनुसार इंडेंट करता है।

मैं इस पर 100% नहीं हूं, लेकिन पहली नज़र में ऐसा लगता है कि ऐसा लगता है।

+2

वैसे तो समाधान उस कोड पथ में नहीं जाने देना है। निम्नलिखित काम करता है: (स्थानीय सेट कुंजी [वापसी] '(लैम्ब्डा() (सहभागी) (setq अंतिम आदेश नहीं के बराबर) (newline और मांगपत्र))))) – qrest

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