spacemacs 是什么?
"Spacemacs is a new way to experience Emacs – a sophisticated and polished set-up focused onergonomics, mnemonics and consistency."
简而言之,spacemacs 就是给你提供一套功能强大、易于扩展的开箱即用配置,使你基本不需要折腾也可以享受使用 emacs 的快感。So,come on,折腾起来吧!
以下是我的基本环境:
emacs 版本 : emacs 25.2
系统 : ubuntu-MATE 18.10
python : python 3.7.1( anaconda3 )
0x01 安装与基本配置
spacemacs 的安装非常简单,直接将 github 的仓库克隆的家目录的 .emacs.d 目录就可以了
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
之后重启 emacs 时就会自动安装了。安装过程建议选择 vim 跟 helm。
spacemacs 在安装过程中会在家目录下创建 .spacemacs 文件,如果下载插件速度太慢,可以考虑使用清华镜像源,具体使用方法如下:
添加下面的代码到 .spacemacs 的 dotspacemacs/user-init()
(setq configuration-layer--elpa-archives
'(("melpa-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
("org-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")
("gnu-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")))
其他国内的镜像也可以,添加方法与上面一样。
0x02 spacemacs 配置文件结构
.spacemacs 的基本结构如下图:

可以看到整个文件主要由 4 个函数组成,其中
-
layers
主要包含对 layer 的相关配置 -
init
主要初始化一些变量,除了对其中的变量值进行修改外,一般不建议进行修改 -
user-init
是用户自定义初始化代码的位置,比如之前配置国内镜像源的代码 -
user-config
包含一些用户的自定义配置
其中,这四个函数执行顺序为
init -> user-init -> layers -> user-config
.spacemacs 文件可以在 emacs 中通过 SPC f e d
快速打开进行编辑, 编辑完成后通过 SPC f s
进行保存,然后通过 SPC f e R
重新加载修改过的 .spacemacs 文件。
还有一种方式是在家目录下创建一个 ~/.spacemacs.d/ 的目录,然后将 .spacemacs 文件重命名为 init.el 后存放到 .spacemacs.d/ 目录中,以后我们创建的 layer 也可以放在这里。
0x03 配置 layers
1.加载新的 layer
之前所说,spacemacs 以 layer 来组织 emacs 的配置,包括我们自定义的配置也可以通过创建一个 layer 来实现。spacemacs 内置了许多 layer,可以通过 SPC h SPC
来进行检索,然后将需要添加的 layer 添加到 .spacemacs 中 layers 函数的 dotspacemacs-configuration-layers
变量中。

注意: 引入的每一个层本质上都是一个 list,只要你开心,可以把每一个层用括号括起来,针对特定层的一些配置可以在这里进行配置。比如后面会提到的 flyspell 的错误就会采用这种方式进行修复。
2. 添加不包含在 layer 中的包
可以在下列语句中添加想要安装的包,然后下次启动 emacs 时就会自动安装了。如果需要对包进行更多的配置,那么可以创建自己的 layer,然后在自己创建的 layer 中引入。
dotspacemacs-additional-packages '(youdao-dictionary)
3. 删除用不到的包
有时候我们添加的 layer 中有一些自己平时用不到的包,这时候可以在像下面这样删除掉
dotspacemacs-excluded-packages '(org-projectile)
0x04 创建自己的 layer
创建自己的 layer 可以很方便地将自己的配置进行集中存放,便于管理。
1. layer 基本结构
下面是 spacemacs 文档中建议的 layer 结构,我们可以仿照这个结构创建自己的 layer
[layer_name]
|__ [local]
| |__ [package 1]
| | ...
| |__ [package n]
|-- layers.el
|__ packages.el
|__ funcs.el
|__ config.el
|__ keybindings.el
[] = directory
2. 创建 layer
spacemacs 内置创建 layer 的命令为
configuration-layer/create-layer
,运行之后,会询问 layer 的位置,默认的是 ~/.emacs.d/private/ ,可以通过修改
dotspacemacs-configuration-layer-path '("~/.spacemacs.d/layers")
进行调整。之后不要忘了将 layer 添加到 dotspacemacs-configuration-layers
中。
3. 在 layer 中安装新的包
首先需要在 layer 的 package.el 文件中找到下列语句,然后将包名添加进去,如果需要的包不在官方仓库中,可以指定远程 repo 或者本地目录。
(defconst zeamonk-packages
'((aweshell
:location (recipe :fetcher github :repo "manateelazycat/aweshell"))
)
)
然后创建包的初始化函数,其格式为 layerName/init-packageName
(defun zeamonk/init-aweshell ()
(use-package aweshell
:config
(spacemacs/set-leader-keys "osn" 'aweshell-new)
)
)
0x05 一些更好的配置
1. 修复 flyspell 中文错误
启动 emacs 时出现如下错误:
Error enabling Flyspell mode:
(Error: No word lists can be found for the language "zh_CN".)
这个错误提示的很明显了,直接关掉中文检查即可
(spell-checking :variables
ispell-program-name "aspell"
ispell-dictionary "american"
spell-checking-enable-by-default nil)
2. python 虚拟环境使用
码 Python 代码时,代码补全特别是一些第三方库需要 emacs 工作在特定的虚拟环境下,为了解决这个问题 python layer 内置了 pyvenv 来处理虚拟环境,其默认的虚拟环境目录为 ~/.virtualenv,可以通过在初始化时,也就是在 user-init
函数中指定自己的虚拟环境路径
(setenv "WORKON_HOME" "/path/to/virtual/envs/")
之后在编辑 py 文件时,可以通过 , V w
调用 pyvenv-workon
命令来选择虚拟环境。
3. 导入elisp手册
当时吸引我从 vim 转到 emacs 很重要的一个原因就是 emacs 的文档非常齐全,查看也很方便 C-h i
可以快速进入 info 模式,但是不知道为啥,我在装好 emacs 后发现没有 elisp 内置的文档。在这种情况下需要自己去下载 An Introduction to Programming in Emacs Lisp,依次执行下列两步:
- 移动eintr.info.gz到info目录
$ sudo cp eintr.info.gz /usr/share/info/
$ cd /usr/share/info/
- 安装
$ sudo ginstall-info --info-file=eintr.info.gz --dir-file=dir
4. 几个方便 hack 的函数
下面几个函数是我在学习 spacemacs 中为了方便自己写的,可以给大家做个参考:
(defun zeamonk-quick-eval-a-s-expr ()
"quick eval a symbol expression"
(interactive)
(save-excursion
(progn
(move-end-of-line 1)
(call-interactively #'eval-last-sexp))
)
)
(defun zeamonk-quick-eval-selected-region ()
"eval a selected region"
(interactive)
(progn
(call-interactively #'eval-region)
(evil-force-normal-state)
)
)
(defun zeamonk-truncate-lines ()
"turncate-lines in org-mode"
(interactive)
(setq truncate-lines nil)
(visual-line-mode))
5. 对 spacemacs 改进的配置
- 修改 evil 的 escape 键
习惯了 vim 的同学一般会将 esc 映射为j j
或j k
,毕竟使用esc
实在是太反人类了, spacemacs 通过evil-escape
插件来实现这个功能,可以自己通过下列语句定义:
(setq-default evil-escape-key-sequence "jk")
-
jk
移动时以屏幕行为单位
(define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line)
(define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line)
- 补全时使用
C-n
、C-p
来选择补全项
(define-key evil-insert-state-map (kbd "C-n") 'company-select-next)
(define-key evil-insert-state-map (kbd "C-p") 'company-select-previous)
欢迎关注公众号 LazyMonk,不定时分享好玩的代码

网友评论