带有 cabal 项目的 emacs haskell-mode “无法识别 `--ghc-option=ferror-spans` 的目标语法”

问题描述

我正在尝试让 emacs haskell-modecabal 项目一起工作。每当我尝试以交互方式编译或加载文件时,我都会在 haskell-process-log

中得到以下输出

编译(通过(C-c C-c)):

cabal.exe:没有给出目标,当前目录中没有包。

加载时(通过(C-c C-l)):

cabal.exe:无法识别“--ghc-option=-ferror-spans”的目标语法


设置: 视窗 10, GHC 8.10.2, 阴谋集团 3.2.0.0,emacs 27.1, haskell 模式 20201120.755

我的 emacs init 文件有以下内容

(require 'haskell-interactive-mode)
(require 'haskell-process)
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)

(eval-after-load "haskell-mode"
    '(define-key haskell-mode-map (kbd "C-c C-c") 'haskell-compile))

(eval-after-load "haskell-cabal"
    '(define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-compile))

使用一个简单的 Haskell 项目,通过运行 cabal init

即带有Main.hs

module Main where

main :: IO ()
main = putStrLn "Hello,Haskell!"

my-project.cabal

cabal-version:       >=1.10
-- Initial package description 'my-project.cabal' generated by
--  'cabal init'.  For further documentation,see
-- http://haskell.org/cabal/users-guide/

name:                my-project
version:             0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file:        LICENSE
author:              ################
maintainer:          ##################
-- copyright:
-- category:
build-type:          Simple
extra-source-files:  CHANGELOG.md,README.md

executable my-project
  main-is:             Main.hs
  -- other-modules:
  -- other-extensions:
  build-depends:       base >=4.14 && <4.15
  hs-source-dirs:      
  default-language:    Haskell2010

如果我尝试通过 C-c C-c 进行编译,我会在 haskell-process-log 缓冲区中得到以下内容

cabal.exe:没有给出目标,当前目录中没有包。
对项目中的所有包使用目标“all”或指定包或
组件的名称或位置。有关
的更多详细信息,请参阅“cabal build --help” 目标选项。

如果我尝试通过 C-c C-l 加载,haskell 进程会立即终止,提示我重新启动并显示 haskell-process-log:

cabal.exe:无法识别“--ghc-option=-ferror-spans”的目标语法。

在我的 init 文件自定义变量中设置 '(haskell-process-log t)'(haskell-process-show-debug-tips t) 后,此更改为:

("Starting inferior `cabal repl' process using cabal ..." "my-project" nil "cabal" "repl" " --ghc-option=-ferror-spans")
-> Prelude.putStrLn ""
   :set -v1
   :set +c
-> :set prompt "\4"
-> :set prompt-cont "λ| "
<- cabal.exe: Unrecognised target Syntax for ' --ghc-option=-ferror-spans'.
Event: "exited abnormally with code 1 "
Process reset.

在处理单独的 haskell 文件时,emacs 中的一切正常,即不在 cabal 项目中。

通过命令行在 cabal 项目中编译和 cabal repl 也可以正常工作。

我已经搜索了文档并在谷歌上搜索了一天半的时间。任何帮助将不胜感激。

解决方法

结果证明这是 Cabal 中的一个错误。特别是在 cabal-install 命令行工具中,由于 Windows 用大写字母表示驱动器号,该工具阻止了 Windows 上主包的自动检测。

我已提交拉取请求:

https://github.com/haskell/cabal/pull/7310