在emacs中的haskell repl

时间:2014-10-28 08:22:01

标签: haskell emacs read-eval-print-loop haskell-mode

您好我开始使用haskell并尝试设置我的emacs以进行开发。

haskell-mod中有ghc-modemacs 24.3.1。 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

只需按Enter键,因为它有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 个答案:

答案 0 :(得分:13)

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,也可以使用堆栈安装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相关内容(堆栈与当前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的模式
  • 公司(不是Haskell相关,而是依赖)
  • 公司小集团
  • 公司ghci中
  • ghci中完成
  • 莎士比亚模式(针对Yesod)
  • company-quickhelp(显示:i

第一

如果它要求您提供 cabal目录 - 它想知道您的myProject.cabal文件的位置 - 如果您没有文件夹,请将文件夹放在哪个文件夹中(默认 - 我认为默认/发现直到现在都没有让我失望。

如果您需要一些示例-.emacs-setup

以下是我.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沙箱。 此外,这将向名为 haskell-process-log 的缓冲区添加更多日志记录信息,您可以在其中找到有关您的问题的更多信息。

我明确地使用ghc-mod version 5.1.0.2 compiled by GHC 7.8.3和GHC 7.8.3。

当然,您必须确保您的.cabal文件夹以及ghc-mod所在的位置(我认为您也可以在emacs设置中的某处配置 - 但它'这样就容易多了。)

备注

  • 您必须在不是ghc的电子邮件中安装软件包ghc-mod
  • 我之前遇到过不同版本的ghc-mod和emacs包的问题 - 所以请确保你使用cabal-install获得最新版本,然后重新安装emacs-package(仅解析ghc-output的问题)我的部分虽然)

进一步的信息

如果这对您没有帮助,请随时

样本在我的机器上运行

我编辑了一个这样的示例文件:

Helo Emacs

然后我按下C-c C-l并按y:

Step 2

接受文件夹(这是文件所在的位置)以及Ret的任何其他问题 - 现在您应该看到带有友好消息/ lambda的*haskell*缓冲区:

Step 3

最后我可以检查文件是否已加载:

enter image description here