以下是我的情景:
我正在使用以下目录/模块处理项目:
|--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.
此外,我想将hlint
与flymake-haskell-multi-load
一起使用,如果我使用 Mx flymake-haskell-multi-load
激活该模式,hlint
将始终显示错误它无法找到模块Foo.FooModule1
,因为它不知道.cabal
文件,我在其中指定了hs-source-dirs: src
。
所以我的问题是: 如何让haskell-mode
和flymake
/ hlint
了解我的项目目录/模块树,以便找到所有模块?
或者,如何让他们了解我的.cabal
文件中指定的模块?
答案 0 :(得分:3)
至于haskell-mode
在您的emacs init文件中设置haskell-process-type
到cabal-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/