【问题标题】:haskell repl in emacsemacs中的haskell repl
【发布时间】:2014-12-23 13:56:58
【问题描述】:

您好,我从 haskell 开始,并尝试设置我的 emacs 以供其开发。

我有haskell-modghc-mod 最新的emacs 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

只要按回车,因为它有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,这导致了问题。

【问题讨论】:

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


    【解决方案1】:

    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 在两个窗口之间切换,您可以使用清除 repl-buffer C-c C-k(在里面)。

    唯一的缺点是 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 相关的东西(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 模式
    • 公司(不是 Haskell 相关的,而是依赖项)
    • 公司阴谋
    • 公司-ghci
    • ghci 完成
    • 莎士比亚模式(适用于 Yesod)
    • company-quickhelp(用于很好地显示:i

    首先

    如果它询问您的 cabal 目录 - 它想知道您的 myProject.cabal 文件在哪里 - 如果您没有文件,只需获取文件所在的文件夹(默认 - 我认为默认/查找到现在为止从未让我失望)。

    如果你需要一些 sample-.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 设置中的某个位置进行配置 - 但这样更容易)。

    备注

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

    更多信息

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

    在我的机器上运行示例

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

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

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

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

    【讨论】:

    • 谢谢,我发现我有多个 custom-set-variables 并导致中断。
    • 嗨,你能用 Slack 给你的新 emacs 配置吗.. 或者它是 haskell-process-type 的唯一变化
    • @AshishNegi 完成了 - 但这真的没什么大不了的 - 它与 haskell-mode 一样工作
    • 感谢您抽出宝贵时间整理出非常详尽的回复
    • @SteveB。正如你提到的那样,我可能应该添加另一个更新,因为现在我们有了 Intero (haskell-lang.org/intero),我会使用它而不是 intero
    猜你喜欢
    • 2023-04-08
    • 2012-02-15
    • 2011-10-04
    • 2011-05-14
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多