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.