在Emacs中使用Haskell REPL

12

嗨,我刚开始学习 Haskell,正在尝试为其开发设置我的 Emacs。

我在 Emacs 24.3.1 中安装了最新版的 haskell-modghc-mod。 GHC 是 7.6.3

我创建了一个 Haskell 文件 first.hs,当我按下 C-c C-l 时,它会询问:

start a new project named haskell ? y or n

我的目录名称是haskell。我按下了y

Set the cabal directory
我已经尝试过使用 ~/.cabal 和名为 haskell 的当前目录。
Set the current directory

刚按下回车键,因为它有Haskell目录

它显示错误消息:

haskell-process-start: cl-ecase failed: cabal-rep, (ghci quote cabal-repl quote cabal-ghci quote cabal-dev quote)

我该如何获得repl?

我看到可能需要降级ghc版本才能使其正常工作。这是一个好的解决方案吗?

解决方案:

我的init.el中有多个custom-set-variables,这导致了问题。

1个回答

18

更新 2017

现在我们有了Intero,我建议你尝试使用 Intero/Stack - 它的表现非常出色。

使用它后,我的配置变得更加简洁:

;; ----------------------------------------------------------------------
;; HASKELL
(require 'haskell-mode)
(require 'intero)
(add-hook 'haskell-mode-hook 'intero-mode)
(require 'flycheck)
(setq flycheck-check-syntax-automatically '(save new-line))
(flycheck-add-next-checker 'intero '(warning . haskell-hlint))

关于 REPL,您只需加载文件,然后使用 C-c C-l 进入 REPL(您可以始终使用 C-c C-z 在两个窗口之间切换,并且可以在内部使用 C-c C-k 清除 repl-buffer)。
唯一的缺点是 Intero 通常在项目中本地安装,因此第一次启动新项目时,Intero 需要下载/编译/启动,这需要一些时间 - 但这并不重要,您会获得更多收益。

更新

现在 stack 已经发布并运行良好,我建议将 haskell-process-type 设置为 auto,并使用 stack 安装 ghc-mod
以下是我当前使用的设置:
(require 'haskell-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
(add-hook 'haskell-mode-hook 'linum-mode)
(add-to-list 'exec-path "~/.local/bin")
(eval-after-load 'haskell-mode '(progn
  (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
  (define-key haskell-mode-map (kbd "C-c C-n C-t") 'haskell-process-do-type)
  (define-key haskell-mode-map (kbd "C-c C-n C-i") 'haskell-process-do-info)
  (define-key haskell-mode-map "\C-ch" 'haskell-hoogle)))
(eval-after-load 'haskell-cabal '(progn
  (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-ode-clear)
  (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
  (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)))

(require 'company-ghci)
(push 'company-ghci company-backends)
(add-hook 'haskell-mode-hook 'company-mode)
(add-hook 'haskell-interactive-mode-hook 'company-mode)

您可以看到,我基本上摆脱了所有与 ghc-mod 相关的东西(stack 可以与当前的 haskell-mode 直接使用),并替换了 company 后端(虽然这个速度非常慢,我希望能找到更好的替代品)。

变量

这些通常在 Emacs/Haskell-Mode 的配置中设置。

(custom-set-variables
 ;; there is of course more in here - these are the Haskell related:
 '(haskell-font-lock-symbols (quote unicode))
 '(haskell-hoogle-command nil)
 '(haskell-mode-hook
   (quote
    (linum-mode turn-on-haskell-indentation turn-on-haskell-doc-mode)) t)
 '(haskell-process-auto-import-loaded-modules t)
 '(haskell-process-load-or-reload-prompt t)
 '(haskell-process-log t)
 '(haskell-process-suggest-language-pragmas nil)
 '(haskell-process-suggest-no-warn-orphans t)
 '(haskell-process-type (quote auto))
 '(haskell-process-use-presentation-mode t)
 '(haskell-tags-on-save t)
 '(inferior-haskell-wait-and-jump t)
 '(safe-local-variable-values
   (quote
    ((haskell-process-use-ghci . t)
     (haskell-indent-spaces . 4))))
 (uniquify)))

这些是我添加的包:
  • haskell-mode
  • company(虽然不是与Haskell相关,但是是必需的依赖项)
  • company-cabal
  • company-ghci
  • ghci-completion
  • shakespeare-mode(用于Yesod)
  • company-quickhelp(用于漂亮的:i显示)

第一步

如果它要求你选择cabal目录,则需要知道你的myProject.cabal文件在哪里 - 如果你没有,请选择包含该文件的文件夹(默认情况下 - 我认为默认/查找从未让我失望过)。

如果你需要一些示例.emacs设置

以下是我.emacs文件的部分内容,适用于我:

(autoload 'ghc-init "ghc" nil t)
(autoload 'ghc-debug "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init)))
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)

(eval-after-load 'haskell-mode '(progn
  (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-or-reload)
  (define-key haskell-mode-map (kbd "C-`") 'haskell-interactive-bring)
  (define-key haskell-mode-map (kbd "C-c C-n C-t") 'haskell-process-do-type)
  (define-key haskell-mode-map (kbd "C-c C-n C-i") 'haskell-process-do-info)
  (define-key haskell-mode-map (kbd "C-c C-n C-c") 'haskell-process-cabal-build)
  (define-key haskell-mode-map (kbd "C-c C-n c") 'haskell-process-cabal)))
(eval-after-load 'haskell-cabal '(progn
  (define-key haskell-cabal-mode-map (kbd "C-`") 'haskell-interactive-bring)
  (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-ode-clear)
  (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
  (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)))

(custom-set-variables
 '(haskell-interactive-mode-hide-multi-line-errors nil)
 '(haskell-process-log t)
 '(haskell-process-type (quote cabal-repl)))

请注意带有(quote cabal-repl)的部分 - 这应该适用于cabal sandboxes。此外,这将向名为haskell-process-log的缓冲区添加更多日志信息,您可能会在其中找到更多关于您问题的信息。
我使用的是ghc-mod version 5.1.0.2 compiled by GHC 7.8.3和GHC 7.8.3。
当然,您必须确保您的.cabal文件夹和ghc-mod所在的位置在您的路径中(我认为您也可以在emacs设置中配置此项 - 但这种方式更容易)。
备注:
- 您必须在emacs中安装ghc软件包而不是ghc-mod。 - 我以前遇到过ghc-mod和emacs软件包版本不同的问题 - 因此,请确保您使用cabal-install获取最新版本,然后重新安装emacs软件包(仅涉及我的ghc输出解析问题)。
更多信息:
如果这不能帮助您,请随意:
- 添加评论 - 查看快乐的Haskell编程页面 - 查看ghc wiki on emacs 在我的计算机上运行示例:
我编辑了一个示例文件,如下所示:
然后我按下C-c C-l并按y:
接着接受文件夹(这是文件所在的位置)和任何其他问题,按Ret - 现在您应该看到一个友好的消息/lambda在*haskell*缓冲区中:
最后,我可以检查文件是否已加载:

谢谢,我发现我有多个custom-set-variables,导致了程序的中断。 - Ashish Negi
你好,你能给我你的新的emacs配置和Slack吗?还是仅仅修改了haskell-process-type - Ashish Negi
1
@AshishNegi完成了 - 但这真的不是什么大不了的事情 - 它与haskell-mode一起工作就可以了。 - Random Dev
感谢您抽出时间提供非常详尽的回答。 - Steve B.
@SteveB,正如您所提到的,我可能应该添加另一个更新,因为现在我们有了Intero(https://haskell-lang.org/intero),我会使用它来代替intero。 - Random Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接