2014-06-26 22 views
11

Hier finden ist mein Szenario:Haskell-Modus nicht für mein Projekt arbeiten, können nicht Modul

Ich bin mit den folgenden Verzeichnissen/Module an einem Projekt arbeiten:

|--proj 
    |-- src 
     |-- Foo 
      |-- FooModule1.hs 
      |-- FooModule2.hs 
     |-- Bar 
      |-- BarModule1.hs 

BarModule1.hs sieht aus wie dies:

module BarModule1 where 

import Foo.FooModule1 
... 

ich habe auch eine .cabal Datei src als hs-source-dirs und natürlich die Angabe beide Module darin aufgeführt sind.

Wenn ich in der Datei BarModule1.hs in Emacs bin und ich Cc Cl heißt es:

proj/src/Bar/BarModule1.hs:3:8: 
    Could not find module `Foo.FooModule1' 
    Use -v to see a list of the files searched for. 
Failed, modules loaded: none. 

Auch ich will hlint mit flymake-haskell-multi-load verwenden, und wenn ich aktivieren diesen Modus mit Mxflymake-haskell-multi-load, hlint zeigt immer den Fehler, dass es Modul Foo.FooModule1 nicht finden kann, weil es die .cabal Datei nicht kennt, in der ich das hs-source-dirs: src spezifiziere.

Also meine Frage ist: Wie kann ich haskell-mode und flymake/hlint meines Projektverzeichnis/Modulbaum darüber im Klaren sein, so dass es alle Module findet? Wie kann ich sie auf die in meiner Datei .cabal angegebenen Module aufmerksam machen?

+0

Wenn Sie eine Kabalen-Datei verwenden, dann warum Benutze Cabal nicht selbst? Stellen Sie zunächst sicher, dass Ihr aktueller Puffer eine Datei im selben Ordner wie Ihre .cabal-Datei ist, dann 'C-u M-x kompilieren RET cabal repl RET' – user2407038

+0

Welche Version des Haskell-Modus verwenden Sie? Das Neueste und Beste ist sehr kabellos. Das Gleiche gilt für GHC-Modus IIRC – jozefg

+0

C-u M-x RET Kabale repl RET arbeitet für die repl kompilieren, aber nicht beheben die flymake/hlint Ausgabe Ich bin mit Haskell-Modus 13,7 – Stephen

Antwort

2

an der Eingabeaufforderung in GHCI: :set -iproj/src/

+0

Dies behebt die C-c C-l Problem, danke. Trotzdem wird flymake mit hlint davon nicht beeinflusst und markiert immer noch die erste Importzeile mit "Konnte Modul nicht finden" – Stephen

3

Was haskell-modehaskell-process-type in Ihrem Emacs cabal-repl gesetzt Datei init und stellen Sie sicher, interactive-haskell-mode (nicht inf-haskell-mode) zu verwenden:

(add-hook 'haskell-mode-hook 'interactive-haskell-mode) 
(setq haskell-process-type 'cabal-repl) 
3

ist meine Emacs-Konfiguration basiert auf Emacs Prelude. Und ich erstelle auch Sandbox für das Projekt mit cabal sandbox init.

Für die ähnliche Projektstruktur haskell-mode funktioniert gut. Ich bin in der Lage, C-c C-l laden aktuelle Datei in repl ohne Fehler. Aber flycheck ist nicht in der Lage, alle Module zu lösen und markieren import Aussagen mit Fehlern:

Could not find module ‘Foo.FooModule1’ 
Use -v to see a list of the files searched for. 

Es ist ein Problem Support Cabal sandboxes in GHC#293 mit der Lösung. Sie müssen .dir-locals.el in der proj Wurzel erstellen, die die erforderlichen Variablen bereitstellt.

((haskell-mode 
    (flycheck-ghc-package-databases "/path/to/proj/.cabal-sandbox/x86_64-osx-ghc-7.6.3-packages.conf.d/") 
    (flycheck-ghc-no-user-package-database . t) 
    (flycheck-ghc-search-path "/path/to/proj/src"))) 
  • flycheck-ghc-package-databases - ist ein cabal.sandbox.configpackage-db Einstellung
  • flycheck-ghc-search-path (Sie Sandbox zuerst erstellen müssen) - ist ein Weg zu proj/src