Haskell模式不适合我的项目,找不到模块

时间:2014-06-26 23:13:26

标签: haskell emacs 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,当然这两个模块都列在其中。

当我在Emacs中的BarModule1.hs文件中并且我执行 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.

此外,我想将hlintflymake-haskell-multi-load一起使用,如果我使用 Mx flymake-haskell-multi-load激活该模式,hlint将始终显示错误它无法找到模块Foo.FooModule1,因为它不知道.cabal文件,我在其中指定了hs-source-dirs: src

所以我的问题是: 如何让haskell-modeflymake / hlint了解我的项目目录/模块树,以便找到所有模块?

或者,如何让他们了解我的.cabal文件中指定的模块?

3 个答案:

答案 0 :(得分:3)

至于haskell-mode在您的emacs init文件中设置haskell-process-typecabal-repl,并确保使用interactive-haskell-mode(不是inf-haskell-mode):

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

答案 1 :(得分:3)

我的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.

解决方案存在问题Support Cabal sandboxes in GHC #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
  • 的路径

答案 2 :(得分:2)

在ghci::set -iproj/src/

的提示符下