2010-11-12 24 views
23

Lütfen beni Emacs haskell-modunda doğru girinti kurmak yardımcıEmacs Haskell girinti

Ben ADT veya plak gibi bir şey aşağı yazmaya çalışıyorum, ben <ENTER> bastıktan sonra yanlış sütun üzerinde alıyorum ve | ya da ';' ya girene kadar tuşlarına basıldığında doğru olana geçmeyecektir.

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

sorunu çözmek için çalışıyorum benim .emacs dosyada

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

set, ama çok <enter> basarak geçerli satırına girinti olmaz! en azından, benim seçmenize olanak verir:

başka tuhaf davranış: Ben

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

Ve şimdi iyi bir "sekme" davranış alıyorum satır yorum

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

'Kasa' durumu doğru davranış. – jrockway

+1

Sekmeye iki kez basarsanız, bir '|' ekler. doğru girinti. – edon

+0

, henüz yok ise, yok. Yani –

cevap

3

davanın girinti bir sütun ve beni sevdiği birine bağlamaz. Ama hiç hiçbir otomatik girinti beni biraz rahatsız ediyor, bu yüzden daha sonra "|" ve ardından <Tab><Enter> ve yazın gibi geliyor o geçici bir çözüm

9

olduğunu umuyorum. Bunu yaparsam, aynı sonuçları alırım. Ama <Enter> yazıp <Tab> ve sonra <Tab> tekrar otomatik "|" ve çizgiler o kadar gibi pek doğru ekler eğer: Ben haskell modlu versiyonu M-x eval-expression haskell-version <Enter> kullanarak kontrol ettiğinizde

data MyADT = Oh 
      | Hi 
      |<Cursor> 

ben "v2_4" olsun . "Otomatik" özellikleri yaklaşık değerlerdir böylece

Emacs haskell modu tam kaynak kodu analiz etmez, sanırım. bazen birkaç olası girintiler sayesinde yeni bir satır döngüleri üzerinde <Tab> birkaç kez Yazma ve cebirsel veri türleri için "|" gibi metin ekler.

4

Sıkıştırma: Ben bir Haskell kullanıcısı değilim, bu yüzden bunu bir tuz tohumu ile alın.

Eğer Hello sonra RET bastığınızda, Emacs bir | eklemek için gidiyoruz bilmiyor (quick search diğer semboller olabilir gösterir). Haskell millet Hello yılında H altında doğrudan dizilmiş olması doğru girinti yetinmişlerdir. girinti otomatik ardından, yukarıdaki satırda | ile değil tip yapmak bütün davaları sıraya olsaydı bir | uygunsuz girinti sonuçlanacaktır. Eğer yaparsan lanet olsun, eğer yapmazsan ...

Diğer programlama modları (C/C++, Lisp, Tcl, ...) aynı soruna sahipler - ne yapacağını önceden bilemezler sonraki satırda koymak, böylece girinti umduğunuz şey olması etmezler.

Tek bir çözüm, "electric" anahtarlarının kullanılmasıdır; bu, karakterleri ekledikleri ve yeniden girintilemeyi zorladıkları anlamına gelir. Kolayca | aşağıdaki kodla elektrik olmak:

(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-|) 

Ben sadece boşluk öncesinde eklenen |, özelleştirebilirsiniz emin olmak için bir kontrol ekledi istediğiniz veya tamamen işareti kaldırın Ancak o.

Haskell'de elektrik yapmaya değecek başka semboller de olabileceğini düşünüyorum.