在过去,我曾尝试在Emacs中开发Haskell时获得更多类似IDE的体验,但我总是偶然发现不能完全集成。
有没有办法获得基本的GHC功能(例如查找标识符类型或使用flymake进行即时编译),这些功能正常工作*。通过工作,我的意思是与生态系统的其他部分(例如haskell模式,cabal)很好地整合?
*在这里工作基本上意味着:只需要在init.el中进行一些基本配置,并且可能从Hackage安装一些软件包。
答案 0 :(得分:7)
对于内联错误检查,hdevtools是我发现的最好的。它是运行GHC的后台服务器,以加快分析程序。
实际上很容易安装:你需要一个Haskell包:
cabal install hdevtools
和两个Emacs软件包,均通过M-x list-packages
:flycheck
和flycheck-hdevtools
。
安装完成后,您只需要使用M-x global-flycheck-mode
(您也可以将其放在.emacs
中)启用它。您可以使用C-x `
转到下一个错误。您可能还需要更改错误和警告面,您可以使用M-x customize-group flycheck-faces
。
不幸的是,Emacs模式只会出错和警告(包括hlint);它没有暴露检索标识符的类型,我相信hdevtools
支持。当遇到Unicode变量名或某些扩展时,它有时会给我随机解析错误;但是,如果我只是忽略它们,其他一切都有效。我应该提交错误报告或其他内容。
答案 1 :(得分:7)
查看蒂姆的出色设置:
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))