不知不觉中,我使用 spacemacs 的时间快。。。 哎,我竟然不记得了。 仔细想想应该还没有一年,因为我印象里去年过年的时候我使用的编辑器还是 vim。
在这之前,我是个 vim 党,并且有段时间试图找各种配置插件试图想让 vim 更强大。 直到不停的踩到坑后我才明白过来,vim 的配置能力其实并没有网上吹嘘的那么神。 由于 vim 的脚本 vimscript 不太好用而且效率低,加上 vim 本身缺乏足够的支持机制,所以 vim 的插件虽然很多, 但是好用的只有那么几个小巧的插件。其余的试图对 vim 进行大幅度扩展的,都不怎么好使,连凑合都说不上。
起初我只是眼馋 emacs 的 org-mode 功能,加上 spacemacs 对 vim 用户非常的友好,我就决定试一试 emacs。 这一试不要紧,从那之后,开 vim 的频率直线下降。如今,我写程序,记笔记等大部分时间都是泡在 emacs 里的。
1. 什么是 spacemacs?
首先介绍 emacs。 至于什么是 emacs,放百度谷歌一搜,各种把 emacs 捧上天的答案。 实际上 emacs 是一个拥有很大扩展能力的编辑器,并且鼓励用户使用全键盘来编辑文件。
emacs 的扩展和配置是使用一种 lisp 的方言 emacs-lisp 来编写的。 类似 vim,emacs 也是需要写代码来配置的,而且这种语言还和常见的 C,java,python 等常规语言很不一样。 虽然 emacs-lisp 的上手难度很高,但是由于 lisp 是一门完美的语言,这使得 emacs 拥有无限的扩展能力。
spacemacs 对于 emacs 来说,实质是一套配置文件。 它帮你集成了各种常见实用的插件,帮你解决这些插件间的兼容问题,帮你填上各种各样的坑。 而你,只需要读一遍文档,安装下 spacemacs,然后就直接得到一个开箱即用的漂亮强大的 emacs 啦!
spacemacs 的网站在这里 https://github.com/syl20bnr/spacemacs 这是个开源项目,任何人都能贡献自己的一份力量。可以看到,spacemacs 实际上是 emacs 的一组配置文件。
2. spacemacs 的优点
首先我个人觉得 spacemacs 最大的优点有两个:
- 设计良好的,位于 emacs 和用户之间的抽象
- 对 evil 的深度集成
spacemacs 可以看作是个中间层,对下它屏蔽了各种插件和配置复杂性,对上它向用户提供了简单而又统一的使用方案。 在 spacemacs 里面有个 layer(层)的概念,它把一系列的有关系的插件放一起打包成一个功能,添加这个 layer 即可使用。 既照顾到了便利性,开箱即用,又兼顾了灵活性,不需要的这个功能的用户可以不添加这个 layer。
其次 evil 是 emacs 中模拟 vim 按键功能的插件。而且它模拟的非常非常全,连 vim 的文本对象,宏都能完整的模拟出来! 而且这个插件的灵活性甚至比原生的 vim 还要强,比如说它可以很灵活的自定义自己的文本对象。 可以说,evil 是在 emacs 操作系统里重写了一个 vim
spacemacs 深度集成了 evil 相关的一系列插件,vim 用户用起来没有什么阻碍,体验很好。 另外,spacemacs 还照顾到了不用 vim 快捷键的用户,所以用原生的按键也是可以的。 甚至你还能在两种编辑方式中来回切换呢!
spacemacs 还有其它的一些优点像:
- 界面漂亮美观
- 丰富的文档(不过,是英文的)
3. 安装 spacemacs
现在开始使用 spacemacs 吧!
3.1. 下载 emacs
首先是下载 emacs。所谓 emacs 实际上就是个软件。 所以,linux 使用使用包管理器安装这个软件:
|
|
windows 下当然要去找安装包然后下载安装啦。 但是这里值得一提的是,官方网站下载的 emacs 功能是不全的!像图片显示,LTS 网络连接。 不知道是什么原因,他们没有把需要的一些动态链接库放进去,还得需要用户自己去找去下载。。。。
spacemacs 官方网站上推荐第三方的编译版本,这些麻烦的事情统统给你搞定了: http://emacsbinw64.sourceforge.net 好像还是个中国人做的,因为我注意到有中文的文档而且写的很原汁原味不像翻译的。
3.2. 配置文件路径
即使是在 windows 下,emacs 仍然固执的使用 linux 下 home 目录的概念。 在 windows 下,可以设置环境变量 HOME 的值来指定 home 目录。
有了这一点,你可以在系统里面配置一些 HOME 的值,还可以使用 bat 文件先设置 HOME 的值然后启动 emacs, 这样相当于给 emacs 做了绿化。
之后,涉及到两个目录:
- ~/.emacs.d/ 这是原始 emacs 放配置文件的目录。由于 spacemacs 提供的抽象,这个目录由 spacemacs 管理了,用户不用操心。
- ~/.spacemacs.d/ 这是 spacemacs 的配置文件。你需要操心的是这个,配置 spacemacs 都在这个目录里进行。
3.3. 安装 spacemacs
前面说到 spacemacs 其实是 emacs 的一组配置文件,所以你要把这组配置文件复制到~/.emacs.d/来:
|
|
windows 系统没有安装 git?你也可以直接去那个网址,download ZIP,然后解压到~/.emacs.d 也行。
然后启动 emacs!初启动时它会问你几个问题,其它的不用管默认就行,注意到有一个你询问你使用 vim 操作方式还是 emacs 操作方式, 按需选择就行。
spacemacs 只是一组配置文件,它所配置的插件还得额外从网络上下载。接下来它会试图下载插件。 如果你对你的网络没有信心,这个时候应该把它关掉然后配置镜像源。
3.3.1. 配置镜像
此时你的电脑上应该自动生成了一个文件 ~/.spacemacs
,这个就是 spaceamcs 的配置文件。 打开它,找到 (defun dotspacemacs/user-init ()
,在字符串的后面粘贴上:
|
|
这个源是由子龙山人提供的。这位大神是很厉害的一位使用 spacemacs 的程序员,而且为推广 spacemacs 做了很多贡献。 它还出了一系列的视频来教程 spacemacs,地址在这:https://github.com/emacs-china/Spacemacs-rocks 在优酷上就能找到它的一系列视频。 之前我也是看了这位大神的视频后,才知道 spacemacs 原来还有这么好用的功能!
之后重新启动 emacs,它会自动去镜像源上下载各种需要的插件。过大概 15 分钟吧,就能安装好了。 如果顺利的话,你就能看到如官网所示的那个漂亮的界面啦!
3.3.2. 配置代理
额外说一句,如果你有配置代理的需求的话,同样是在上面说的位置加上类似下面的代码:
|
|
由于我们使用了国内的镜像源,所以安装插件的时候就不需要使用代理了。
4. 基础配置相关知识
4.1. 配置文件管理
前面说到在安装 spacemacs 会自动生成 ~/.spacemacs
文件,这是 spacemacs 的配置文件。 但是由于这个配置文件只是单个文件,随着你个性化的配置越来越多,配置文件会越来越大, 单个的配置文件势必不好管理。
spacemacs 支持用另外一种文件夹的方式,管理配置文件:
- 首先建立
~/.spacemacs.d
目录。 - 把之前的
~/.spacemacs
文件移动到目录内重命名为 =init.el=。
好啦,这样, ~/.spacemacs.d
这个目录就是存放你关于 spacemacs 配置的地方啦。 你可以在目录内把配置文件分割成多个部分管理,也能把和 spacemacs 相关的东西一起扔进去。
注意对这个目录做好备份,随着使用时间的增长,这里面的配置,可都是适合自己,一砖一瓦磊起来的心血啊!
4.2. init.el 文件结构
init.el
文件里的结构是 spaceamcs 设计好的,这里面的结构不要随意改动。 这里面设计了四个相关的函数:
- dotspacemacs/layers: 这和 layer(层)的配置有关。
- dotspacemacs/init: spacemacs 的一些基本配置。不要随意改动这里的结构。
- dotspacemacs/user-init: 这里面是给用户写自己的配置代码的。这个函数会在 spacemacs 启动的初期调用。
- dotspacemacs/user-config: 这里面也是给用户写自己的配置代码的。不同是该函数会在 spacemacs 启动的最后阶段调用。
所以,user-init 函数用来写一些初始化的设置,比如上面介绍的,镜像源和代理设置。 而 user-config 一般用来写常规的个性化配置。
4.3. 基本配置选项
接下来看看 init 函数。注意到这个函数里面写了类似这样的内容:
|
|
其实这里面是 spacemacs 的部分配置选项。 比如说,第一个配置选项 dotspacemacs-elpa-https
,可以配置连接 elpa 时是否使用 https。t 表示使用,nil 表示不使用。
一些常用的配置选项我总结如下:
配置项 | 可选值 | 含义 |
---|---|---|
dotspacemacs-check-for-update | t/nil | 是否在启动时检查更新 |
dotspacemacs-editing-style | ‘vim/‘emacs/‘hybrid | 快捷键风格。(vim 风格/emacs 风格/混合风格) |
dotspacemacs-startup-recent-list-size | 数值 | 启动时列出多少最近编辑过的文件 |
dotspacemacs-fullscreen-at-startup | t/nil | 启动时是否全屏 |
dotspacemacs-maximized-at-startup | t/nil | 启动时是否最大化 |
dotspacemacs-line-numbers | t/‘relative/nil | 对于显示行号(绝对行号/相对行号/不显示) |
dotspacemacs-themes | 列表 | 配置主题。使用列表列出一系列主题,第一个会默认启用 |
4.4. layer 配置
layer 这个概念,是 spacemacs 提供的一个非常优秀的抽象。
spacemacs 把一组功能联系紧密的插件放到一起,然后帮你配置好它的各种烦碎细节,给你提供总体上的某个功能。 比如说,auto-completion 层提供补全的功能,org 层给你 org-mode 的良好使用体验,C-C++层能让你迅速把 emacs 变成 C/C++的 IDE 等等。
来看下 layer 这个函数。重点是这个函数中有类似如下的结构, dotspacemacs-configuration-layers
后接一个列表。
|
|
注意观察这个列表,假如这个 layer 没有配置选项,就直接写上,如 better-defaults
。 假如这个 layer 需要配置些东西,那么就要用一对括号括起来。
5. 按键和命令
5.1. leader 键
首先是普通编辑相关的快捷键,使用 vim 风格的话,由于 evil 插件的强力驱动,各种 vim 按键都能无缝在使用! 使用 emacs 风格的话,也能很好的使用 emacs 风格的编辑快捷键。
除此之外,spacemacs 充分挖掘 evil-leader(一个模拟 vim 的 leader 键的插件)的潜力, 把各种插件功能很好的整合到了 leader 键上,并且有良好的结构。
dotspacemacs 实际上有两个前缀键,leader 键和 major-mode-leader 键。
leader 键在 spacemacs 的默认快捷键是 SPC
(空格键),这也是 spacemacs 名称的由来。 leader 开头的快捷键在编辑任何文件的时候都能使用。 spacemacs 把各种功能的快捷键整合的很有规律,比如说, SPC f
是文件相关快捷键, SPC b
是缓冲区相关快捷键,等等。
至于 major-mode-leader,默认绑定到 ,
上,和很多 vim 用户的 leader 是一致的。 它和 leader 键不同在于,它里面的按键是和你编辑的文件有关系,你编辑 C++文件时是一套按键,而换到 org 文件是又是另外一套按键。 所以这个前缀键开头的是和你编辑的文件的类型相关的功能。
在 init.el
的 init
函数里面,能够改变默认的的 leader 和 major-mode-leader 键。
配置选项 | 说明 |
---|---|
dotspacemacs-leader-key | vim 按键风格下的 leader 键 |
dotspacemacs-major-mode-leader-key | vim 按键风格下的 major-mode-leader 键 |
dotspacemacs-emacs-leader-key | emacs 按键风格下的 leader 键 |
dotspacemacs-major-mode-emacs-leader-key | emacs 按键风格下的 major-mode-leader 键 |
快捷键的配置是一个字符串。 SPC
代表空格。 配置组合键的话,如 “M-m”是按住 alt 键然后按 m,”C-m”是按住 Ctrl 键再按 m。 “C-M-m”是按住 Ctrl 和 Alt 不动然后按 m,”C-M-S-m”是按住 Ctrl,Alt 还有 Shift 不动然后按 m。。。
为了方便表述,我自己一般会把这两个键称为
5.2. 命令
与 vim 类似,emacs 原生就有命令的概念。emacs 的命令实际上是一个特殊的 emacs-lisp 函数,执行特点的功能。 大多数的 emacs 快捷键,其实都是绑定到某个命令上的。按下这个快捷键就能执行命令。
当然,也能直接输入命令执行,而且有些命令是没有快捷键绑定的。
spacemacs 中,有两种方式执行命令:
:
看这个键就知道,是 evil 模拟出的执行命令功能。模拟了一些常用的 vim 命令。也能执行原生的 emacs 命令。<leader>:
这个是 emacs 自己的执行命令功能。能执行所有的 emacs 命令。
值得一提的,evil 模拟出来的命令模式,你甚至还直接执行 elisp 的表达式!
6. 主题和字体配置
很多人拿到一款编辑器后,首先配置的是什么?当然是主题和字体啊! 有了一款舒心漂亮的主题才能开开心心的写代码是不是。
在 spacemacs 里面配置这些特别简单。你不用自己去找各种主题了, spacemacs 提供了一个层,只要安装它,你就能享有上百种主题随心所欲切换!
6.1. 主题配置
这个层就是 themes-megapack。按照上面的介绍,在对应的位置写上 themes-megapack
即可。 之后重启 emacs,就会自动下载安装这个层依赖的一些东西。
这个层集合了大量 emacs 主题!安装之后,按 <leader>Ts
就能打开搜索窗口,选择顺眼的主题回车即可应用。
不过这只是暂时生效。想要永久生效,需要把喜欢的主题写入到 spacemacs 配置文件。 前面提到, init
函数里有个配置选项 dotspacemacs-themes
,它的值是一个列表,像这样:
|
|
这里我配置了三个主题。第一个主题默认生效。 使用快捷键 <mleader>Tn
,就能在这三个主题间来回切换。
6.2. 中文相关配置
默认的 spacemacs 在中文方面会遇到两个严重的问题:
- 对于 evil 用户,和 vim 类似会出现蛋疼的输入法问题。在插入状态切换到中文输入,退回普通状态,一按快捷键,得,崩出个输入法候选框。=_=
- 中文字体的配置比较麻烦,而且配置的不好会出现中文字体和英文字体宽度不合适,会使得像 org-mode 中的中英混排的表格无法对齐。
第一个问题在 Windows 下是不存在的,可是用 emacs 的还有很多 linux 用户呢!
令人激动的是,这两个问题在 spacemacs 中根本不是问题。 spacemacs 中提供了一个 chinese
层。这两个问题迎刃而解。
值得一提的是,这个层是前面提到的大神子龙山人贡献的!只要有实力,任何人都能向 spacemacs 贡献自己的一份力量使它变得更好!
添加 chinese
层:
|
|
chinese 层提供了一个函数可以方便的配置中英文字体。在 user-config
函数里加入:
(spacemacs//set-monospaced-font "Consolas" "微软雅黑" 14 16)
这就配置了英文字体为 Consolas,大小 14;中文为微软雅黑,大小 16。 在我的电脑上,14 比 16 这个比例正好能让英文和中文对齐。我不是很清楚在别人的电脑上是不是也是这样。。。
7. 帮助
7.1. 文档
由于 emacs 本身在国内使用的人很少,所以 emacs 的中文资料相对匮乏。 有时候想配置好一个功能你不得不自己去查找官方文档,或者自己使用 emacs 内置的功能找出想要的命令或设置。
emacs 和 spacemacs 本身都提供了丰富的文档。 这是 emacs 的官方文档: http://www.gnu.org/software/emacs/manual/html_node/emacs/index.html
spacemacs 的官方能找到 spacemacs 的各种文档,包括各种 layer(层)的文档: http://spacemacs.org 实际上,spacemacs 已经被文档内置到了 spacemacs 里面了。按 <leader> h SPC
就能查看 spacemacs 的各种文档了。
至于中文资料,这里有一份非常少见的优秀中文资料,是国内大神子龙山人的作品。 这位大神为推广 emacs 做了不少贡献,我之前看过他的很多视频后才很开心的发现:原来 spacemacs 还有这么好用的功能! https://github.com/emacs-china/Spacemacs-rocks
7.2. 忘记快捷键?
不用担心,spacemacs 集成了 which-key 插件。 比如说,你按下 leader 键,然后停止操作,过一小会儿就会弹出一个窗口提示你有哪些二级快捷键。
7.3. 查看启动信息
切换到 eamcs 的 *Messages*
缓冲区,按 <mleader>bb
选择缓冲区,选择 *Messages*
。 在这个缓冲区里面,你能看到 emacs-lisp 执行的各种输出信息,像各种警告和错误。 所以如果启动的时候出了点问题,在这里就能看到具体的提示信息。
7.4. 查看函数和变量
在摸索配置的时候需要查找 emacs-lisp 中函数和变量的文档。 快捷键 <mleader>hdf
能对所有的函数进行搜索。 快捷键 <mleader>hdv
能对所有的变量数进行搜索。
7.5. 查看命令和快捷键
<mleader>?
列出了目前所有可用的快捷键及其绑定的命令。 在这里你可以找到快捷键对应的命令,或者搜索对应的命令有哪些快捷键与之绑定。
想快速的查出一个快捷键对应的命令还有一个办法是, <mleader>hdk
,然后按下想查询的快捷键。
7.6. 运行 emacs-lisp
emacs 提供了一种交互式的 lisp 模式来运行 emacs-lisp 代码。 先按 <mleader>bs
进入 scratch 模式(SPC b s), 再通过命令 lisp-interaction-mode 进入 lisp 交互模式。 在 buffer 里面输入 emacs-lisp 代码,然后在普通状态下按 C-j,就能把执行的结果插入到缓冲区内。
8. 最后
emacs 是很优秀的编辑器,拥有无限的扩展能力。 由于 emacs 需要写 lisp 代码才能配置,这导致了 emacs 上手难度很高。 想要很好的配置你的 emacs,得要掌握这种奇怪的语言。 而一般开始使用 emacs 的很多都是初学编程的萌新呢,想指望着使用 emacs 来练习编程呢! 这就造成了一个“先有鸡还是先有蛋”的问题。所以 emacs 对编程新手来说非常非常的难。
就我个人的经历而言,我感觉我路子走错了。之前我的 vim 是从零配置的,那时我什么工具都不会用, 只能靠搜索引擎+内置文档自己调试。很大一部分时间里我都在各种配置的 bug,各种“为什么这么搞不灵”, “这种功能怎么实现啊”纠结了好长时间。不仅影响心情,浪费时间,还打击人的热情。 如果现在让我重来一次,我会选择直接使用一个现成的配置先凑合着用,等到时机成熟的时候再回过头来仔细打磨。
spaceamcs 就是这样优秀的现成的配置。而且与其它的个人配置不同, spacemacs 设计的非常灵活使得它能作为一个基础来进一步定制自己个性化的 emacs!
现在,我旁边的同学至少有三个人在使用 spacemacs 了。 其中有一个是在我入坑 vim 的同时入坑的 emacs,铁杆级的 emacs 原生用户。 但是之后也放弃了他自己的那套配置,转而使用 spacemacs 这套优秀的配置了。
现在,有了 spacemacs,我既能享受到 vim 那套舒服的快捷键,也能享受到 emacs 强大的扩展能力。 可以说,spacemacs,统一了 vim 和 emacs 两大编辑器! 现在,我的大部分编码活动,记笔记,都是使用 eamcs 进行的。它真正融入到了我的学习和生活中。
感谢 RMS 等一帮优秀的斗士们,创造出了如此优秀的编辑器。。。哦不,操作系统! 也感谢那群热爱技术的开源社区,创造出了 spacemacs 这样优秀的配置!