Haskell – Editor konfigurieren

Die Wahl des richtigen Editors ist ja fast eine Glaubenssache – glücklicherweise bieten praktisch alle beliebten Editoren Haskell Unterstützung (zumindest Syntax-Highlighting).

Ihr könnt für den Workshop also verwenden was ihr wollt, trotzdem möchte ich euch hier ein paar vorstellen, die euch weitergehend unterstützen.

IDEs

Um ehrlich zu sein, ich habe noch keine IDE für Haskell gefunden, die ich verwenden möchte.

Der Vollständigkeit halber möchte ich aber wenigstens zwei erwähnen:

  • Leksah (Haskel rückwärts) wird in Haskell entwickelt und ist vielleicht einen Blick wert.
  • EclipseFP ist ein Eclipse-Plugin

Mir persönlich ist der Pflege- und Installationsaufwand für beide (speziell EclipseFP) zuviel.


GHC-MOD

ghc-mod ist im Moment wohl das Standard-Backend für einen erweiterten Editor-Support (Typ-Inferenz, …) und das müsst ihr erst installieren.

Unter Windows ist das normalerweise das einzige Paket, dass ich direkt installiere:


cabal update
cabal install ghc-mod

Tatsächlich könnt ihr das aber auch in einer Sandbox installieren – was ich unter Linux auch empfehle (unter Windows ist es mir in der Regel zu lästig den Pfad anzupassen und ich entwickle nicht so viel mit Haskell unter Windows) – OSX dürfte hier wohl in die Linux Kategorie fallen:

Sucht euch also ein Verzeichnis in das ihr die Sandbox mit ghc-mod haben wollt und führt folgendes dort aus:

cabal update
cabal sandbox init
cabal install ghc-mod

Danach solltet ihr in dem Verzeichnis in ./.cabal-sandbox/bin eine Reihe von Programmen finden (wichtig sind hlint, ghc-mod und ghc-modi) – jetzt müsst ihr einfach dafür sorgen, dass ihr diese Programme finden könnt – sprich sie sollten im PATH liegen.
Ich mache mir hier immer einen Sym-Link (ln -s ...) in einem Verzeichnis das schon im PATH liegt (bei mir ~/bin) auf die Dateien.

Jedenfalls sollte in einem beliebigen Verzeichnis folgendes funktionieren (Versionen können natürlich abweichen) :


$ ghc-mod --version

ghc-mod version 5.4.0.0 compiled by GHC 7.10.2

Editoren

Folgende habe ich im Einsatz/getestet:

Atom

Atom funktioniert so weit ich sehen kann wirklich gut mit Haskell – das einzige was ich vermisse ist eine eingebaute REPL aber das kommt sicher bald.
Die Installation ist auch extrem einfach – im Prinzip habe ich nur folgende Pakete installiert:

  • language-haskell
  • haskell-ghc-mod
  • ide-haskell
  • ide-haskell-cabal
  • autocomplete-haskell
  • haskell-hoogle

Und in den Settings das Backend auf ghc-mod gesetzt wo es nötig war – damit funktioniert bei mir alles out-of-the-box.

Emacs

Eines Vorweg: ich bin eher emacs-Anfänger – es könnte also gut sein, dass der Eine oder Andere hier stöhnt (z.B. bei der Konfig) – also nur raus damit: ich nehme Verbesserungsvorschläge dankbar an!

Ich gehe davon aus, das MELPA vorhanden ist, dann solltet ihr einfach mit:

  • M-x package-refresh-content
  • M-x package-install

die Pakete
haskell-mode
ghc
ghci-completion

installieren.

Ich habe bei mir dann Folgendes in die~/.emacs Konfiguration eingefügt:


(autoload 'ghc-init "ghc" nil t)
(autoload 'ghc-debug "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init)))
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
(add-hook 'haskell-mode-hook 'linum-mode)

;; key-bindings
(eval-after-load 'haskell-mode '(progn
(define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-or-reload)
(define-key haskell-mode-map (kbd "C-c C-n C-t") 'haskell-process-do-type)
(define-key haskell-mode-map (kbd "C-c C-n C-i") 'haskell-process-do-info)
(define-key haskell-mode-map (kbd "C-c C-n C-c") 'haskell-process-cabal-build)
(define-key haskell-mode-map (kbd "C-c C-n c") 'haskell-process-cabal)))
(eval-after-load 'haskell-cabal '(progn
(define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-ode-clear)
(define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
(define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)))

Außerdem habe ich für den für Autocomplete-Support noch Company installiert:

Wieder mit M-x package-install folgende Pakete hinzufügen:

  • company
  • company-ghc
  • company-cabal (optional)
  • company-ghci) (optional)

und dann das in ~/.emacs:


;; company
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
(add-to-list 'company-backends 'company-ghc)
(global-set-key (kbd "C-.") 'company-complete)

Damit bekomme ich mit C-. ein Autocomplete, das meistens gute Dienste leistet.


Update

Ich habe gerade bemerkt, dass der Haskell-Mode ein Update erfahren hat, seit dem ich ihn das letzte Mal installiert habe.
Insbesonsere wurde das prompt standardmäßig deaktiviert (das ist eigentlich nur wichtig, wenn im .cabal-File mehr als ein Target angegeben ist, weil man das wählen muss.
Ich würde also empfehlen mit M-x customize-mode die Settings alle durchzugehen. Ich habe bei mir folgende gesetzt:


'(haskell-decl-scan-bindings-as-variables t)
'(haskell-interactive-mode-hide-multi-line-errors nil)
'(haskell-process-auto-import-loaded-modules t)
'(haskell-process-check-cabal-config-on-load t)
'(haskell-process-load-or-reload-prompt t)
'(haskell-process-type (quote auto))
'(haskell-tags-on-save t)
'(inferior-haskell-wait-and-jump t)
'(initial-buffer-choice t)


Sublime-Haskell

Unter Sublime hat Sublime-Haskell eigentlich immer gut funktioniert – allerdings nutze ich den Sublime seit einiger Zeit nicht mehr, aber die Installation läuft analog ab – nur benötigt ihr wohl ein paar Haskell-Pakete mehr (siehe Link).

andere Editoren

Das sind alle, die ich probiert habe oder nutze (im Moment bevorzuge ich wenn es sehr schnell gehen soll einfach gedit, sonst nehme ich emacs (wegen der REPL).

Sicher hat einer von euch aber Erfahrungen mit Vi und co. – wenn ihr mir eine schnelle Anleitung schickt, füge ich sie hier an (mit Cudos versteht sich).

Eine kleine Bitte

Das ist alles relativ kurz runter geschrieben – ich würde mich freuen, wenn ihr mir Feedback gebt, ob das bei euch funktioniert und falls nein, wo ihr Probleme habt, damit das eine gute Anleitung für Alle wird!

Außerdem werde ich nächste Woche versuchen schon eine halbe Stunde vor dem offiziellen Workshop-Beginn vor Ort zu sein. Der Plan ist, dass wir dann eventuelle Setup-Probleme lösen bevor der Workshop startet.