Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
emacs中的haskell repl_Haskell_Emacs_Read Eval Print Loop_Haskell Mode - Fatal编程技术网

emacs中的haskell repl

emacs中的haskell repl,haskell,emacs,read-eval-print-loop,haskell-mode,Haskell,Emacs,Read Eval Print Loop,Haskell Mode,嗨,我从haskell开始,并试图为其开发建立我的emacs 我有haskell mod和ghc mod最新的emacs 24.3.1。GHC is7.6.3 我已经创建了一个haskell文件first.hs,当我创建时,C-C-l 它要求: start a new project named haskell ? y or n 我的目录名是哈斯克尔。我按y键 Set the cabal directory 我尝试了~/.cabal和我当前的目录名为haskell Set the curre

嗨,我从haskell开始,并试图为其开发建立我的emacs

我有
haskell mod
ghc mod
最新的
emacs 24.3.1
。GHC is
7.6.3

我已经创建了一个haskell文件first.hs,当我创建时,
C-C-l
它要求:

start a new project named haskell ? y or n
我的目录名是哈斯克尔。我按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)
我怎样才能得到回复

我读到我可能需要降低ghc版本以使其工作。 这是个好办法吗

解决方案

我在init.el中有多个
自定义设置变量,这导致了问题。

UPDATE 2017 现在我们已经有了,我建议您尝试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-l
到REPL中(您始终可以使用
C-C-z
在两个窗口之间切换,并且可以使用
C-C-k
清除REPL缓冲区(在内部)

唯一的缺点是Intero通常在您的项目中本地安装,因此新项目的第一次启动需要一段时间Intero才能下载/编译/启动,但这没什么大不了的,您会收获很多


更新 既然
stack
已退出并运行良好,我建议将
haskell进程类型设置为
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模式相同),并替换了
公司的后端(尽管这个非常慢,我希望找到更好的)

变量 您通常在Haskell模式的Emacs/配置中设置这些

(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无关,但属于从属关系)
  • 公司阴谋集团
  • ghci公司
  • ghci完成
  • 莎士比亚模式(为Yesod)
  • 公司快速帮助(用于漂亮地显示
    :i

弗斯特 如果它询问你的阴谋集团目录-它想知道你的
myProject.cabal
文件在哪里-如果你没有,就拿你文件所在的文件夹(默认-我认为默认的/find直到现在都没有失败)

如果您需要一些示例-.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沙箱。 此外,这将向名为haskell process log的缓冲区添加更多日志信息,您可以在其中找到有关问题的更多信息

我将其用于ghc 7.8.3和ghc 7.8.3编译的ghc mod 5.1.0.2版

当然,您必须确保您的
.cabal
文件夹和
ghc mod
所在的位置在您的路径中(我认为您也可以在emacs设置中的某个位置进行配置,但这样做要容易得多)

评论
  • 您必须在emacs中安装程序包
    ghc
    ,而不是
    ghc mod
  • 我以前在使用不同版本的ghc mod和emacs软件包时遇到过问题,所以请确保您使用cabal安装获得了最新版本,然后重新安装emacs软件包(不过,这只是我在解析ghc输出时遇到的问题)
进一步资料 如果这对您没有帮助,请随时

  • 添加评论
  • 看一看这本书
  • 看一看这本书
在我的机器上运行示例 我编辑了如下示例文件:

然后我点击C-C-l并按下y:

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

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


谢谢我发现我有多个
自定义设置变量,这导致了中断。嗨,你能给你的新emacs配置Slack吗..或者这是
haskell进程类型的唯一变化
@AshishNegi完成了-但这真的没什么大不了的-它与
haskell模式一样工作
谢谢你花时间进行了一次非常彻底的讨论response@SteveB.正如您提到的,我可能应该添加另一个更新,因为现在我们有Intero(),我将使用它而不是Intero