前言
从Vim到NeoVim至今,已经三年多了,我的主力开发环境依然是iTerm2+Tmux+NeoVim。中途还试过VSCode和GoLand,作为新生代的编辑器,这两款用起来果然不错。不过,总感觉可以折腾的东西变少了一些。后来看到Emacs里面的Evil Mode,知道原来在Emacs里面也可以折腾Vim的键位绑定,何不一试?
在Google和查找了很多资料,还找到几份不错的Emacs配置,拿来直接修改一下就可以满足自己日常Go的开发了。不过对于我这种Elisp不太熟悉的新手,配置文件出错了得花时间调试和排错。不得不承认,这是一件稍微痛苦的事情。
再后来,直到我把目光转向了已经火了一段时间的Spacemacs。通过最近一段时间的尝试,我发现Spacemacs经过一波折腾和配置,能完全满足我的日常Go开发的需要,甚至有越用越顺手的感觉,罪过罪过……难道我这就要背叛Vim转向Emacs了?不对!我并没有背叛Vim,我只是想在Emacs里面用Vim而已……
提起Spacemacs,它并不是一个Emacs的单独发型版本,而是一份集成度和友好度更高的Emacs配置文件而已。按照官方的介绍,Spacemacs是一个由社区驱动的Emacs衍生版本,正如官网上的这句话: The best editor is neither Emacs nor Vim, it's Emacs and Vim!
Spacemacs社区的目地仿佛是为了消除Emacs和Vim之间的战争。而在我看来,Spacemacs的出现是为了综合Emacs和Vim的长处,让更多的Vimer可以在其中体验Emacs。
配置Spacemacs
前面提到过,Spacemacs并不是一个Emacs的独立发型版本,只是一份集成度较高的配置,所以Spacemacs的安装也异常简单:
- 安装Emacs,这里我直接选择了GNU Emacs 26.2
- clone Spacemacs的配置到本机的
~/.emacs.d
即可
在第一次启动Spacemacs的时候,会有很多交互式选项,用于配置Spacemacs,也可以选择是用Emacs默认键位布局,还是使用Evil Mode。既然要在Emacs中使用Vim,当然是选择Evil Mode了!
Layer的概念
Spacemacs对配置本身做了抽象度较高的封装,所以,许多的功能都是通过可以配置的Layer提供给用户。这里Layer的概念,类似于Vim中的各种Plugin。用户只需要简单的配置需要启用哪些层即可,不需要对每个层进行复杂的配置,也不用因为集成各种组件让自己的配置文件变得复杂和更加难以维护。我想,这也应该是Spacemacs能吸引很多用户的原因吧。
所有可用的Layer,可以在这里找到。
Spacemacs的用户自定义配置文件
Spacemacs虽然做了大部分的封装,隔离了Emacs配置的复杂性,也提供给用户可以自定义一些配置和Layer的机会,在使用Spacemacs的过程中,用户只需要关心一个配置文件即可,也就是在Spacemacs启动时会自动加载的~/.spacemacs
文件。用户的一些自定义配置,以及需要使用哪些Layer,全都在这一个文件中搞定。用Git把这个文件管理起来,就可以方便的保存和追溯自己的配置了,真是方便得不要不要的!
Spacemacs上车体验
Emacs安装完毕,Spacemacs也Clone好,那就让我们焊死车门上车吧。接下来介绍一些Spacemacs的上手体验,以及如何配置和打造其成为我的日常开发利器。既然要迁移到Spacemacs上开发,我的主要目标是之前NeoVim有的功能,Spacemacs上也要能满足才行。事实证明,NeoVim能有的功能,Spacemacs都能实现。
启动好Spacemacs,会出现一个比较酷炫的界面:
界面上除了可以更新各种包以及Spacemacs本身,也提供最近访问的文件和项目列表,方便在启动时快速打开。其实,这个home界面,也是Emacs里的一个buffer而已。在Spacemacs中还为我们提供了一个快捷键,方便我们时刻回到这个home界面: SPC b h
配置与修改Spacemacs
在Spacemacs里面,提供了一个直接可以打开~/.spacemacs
文件的键位绑定,使用SPC f e d
(先按空格键,接着按 f e d键),即可直接在Spacemacs中打开配置文件。
在该配置文件的头部,可以看到dotspacemacs-configuration-layers部分,许多Layer再次并没有默认激活,我们可以根据自己的需要开启和激活一些Layer。
每次编辑完成之后,保存,然后通过SPC f e R
来重载配置,或者通过SPC q R
来重启Emacs,让修改生效。
基本操作
由于使用Evil Mode,移动光标的方式跟在Vim中一样,都是用j, k, h, l
来实现。另外,Spacemacs通过which-key
插件提供丰富的菜单功能,单击SPC
键,就可以在菜单中找到Spacemacs的各种丰富的功能,后面介绍的各种功能的快捷键绑定,其实都可以在这个菜单中找到。
窗口管理
类似于Vim,Spacemacs也支持窗口的纵向和横向切割,并支持光标在这些子窗口中方便的移动。
常用窗口操作:
SPC w /
垂直分割窗口SPC w -
水平分割窗口SPC N
快速切换窗口。在Spacemacs中的每个窗口,都可以在窗口左下角看到窗口的编号,通过SPC N
可以快速的根据编号切换窗口。Ctl+w j
移动光标到下边的窗口Ctl+w k
移动光标到上边的窗口Ctl+w h
移动光标到左边的窗口Ctl+w l
移动光标到右边的窗口Ctl+w d
关闭当前窗口
Buffer管理
在Spacemacs中,每一个打开的文件都称为buffer,默认情况下,Spacemacs只显示当前编辑文件的buffer。我们可以通过SPC b b
查看当前打开的buffer列表,并且通过Ctl+n
, Ctl+p
进行选择,然后通过Enter键切换buffer。buffer列表还支持输入补全,非常有助于提升你的效率。
项目管理
Spacemacs默认使用Projectile的插件来探测我们当前所工作的项目,并允许我们模糊匹配查找在当前项目中的文件或者文本。Spacemacs中也有跟Vim类似的nerdtree
插件,叫做neotree
,功能和nerdtree
相当,通过快捷键SPC p t
即可呼出和关闭。
在项目中,Spacemacs还允许我们使用SPC p f
在项目中模糊匹配和查找当前项目中的文件。
buffer内光标快速跳转
用过Vim的同学都知道,Vim有一个非常有名的插件,叫做EasyMotion
,帮助你非常方便的在当前编辑的文本内进行快速跳转,Spacemacs中同样可以实现一样的效果,使用快捷键 SPC jj <char>
即可,<char>
也就是你需要跳转到的位置的那个字符,如图:
使用Magit集成Git
Git是一个当前非常流行的版本管理程序,Spacemacs当然也不会少了Git的集成。在配置文件中加入git
的layer即可。Spacemacs内部集成的是一个叫Magit的扩展,所有跟Git相关的操作,都可以在Spacemacs中通过Magit一次性搞定。下面是一些常用的 Git命令:
SPC g i
等价于命令git init
SPC g s
等价于git status
SPC g s
弹出层选中文件然后按 s, 等价于命令git add
某个文件SPC g S
等价于git add .
SPC g c c
等价于git commit
SPC g C
等价于git checkout XXX
SPC g l l
等价于git log
在 commit 时,我们输入完 commit message 之后,需要按 C-c C-c 来完成 commit 操作,也可以按 C-c C-k 来取消 commit。
Emacs 服务器
默认情况下,Spacemacs会在启动时启动服务器,这个服务器会在Spacemacs关闭的时候被杀掉。
使用 Emacs 服务器
当 Emacs 服务器启动的时候,我们可以在命令行中使用 emacsclient 命令:
$ emacsclient -c 用 Emacs GUI 来打开文件 $ emacsclient -t 用命令行中 Emacs 来打开文件
杀掉 Emacs 服务器
除了关闭 Spacemacs 之外,我们还可以用下面的命令来杀掉 Emacs 服务器:
$ emacsclient -e ‘(kill-emacs)’
持久化 Emacs 服务器
我们可以持久化 Emacs 服务器,在 Emacs 关闭的时候,服务器不被杀掉。只要设置 ~/.spacemacs 中 dotspacemacs-persistent-server 为 t 即可。
但这种情况下,我们只可以通过以下方式来杀掉服务器了:
SPC q q
退出 Emacs 并杀掉服务器,会对已修改的 Buffer 给出保存的提示。SPC q Q
同上,但会丢失所有未保存的修改。
Org模式
Emacs只所以有名,还在于其鼎鼎大名的Org Mode,提到Org Mode当然需要更多的篇幅来介绍,这里就不详细表述了,有一篇关于Org模式的文章,可以参考。
一些额外的扩展
Emacs的强大之处,还在于支持各种各样的扩展,比如在Emacs里面玩个小游戏啥的,这都不是问题:
另外,通过安装一个Spotify
的扩展,就可以在Emacs里面控制播放器Spotify了,切换歌曲,甚至是搜索歌曲并进行选择和播放,都不在话下:
配置文件参考
放出我的Spacemacs配置文件,供大家参考。
小结
作为一个刚切换到Spacemacs和使用不太久的用户,Spacemacs还有很多的功能待我去发现,不过我用它来代替NeoVim和进行日常开发已经绰绰有余。Spacemacs吸引我的是丰富的扩展以及高集成度的封装,让用户不必太了解Emacs配置的复杂之处,就可以通过简单的配置实现自己想要的功能。之前使用Vim的同学,又想体验Emacs的强大,不妨可以配置自己的Spacemacs体验一下。