2010-11-12 16 views
23

S'il vous plaît aidez-moi mis en place une indentation correcte dans Emacs haskell modeEmacs indentation Haskell

Quand je suis en train de taper vers le bas quelque chose comme ADT ou un dossier, je reçois sur la mauvaise colonne après avoir appuyé sur <ENTER>, et en appuyant sur <TAB>ne sera pas basculer vers la droite jusqu'à ce que j'entre | ou ';'!

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

Essayer de résoudre le problème que je mis

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

dans mon dossier .emacs, mais il ne sera pas en retrait de la ligne courante sur pression <enter> aussi!

Un autre comportement étrange: indentation de cas

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

Le cas 'case' est un comportement correct. – jrockway

+1

Si vous appuyez deux fois sur tabulation, un '|' dans l'indentation correcte. – edon

+0

s'il n'y a pas encore '|', ce n'est pas le cas. Donc, je dois taper quelque chose dans la ligne avant de presser l'onglet –

Répondre

3

Je commentais la ligne

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

Et maintenant, je suis obtenir un bon « onglet » Comportement: au moins, il me permet de choisir une colonne et ne m'attache pas à celle qu'il aime. Mais pas auto-tiret du tout me gêne un peu, donc je suis en espérant que c'est une solution temporaire

9

On dirait que vous tapez <Enter> puis « | » puis <Tab>. Si je fais cela, j'obtiens les mêmes résultats. Mais si je tape <Enter> puis <Tab> puis <Tab> à nouveau, il insère automatiquement les « | » et tapisse correctement, comme ceci:

data MyADT = Oh 
      | Hi 
      |<Cursor> 

Quand je vérifie ma version haskell-mode à l'aide M-x eval-expression haskell-version <Enter> I get « v2_4 » . Le mode haskell d'Emacs n'analyse pas complètement le code source, donc les fonctions "automatiques" sont approximatives, je pense. Taper <Tab> plusieurs fois sur une nouvelle ligne fait défiler plusieurs indentations possibles et insère parfois du texte comme le "|" pour les types de données algébriques.

4

Avertissement: Je ne suis pas un utilisateur de Haskell, alors prenez ceci avec un grain de sel.

Lorsque vous appuyez sur RET après la Hello, Emacs ne sait pas que vous allez ajouter un | (quick search montre que vous pouvez avoir d'autres symboles). Les gens de Haskell ont jugé que l'indentation appropriée devait être alignée directement au-dessous de H dans Hello. Si l'indentation devait s'aligner automatiquement avec la | sur la ligne ci-dessus, alors tous les cas où vous ne saisissez un | entraîneront une indentation incorrecte. Damné si vous le faites, damné si vous n'avez pas ...

D'autres modes de programmation (C/C++, Lisp, Tcl, ...) ont le même problème - ils ne peuvent pas savoir à l'avance ce que vous allez mettre sur la ligne suivante, de sorte que l'indentation ne soit pas ce que vous aviez espéré.

Une solution consiste à utiliser les touches "electric", c'est-à-dire qu'elles insèrent des caractères et forcent également la réindentation. Vous pouvez facilement définir | pour être électrique avec le code suivant:

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

J'ai ajouté un chèque pour faire en sorte que le | inséré est précédé que des espaces, vous pouvez personnaliser ce que vous voulez ou cependant supprimer le contrôle total.

Je suppose qu'il pourrait aussi y avoir d'autres symboles dans Haskell qui mériteraient d'être électriques.