在 emacs 中,stack-ghci 无法加载接口文件,但命令行中的 `stack build` 可以

In emacs stack-ghci cannot load interface files but `stack build` from the command line does

我可以从命令行 stack build 一个项目,但是当我在 emacs 中尝试 C-c C-l 时(使用 (custom-set-variables '(haskell-process-type 'stack-ghci)))我得到一个错误,我导入的所有包模块都不能'找不到。

/home/amcp011/bec/amcp011/accelerate/gpe/src/Numeric/GPE/Utils.hs:30:1: error:
    Failed to load interface for ‘Data.Array.Accelerate’
    Locations searched:
      Data/Array/Accelerate.hs
      Data/Array/Accelerate.lhs
      Data/Array/Accelerate.hsig
      Data/Array/Accelerate.lhsig
      /home/amcp011/bec/amcp011/accelerate/gpe/src/Data/Array/Accelerate.hs
      /home/amcp011/bec/amcp011/accelerate/gpe/src/Data/Array/Accelerate.lhs
      /home/amcp011/bec/amcp011/accelerate/gpe/src/Data/Array/Accelerate.hsig
      /home/amcp011/bec/amcp011/accelerate/gpe/src/Data/Array/Accelerate.lhsig

gpe.cabal:

build-depends:       base >= 4.7 && < 5
                   , bytestring
                   , bytestring-conversion
                   , mtl
                   , time
                   , filepath
                   , directory
                   , accelerate
                   , accelerate-io

stack.yaml:

extra-deps: [accelerate-1.0.0.0
            ,accelerate-io-1.0.0.0
            ]

我能够使用 stack build 编译您的项目(当然,在安装了一些系统范围的依赖项之后,如 llvm、cuda、fftw3 等)并在 emacs 中使用 C-c C-l 加载它.

这是对我有用的最小 emacs 配置:

(defun haskell-mode-setup ()
  (setq haskell-process-type 'stack-ghci))

(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
(add-hook 'haskell-mode-hook 'haskell-mode-setup)

我能够复制您遇到的问题的唯一方法是使用 inf-haskell-mode,而不是 interactive-haskell-mode,以及简单地通过设置 (setq haskell-process-type 'ghci)。因此,emacs 可能找不到 stack.

我建议尝试让 haskell-mode 知道堆栈在哪里,以防它安装在不常见的位置:(setq haskell-process-path-stack "/path/to/stack").

或者,我过去解决了一些与 $PATH 环境变量相关的问题,该变量与为当前用户设置的不同,但在系统范围内使用。只需安装 exec-path-from-shell emacs 软件包并将 (exec-path-from-shell-initialize) 添加到 ~/.emacs.

此外,如果您还没有这样做,检查 haskell-mode 日志可能会很有用。将 (setq haskell-process-log t) 添加到 haskell-mode-setup,这将导致带有日志的额外缓冲区。

备注:

  • 为了编译你的包,我不得不从 stack.yaml 中删除几行,即包含本地目录 /home/amcp011/local/ 的行,它们不包含在 repo 中并使用我安装的系统 gcc 而不是 RHEL6.3.
  • 中的一个
  • 如果您使用 haskell-mode 之外的其他一些 emacs 包,它们也可能是问题的原因。我用 interoflycheck 测试过它没有任何问题。
  • 尝试升级到最新的 stack upgradehaskell-mode,也许会有帮助。我已经在 emacs-25.2.2
  • 上使用 stack-1.5.1haskell-mode-20170824.1124 进行了测试