问题描述
我正在尝试让 emacs haskell-mode 与 cabal 项目一起工作。每当我尝试以交互方式编译或加载文件时,我都会在 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
(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 上主包的自动检测。
我已提交拉取请求: