我如何快速,轻松地为Emacs配置GHC集成



过去,我试图在emacs开发haskell时获得更多的IDE经验,但我总是偶然发现了不够工作的集成。

是否有一种方法可以获得基本的GHC供电功能(例如,使用FlyMake查找标识符的类型或即时编译),而这些功能恰好工作*。仅凭工作,我的意思是与其余的生态系统(例如Haskell Mode,Cabal)融为一体?

*在这里工作基本上是指:仅在init.el中需要一些基本配置,也许需要从hackage中安装一些软件包。

对于内联错误检查,HDEVTools是我发现的最好的。这是运行GHC的背景服务器以加快分析程序的速度。

实际上非常容易安装:您需要一个Haskell软件包:

cabal install hdevtools

和两个Emacs软件包,包括M-x list-packagesflycheckflycheck-hdevtools

安装后,您只需要使用诸如M-x global-flycheck-mode之类的东西启用它(您也可以将其放入.emacs。)您可以使用C-x `进行下一个错误。您可能还想更改错误和警告面,您可以使用M-x customize-group flycheck-faces进行。

不幸的是,emacs模式唯一会发生错误和警告(包括hlint);它不会暴露检索标识符的类型,我相信hdevtools支持的标识符。当面对Unicode变量名称或某些扩展名时,有时还会给我随机解析错误;但是,如果我只是忽略它们,其他一切都可以。我可能应该提交错误报告或其他内容。

查看蒂姆的出色设置:

http://tim.dysinger.net/posts/2014-02-18-haskell-with-emacs.html

更新:

这就是我要做的:

(defmacro hcRequire (name &rest body)
  `(if (require ',name nil t)
       (progn ,@body)
     (warn (concat (format "%s" ',name) " NOT FOUND"))))
(hcRequire haskell-mode-autoloads
  (autoload 'ghc-init "ghc" nil t)
  (add-hook 'haskell-mode-hook (lambda () (ghc-init) (flymake-mode)))
  (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
  (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
  (setq haskell-stylish-on-save t)
  (setq haskell-process-args-cabal-repl '("--ghc-option=-ferror-spans"
                                          "--with-ghc=ghci-ng"))
  (define-key haskell-mode-map (kbd "C-x C-d") nil)
  (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
  (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
  (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch)
  (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
  (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
  (define-key haskell-mode-map (kbd "C-c M-.") nil)
  (define-key haskell-mode-map (kbd "C-c C-d") nil)
  (define-key haskell-mode-map (kbd "C-c v c") 'haskell-cabal-visit-file)
  ;; Do this to get a variable in scope
  (auto-complete-mode)
  (defun hc-ac-haskell-candidates (prefix)
    (let ((cs (haskell-process-get-repl-completions (haskell-process) prefix)))
      (remove-if (lambda (c) (string= "" c)) cs)))
  (ac-define-source haskell
    '((candidates . (hc-ac-haskell-candidates ac-prefix))))
  (defun hc-haskell-hook ()
    (add-to-list 'ac-sources 'ac-source-haskell))
  (add-hook 'haskell-mode-hook 'hc-haskell-hook)
  ;; auto-complete-mode so can interact with inferior haskell and popup completion
  ;; I don't always want this.  Just turn on when needed.
  ;;(add-hook 'haskell-mode-hook (lambda () (auto-complete-mode 1)))
)
;; I'm not using this (YET)
;;(hcRequire shm
;;  (add-hook 'haskell-mode-hook 'structured-haskell-mode))

最新更新