Haskell-mode не работает для моего проекта, не может найти модуль

Вот мой сценарий:

Я работаю над проектом со следующими каталогами/модулями:

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

BarModule1.hs выглядит следующим образом:

module BarModule1 where

import Foo.FooModule1
...

У меня также есть файл .cabal, определяющий src как hs-source-dirs, и, конечно, оба модуля перечислены в нем.

Когда я в файле BarModule1.hs в Emacs, и я делаю C-c C-l, он говорит:

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.

Также я хочу использовать hlint с flymake-haskell-multi-load, и если я активирую этот режим с помощью M-x flymake-haskell-multi-load, hlint всегда будет показывать ошибку, что он не может найти модуль Foo.FooModule1, потому что он не знает о файле .cabal, в котором я указываю, что hs-source-dirs: src.

Итак, мой вопрос: Как я могу сделать haskell-mode и flymake/hlint знать о моем каталоге/дереве проекта, чтобы он нашел все модули?

В качестве альтернативы, как я могу сообщить им о модулях, указанных в моем файле .cabal?

Ответ 1

Как для haskell-mode установите haskell-process-type в cabal-repl в ваш init файл emacs и убедитесь, что используете interactive-haskell-mode (not inf-haskell-mode):

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

Ответ 2

Моя конфигурация emacs основана на Emacs Prelude. И я также создаю песочницу для проекта с cabal sandbox init.

Для аналогичной проектной структуры haskell-mode работает хорошо. Я могу C-c C-l загружать текущий файл в repl без ошибок. Но flycheck не может разрешить все модули и выделять операторы import с ошибками:

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

Существует проблема поддержка песочницы Cabal в GHС# 293 с решением. Вам нужно создать .dir-locals.el в корне proj, который предоставляет необходимые переменные.

((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 - это cabal.sandbox.config (вам может понадобиться сначала создать песочницу) package-db
  • flycheck-ghc-search-path - это путь к proj/src

Ответ 3

В командной строке в ghci: :set -iproj/src/