首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速轻松地为Emacs配置GHC集成?

如何快速轻松地为Emacs配置GHC集成?
EN

Stack Overflow用户
提问于 2014-03-10 17:45:08
回答 2查看 1.8K关注 0票数 8

在过去,当我在Emacs中开发Haskell时,我试图获得一种更像IDE的体验,但我总是遇到不太有效的集成。

有没有办法获得基本的GHC支持的功能(例如,查找标识符的类型或使用flymake即时编译)*。我的意思是与生态系统的其余部分很好地集成在一起(例如,haskell-mode,cabal)?

*只在这里工作基本上意味着:只需要在init.el中进行一些基本的配置,也许还需要从Hackage安装一些包。

EN

回答 2

Stack Overflow用户

发布于 2014-03-10 18:19:06

对于内联错误检查,hdevtools是我发现的最好的。这是一个运行GHC的后台服务器,目的是为了加速分析程序。

它实际上很容易安装:您只需要一个Haskell包:

代码语言:javascript
复制
cabal install hdevtools

和两个Emacs包,都是通过M-x list-packages实现的:flycheckflycheck-hdevtools

安装完成后,您只需使用诸如M-x global-flycheck-mode (您也可以将其放入您的.emacs中)之类的东西来启用它。您可以使用C-x `转到下一个错误。您可能还希望更改error和warning外观,这可以使用M-x customize-group flycheck-faces完成。

不幸的是,Emacs模式只处理错误和警告(包括hlint);它不公开检索标识符的类型,我相信hdevtools支持这种类型。当遇到Unicode变量名或某些扩展名时,它有时也会给我带来随机的解析错误;但是,如果我忽略它们,其他一切都会正常工作。我可能应该写一份错误报告或者别的什么。

票数 8
EN

Stack Overflow用户

发布于 2014-03-11 11:03:54

查看Tim的出色设置:

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

更新:

这就是我要做的:

代码语言:javascript
复制
(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))
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22296676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档