使用Emacs来开发Clojure是一个不错的选择
安装
到官网下载最新版本,以Windows为例。
解压zip,运行bin目录中的runemacs.exe文件即可启动emacs。
关闭emacs,下载配置文件,将所有内容解压到C:\Users\your_user_name\AppData\Roaming\.emacs.d目录。再次启动emacs即可。
配置leiningen,以使得支持在emacs中启动REPL。创建文件C:\Users\your_user_name\.lein\profiles.clj,然后添加内容{:user {:plugins [[cider/cider-nrepl “0.8.1”]]}},其实就是给leiningen添加了一个插件cider-nrepl。
快速上手
- 在emacs中,编辑行为总是发生在一个buffer中。
- C-x b打开了一个minibuffer,你可以输入想要切换的buffer名,然后确定。
- 同样的方式,如果在minibuffer中输入了一个不存在的buffer名,那么就会创建一个buffer。
- C-x C-f 可以打开一个文件(emacs会创建一个与文件同名的buffer)。
- C-x C-s保存buffer到文件。
- 创建文件也是同样的方式,只是输入新文件的路径,当你保存时,emacs会创建新文件。
Key Binding和模式
emacs本质上是一个lisp解析器。按键对应了特定的命令,也就是elisp函数。如C-x b绑定到了switch-to-buffer,C-x C-s绑定到了save-file。不仅仅是组合按键,即使是f和a这样的按键也绑定到了一个函数self-insert-command。该函数的功能就是向当前编辑的buffer中添加字符。
你也可以通过输入一个函数名直接执行某个命令。(使用M-x,然后加函数名)。M是meta的意思,在Windows中对应alt键,对应Macs上的option键。
一个emacs模式就是一组key binding和相应函数的集合。一般一种类型文件的编辑会对应一种模式,如果编辑Clojure文件,那么我希望能加载Clojure模式。在Clojure模式下,如C-c C-k
可以将当前buffer中的内容加载到REPL然后编译。
emacs模式由主(major)模式和辅(minor)模式组成。Markdown和Clojure都是major模式。当打开一个文件时emacs会自动设置相应的major模式,然而你也可以通过M-x clojure-mode
或者M-x major-mode
进行设置。同时只能有一种major模式被激活。
emacs的模式是通过package发布的,如果你打开一个文件,发现emacs没有加载对应的模式,可以自行安装。
M-x package-refresh-contents
刷新package列表M-x package-list-packages
显示所有可用的packageM-x package-install
安装package
核心的编辑术语及其按键绑定
Point
这是光标所在,看上去光标是位于一个字母之上的,其实光标的准确位置是位于当前字符和前一个字符的中间。
C-k
执行kill-line命令,删除当前行中光标之后的所有字符。
C-/
撤销
移动(Movement)
Keys | Description |
---|---|
C-a | 移动到行首 |
M-m | 移动到当前行中第一个非空白字符。 |
C-e | 移动到行尾 |
C-f | 前移一个字符 |
C-b | 后移一个字符 |
M-f | 前移一个单词(常用) |
M-b | 后移一个单词(常用) |
C-s | 使用正则表达式在当前buffer中搜索内容。再次点击C-s移动到下个匹配。 |
C-r | 同C-s,只是反向搜索 |
M-< | 移动到buffer的开始处(注意是左尖括号) |
M-> | 移动到buffer的结尾处 |
M-g g | 跳转到行 |
使用Region进行选择
在emacs中,我们不是选择文字,而是创建region。首先C-spc(ctrl-spacebar)进行标记。然后移动光标,那么光标和标记之间的就是一个region。如:
1. M-<调到buffer的开始处。
2. C-spc
3. 点击M-f两次。选中两个词。
4. 点击backspace,删除两个词。
还可以使用region限定操作范围,如:
1. 创建一个region
2. 使用M-x replace-string在region内进行替换操作。
Killing和Kill Ring
Emacs里面把剪切称为kill,kill ring就是剪贴板。不同的地方是,kill ring有历史记录。
Keys | Description |
---|---|
C-w | kill一个region |
M-w | 复制region到kill ring |
C-y | 粘贴(yank) |
M-y | 将粘贴的内容替换为kill ring中的上一个内容 |
M-d | kill一个词 |
C-k | kill一行 |
Editing和Help
Keys | Description |
---|---|
Tab | 缩进一行 |
C-j | 开启新行并缩进,等同于enter然后tab |
M-/ | 自动补全 |
M-|删除光标周围的所有空格和tab
C-h k key-binding|获取一个key-binding的文档
C-h f|获取一个函数的文档
使用Emacs进行Clojure编程
连接REPL
要在Emacs中使用REPL,需要安装一个package,CINDER。如果你使用了上文提供的配置文件,那么cider已经安装好了。然而不管怎样,你总是可以通过M-x package-install安装。
CINDER允许你在Emacs中启动REPL并且提供了相应的按键绑定。首先打开一个Clojure文件,然后执行M-x cider-jack-in
打开REPL。Emacs使用了另外一个窗口来打开REPL。
关于窗口操作的一些按键:
Keys | Description |
---|---|
C-x o | 移动光标到另一个窗口 |
C-x 1 | 仅仅留下当前窗口,关闭其他窗口。注意,该操作没有关闭相应的buffer。 |
C-x 2 | 在Frame中上下打开窗口 |
C-x 3 | 在Frame中左右打开窗口 |
C-x 0 | 删除当前窗口 |
Clojure buffer的一些按键
Keys | Description |
---|---|
C-c M-n | 切换到当前buffer的命名空间 |
C-x C-e | 对光标前的表达式求值 |
C-c C-k | 编译当前buffer |
C-c C-d C-d | 显示当前光标所在符号的文档 |
M-.和M-, | 显示当前光标所在符号的源码并返回到当前buffer |
C-c C-d C-a | 在函数名和文档中搜索任意内容 |
Cinder buffer的一些按键
Keys | Description |
---|---|
C-箭头上,C-箭头下 | 浏览REPL历史输入 |
C-enter | 闭合括号并求值 |
Paredit
paredit是一个minor模式,处理Clojure文件编辑时的一些括号匹配的工作,下面是它的一些按键:
Keys | Description |
---|---|
M-x paredit-mode | 开关paredit模式 |
M-( | 将光标后的表达式用小括号围起来 |
C-右箭头 | 将光标后表达上的小括号包含范围扩大到下一个表达式 |
C-左箭头 | 跟上面相反 |
C-M-f,C-M-b | 移动光标到括号对的起始/结尾 |