Emacs配置流水账

一直看Haskell群里的人安利Emacs,于是想试试看到底怎么样。遇到的问题什么的大概都会堆到这里嗯。

安装Emacs

之前也是道听途说Spacemacs这个Emacs发行版做的非常好,于是就偷懒直接用未修改的spacemacs了(其实是不会改吧。

先到GNU官网弄个Emacs原版,然后把spacemacs配置文件clone到~/.emacs.d/就行了。

安装Haskell-Mode

spacemacs默认似乎并不带许多语言的支持,所以第一件事当然是要先装上haskell-mode。按照文档一步步来就没问题了。

这么干会被spacemacs无情的删掉!正确的方法请看下面(

待更。


2016.01.31 update

快捷键好多啊orz 而且Evil这货是要我同时背下emacs和vim的快捷键吗!(虽然确实很好用(逃

install custom packages

不同于普通的Emacs直接使用M-x package-install,spacemacs竟然会自动删掉这样装好的包… 对于一个啥都不懂的新手来说真是无比嘲讽。出现这个问题的原因是因为spacemacs引入了layer的概念(大概相当于文件夹?),不属于任何layer的包会被当作orphan包删掉… 解决办法:

  • 不使用layer

不使用layer的方法也是可行的,不过最好还是不要这么干。只需要把包加入配置文件中的dotspacemacs-additional-packages就好了。大概就是…

1
(setq dotspacemacs-additional-packages '(<package-1> <package-2> ...))

然后可以在dotspacemacs/user-config里写配置。

  • 创建一个自定义layer

比如说我需要装各种haskell插件,于是M-x configuration-layer/create-layer先创建一个layer,位置在private就好(文档上看似乎只有private是装包能用的,不过git will be ignored是怎么回事…)。之后就会要求给这个layer起个名字,我这里叫Haskell(然而规范都是小写,好孩子不要学)。

生成好的文件位于~/.emacs.d/private/<layer>下,结构大概像这样:

1
2
3
4
5
6
7
8
9
[layer-name]
|__ [local]*
| |__ [example-mode-1]
| | ...
| |__ [example-mode-n]
|__ config.el*
|__ funcs.el*
|__ keybindings.el*
|__ packages.el

看不懂也没什么关系… 只需要打开(C-x C-fpackages.el修改一下就行了。比如我想要装haskell-mode,ghc-mod,structure-haskell-mode这三个插件,那么就要把这里改成这样:

1
2
3
4
5
6
7
(setq Haskell-packages
'(
;; package names go here
haskell-mode
ghc
shm
))

这样还不算完成配置,还需要为每一个包定义初始化函数。

1
2
3
4
5
6
7
8
(defun Haskell/init-haskell-mode ()
(use-package haskell-mode))

(defun Haskell/init-ghc ()
(use-package ghc))

(defun Haskell/init-shm ()
(use-package shm))

这里只用了最简单的use-package变量,更多的用法可以参考use-package文档。快捷键什么的,以后再折腾吧。

配置好以后使用C-x C-s保存,然后SPC f e R可以重新加载配置文件,之后emacs就会安装列出来的这些包了。

更改主题

其实本来spacemacs默认的主题给我的印象还不错,直到我打开了一个haskell文件… 所以更换一个更顺眼的主题就是下一个折腾的目标了。毕竟现在还不会手写emacs lisp来搞一些黑科技,所以姑且就先求助于themes-megapack吧。

这个包好想自带了,所以只需要在~/.spacemacs里面的dotspacemacs-configuration-layers中添加themes-megapack就好了。里面大概有86种主题(虽然好看的没几种),可以在theme gallery预览。个人还是比较偏好sanityinc-tomorrow-night啦,monokai在这里支持的着色似乎有些少?

可以使用SPC T h来选择主题,但需要注意的是这不是永久变更。如果更改每次启动时加载的主题的话,需要把~/.spacemacs里面的dotspacemacs-themes的第一项改成选好的主题名字。


2016.02.01 update

添加自动补全

话说默认竟然是没有自动补全的还是有点不爽,虽然什么都自己动手来大概就是开源社区的哲学吧(。打开基础的补全功能需要auto-complete这个插件,在.spacemacs里取消注释就行了。之后需要为auto-complete提供一个后端,这里用company-ghc。安装什么的都和上面一样,配置里要显示指明一下:

1
2
3
4
5
6
7
(defun haskell/init-company-ghc ()
(use-package company-ghc)
:init
(require 'company)
(add-hook 'after-init-hook 'global-company-mode) ;; global mode
(add-to-list 'company-backends 'company-ghc)
(custom-set-variables '(company-ghc-show-info t)))

这样就能实现函数的补全了。标准库什么的完全没问题!不过目前来看还有两个缺点,一个是启动时速度有些慢,另一个比较烦的是没法补全模块名称。这个哪天再折腾一下吧。

haskell-mode的一些完善工作

首先,装一些不错的包

1
cabal install hasktags structured-haskell-mode stylish-haskell present

给haskell-mode添加一些key-bindings

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
;; (defun haskell/init-haskell-mode ()
;; ...
:config
(custom-set-variables
'(haskell-process-suggest-remove-import-lines t)
'(haskell-process-auto-import-loaded-modules t)
'(haskell-process-log t)
;; add cabal repl support.if use stack, replace 'cabal-repl with 'stack-ghci.
'(haskell-process-type 'cabal-repl))

(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-c C-z") 'haskell-interactive-switch)
(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)
(define-key haskell-mode-map (kbd "SPC") 'haskell-mode-contextual-space)))
(eval-after-load 'haskell-cabal '(progn
(define-key haskell-cabal-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
(define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-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)))

然后可能就是折腾一下ghc-mod和学习一下它们复杂的快捷键了orz。


2016.02.02 update

啊啊果然之前是ghc-mod没有配置好。每次都在这里po配置实在太麻烦了,于是把配置放在了github上(https://github.com/SuperHex/spacemacs-haskell-config)。
之后就专心维护这份配置文件了!之后可能会研究一下传说中逆天的org mode,希望能解救我于堆积如山的bookmark之中吧(。今天好水啊(。