如何在emacs上搭建haskell环境?

如何在emacs上搭建haskell环境?haskell-mode似乎elpa上没有

melpa 才有 haskell-mode,再安装 eglot(或者lsp-mode) + haskell-language-server 就可以了。

haskell 工具链(包括 haskell-language-server)可以用 ghcup 安装,现在支持三大平台了。

(when (>= emacs-major-version 24)
    (require 'package)
    (setq package-archives '(("gnu"   . "http://elpa.emacs-china.org/gnu/")
			     ("melpa" . "http://elpa.emacs-china.org/melpa/")
			     ("org" . "https://elpa.emacs-china.org/org/"))))

;; cl - Common Lisp Extension
(require 'cl-lib)

;; Add Packages
(defvar my/packages '(
			   ;; --- Auto-completion ---
			   company
			   ;; --- Better Editor ---
			   smooth-scrolling
			   hungry-delete
			   swiper
			   counsel
			   smartparens
			   popwin
			   ;; --- Major Mode ---
			   js2-mode
			   markdown-mode))

;; ...

;; 文件末尾
(provide 'init-packages)

上面是我的包管理设置,您看对不对?我输入M-X package-list-packages 实在是没找到haskell相关的任何包,估计是我设置哪里有问题?

应该要在最后加上下面这句,启动 package

(package-initialize)

然后你执行一次 M-x package-refresh-contents 刷新包的列表试试看。

终于搞定了,谢谢!

haskell-language-server似乎melpa里也没有,我安装了haskell-mode和eglot,还需要什么配置吗?

如何调出haskell的交互界面出来?就是那个ghci一样的界面有吗?

这个是 LSP 的后端,不需要在 Emacs 里面装,需要在你的系统里面安装,建议你看下它官方文档。 一般 Linux 发行版的包管理器就可以直接安装。没有的话也可以用 ghcup 来安装,跨平台的。

这个功能需要你在 haskell-mode 里面配置,这是我设置:

(use-package haskell-mode
  :ensure t
  :hook
  (haskell-mode . interactive-haskell-mode)
  (haskell-mode . haskell-indentation-mode))

然后,你在 haskell buffer 下 按 C-c, C-l 应该就可以掉出来了。 Happy Hacking!

非常感谢,使用成功了。但是似乎容易restart

这个是什么意思?能截图说明一下吗?

如图,左边是代码,右边是C-c C-l运行,下方mini-buffer提示死掉,要restart

这个问题我也遇到过,估计是你 Haskell 环境安装的问题,不是 haskell-mode 的原因。
可能跟你安装的 ghc 版本以及 cabal-install 的版本或者 stack的版本有关。

你如果安装了 cabal,可以试试在终端下通过 cabal init 来初始化一个项目,然后再打开试试?

我是直接sudo apt install 安装了haskell-platform的。然后在emacs里安装了haskell-mode和eglot,按你说的设置了。现在我直接M-x run-haskell会出错:

GHCi, version 8.4.4: http://www.haskell.org/ghc/  :? for help
ghc: could not execute: x86_64-linux-gnu-gcc
Process haskell exited abnormally with code 1

你可以试试更新 ghc 版本看看,我用 8.10.7 在 Mac 上一切正常。其他系统目前没环境测试。

命令行直接输入ghci是正常的

设置一下 haskell-process-path-ghci 、haskell-process-path-cabal 、haskell-process-path-stack 。并且 (setq haskell-process-type 'ghci) 。应该能解决问题。我也遇到了这个问题。详细解释可以看 haskell-mode 文档。