Emacs Cookbook

Table of Contents

公开:2018-12-13,最后更新:2022-12-18

1. 初级

1.1. Q:如何退出 Emacs?

这条 FAQ 必须放在第一位,每位 Emacs 的新手满怀期待地下载完 Emacs 并运行,确不知如何退出。

你只需要按下 Ctrl-x Ctrl-c 就可以了。

1.2. Q:简单介绍下 Emacs 和它的圣战伙伴

Emacs 于 1975 年诞生在 MIT 人工智能实验室,由自由软件之父理 Richard Stallman 开发,一直以来作为自由软件基金会的招牌软件,它的架构几十年来未曾改动过:

  • 底层:用 C 语言完成与系统交互和展示部分,并实现了一个 Lisp 解析器。
  • 上层:通过 Emacs Lisp 不断扩展自身,其实 Emacs 中绝大多数的操作都是在调用 Emacs Lisp。

如下:

+--------------------+
|     Emacs Lisp     |
+---------+----------+
          |
          |
+---------+----------+
|  Lisp解析器        |
+--------------------+
|                    |
|    C代码            |
+--------------------+

Emacs 虽是 UNIX/Linux 下常用工具,但却并未继承 UNIX “保持简单、小即是美”的哲学,而是以一种完全相反的哲学存在着——All in One,Emacs 将自身作为 Emacs Lisp 载体,通过编写 Emacs Lisp 代码来无限扩大自身的能力,这种哲学被戏称为“厨房水槽”。

Vim 反映了 UNIX “保持简单、小即是美”的哲学,通过灵活组合来完成任务。

一直以来 Vim 和 Emacs 用户相互之间不断抨击,这种现象被称为“编辑器之战”,反映了两种完全相反的哲学观。

1.3. Q:Emacs 和 Visual Studio、Eclipse、NetBeans 等 IDE 哪个最好?

关于这个话题网上吵得不可开交。要明白编辑器和 IDE 之间的区别,IDE 集成了编辑器、编译器等,IDE 更多是用于编程领域;而 Emacs 主要还是一个编辑器。

只相对其他的编辑器而言,Emacs 的可编程性很强,所以可以做非常多的扩展,甚至把它扩展成 IDE。至于哪个好,你喜欢哪个就用哪个。

1.4. Q:Emacs 文档中组合键书面表达都是什么意思?

Emacs 中有大量的组合快捷键,所以有些便于表示的约定,一定要牢记。

  • Ctrl:在 Emacs 相关文档简称 C(大写)
  • Alt:简称 M(大写)

例如:

1. C-c f,表示:按下 Ctrl+c,松开,按 f

2. C-M-x,表示:同时按下 Ctrl+Alt+x

3. C-@,表示:同时按下 Ctrl+Shift+2

1.5. Q:Emacs 花里胡哨的界面太复杂,能介绍下吗?

emacs_ui.png

在 Emacs 里,我们所有码字的区域都叫作“buffer”,编辑一个文件就等同于把某个文件的内容加载到一个 buffer 中,每个 buffer 都有自己的名字,文件对应的 buffer,它的名字就是文件名。

上图可以看到,我打开了两个 buffer,并分别在左右各显示一个,显示 buffer 内容的地方叫作 window,一个 buffer 存在于一个 window 中,但同时能有多个 window 存在,一个 buffer 也能同时出现在多个 window 中。比如上图就将 window 切割成了两个,分别显示不同的 buffer。

一般在桌面环境中,我们说窗口(window)都是指某个图形化程序,比如“打开一个浏览器窗口”,但 Emacs 中 window 这个术语早已被占用,因为 Emacs 使用”window“这个术语时还没有图形化界面,所以只好用“frame”来指代通常说的那个窗口了,一般情况下只有一个 frame,但如果用 emacsclient 打开了别的文件,可能就会存在多个 frame 的情况。

最下面有“Quit”字样的位置叫作 mini buffer,mini buffer 一般用来显示消息通知。

2. 操作相关

2.1. Q:如何用只读模式,以免浏览文档/代码时误操作?

C-x q 进入只读模式,再按 C-x q 退出只读模式。

2.2. Q:查看快捷键绑定在哪个 mode、哪个函数上

M-x describe-key

然后按下要查看的组合快捷键。如果 mini buffer提示“xx is undefined”,表示这个快捷键尚未绑定,如果被绑定,将会告诉你一些信息,包括是被哪个插件绑定的。这个命令在解决快捷键冲突时,尤其重要。

2.3. Q:如何放大/缩小文本?

GUI环境:

  • C-x C-=:放大字体
  • C-x C–:缩小字体
  • C-x C-0:复原大小

2.4. Q:C-k删除时如何包含换行符?

需要在配置文件中增加:

(setq-default kill-whole-line t)

2.5. Q:如何跳转到行首第一个非空白字符?

M-m

2.6. Q:如何改变选定区域字母的大小写?

选定好文本后:

C-x C-l(小写)
C-x C-u(大写)

2.7. Q:如何替换不可见字符?

通过 C-q 组合键就可以输入特殊字符,如换行符。

例1,替换 Windows 换行符:

M-x replace-string RET C-q C-m RET

例2,替换 Linux 换行符:

M-x replace-string RET C-q C-j RET

2.8. Q:如何替换正则表达式匹配的文本

M-x replace-regexp

例1,在首行插入字符串,使用正则的首行匹配:

M-x replace-regexp RET ^ 插入的字符串

例2,在行尾插入字符串,和例1相同思路,替换行尾匹配符:

M-x replace-regexp RET $ 插入的字符串

2.9. Q:如何删除所有的空白行?

M-x flush-lines,删除空行的正则: ^$或者^\s-*$

2.10. Q:公司的 GNU/Linux 服务器上只有 Vim,没有 root 权限怎么办?

没有 root 权限要手动编译比较麻烦,因为需要安装一些依赖库。但我不推荐在服务器上再安个 Emacs(叫管理员帮安装的话很可能侵犯到他的信仰),因为同步配置文件也很麻烦是不,如果要编辑服务器上文件,可以选择远程编辑,C-f,输入:

/ssh:username@host:/filepath

远程编辑的好处:

1、享受本地的 Emacs 配置文件,不需要传一大堆配置文件到服务器上去

2、在服务器上编辑文件可能因网络原因,移动个光标都慢得要死;但 Emacs 远程编辑是先缓存到本地,等保存时才会传到服务器上

2.11. Q:在编辑远程主机的文件下又如何使用 sudo?

C-x C-f /ssh:user@remotehost|sudo:remotehost:/path/to/file

2.12. Q:如何做个性能测试,看看当前哪些操作耗 CPU 和内存?

1、M-x profiler-start,然后选择要记录的是 CPU、内存,或两者。

2、在当前 buffer 里做一些你想测的操作

3、M-x profiler-report

2.13. Q:粘贴了好大段文本,结果 Emacs 被搞死了

其实内容多了粘到其他编辑也不会好过的。可能因为你粘贴到的 buffer 中开启了很多 mode,比如高亮语法、格式化等等,这些导致 Emacs 死了。在新的 buffer 里用 fundamental-mode 就好,这个 mode 拥有最少的配置和绑定。*

2.14. Q:如何录制宏?

常用步骤:

  1. C-x (: 开始录制宏
  2. 做需要重复的操作
  3. C-n,移动到下一行
  4. C-a,到行首
  5. C-x ),结束宏录制
  6. C-u [执行次数] C-x e,执行宏。如果只是单次执行,C-x e 即可。

2.15. Q:有什么好的文件管理插件?

自带的有 dired,C-x d 或 M-x dired 启动。

第三方比较好用的推荐 neotree:https://github.com/jaypei/emacs-neotree

2.16. Q:ido-find-file 如何不自动不全打开文件?

有时会遇到新建文件时,文件名被 ido-find-file 自动补全了,这个时候按 C-j 即可打断补全。

2.17. Q:Tramp 列出目录后,如何刷新目录?

快捷键g。

3. buffer、window 和 frame 相关

3.1. Q:如何清空 buffer 的内容

C-x h del

3.2. Q:关闭当前所以 buffer 和 window

M-x kill-buffer-and-window

或 C-x 4 0

3.3. Q:如何保存当前窗口布局,并之后恢复

场景:需要做一些会改变窗口布局的操作,希望操作完之后恢复到改变之前的模样。

C-x r w [key]:注册当前 window 的布局

C-x r j [key]:恢复布局

3.4. Q:如何启动时恢复上次退出前的 buffer

在配置文件(~/.emacs 或 ~/.emacs.d/init.el)加入:

(desktop-save-mode 1)

下次 Emacs 启动后,会自动载入上次退出前的状态。

深入学习:

  1. http://www.emacswiki.org/emacs/SessionManagement
  2. http://www.gnu.org/software/emacs/manual/html_node/emacs/Saving-Emacs-Sessions.html

4. 配置相关

4.1. Q:如何不重启的情况下重加载配置文件?

M-x load-file,选择配置文件。如果只在配置文件中增加了少量的 Emacs Lisp 代码,可以直接执行改动的那句 Emacs Lisp 代码。

4.2. Q:启动向导的 buffer 好难看,如何启动时不显示?

配置文件加入:

(setq inhibit-startup-message t)

4.3. Q:中文双引号、单引号出现重叠怎么办?

把 Emacs 设置为 UTF-8 环境,配置文件里增加:

(set-language-environment 'UTF-8)

4.4. Q:如何关闭备份文件功能?

(setq make-backup-files nil)

4.5. Q:如何配置括号自动配对?

(show-paren-mode t)

4.6. Q:超出显示区域的文本如何自动换行显示?

在配置文件中增加:

(toggle-truncate-lines 1)

若只是临时所需,执行:M-x toggle-truncate-lines。

4.7. Q:如何改变行号的字体颜色?

M-x customize-face,输入 linum,修改 Foreground。

4.8. Q:如何记录打开了哪些文件,供下次运行 Emacs 时自动恢复?

分析代码时经常会打开很多源码文件,遇到不得不重启时,希望能重新打开上次打开的文件。

M-x desktop-save,选择要保存记录的目录,并将当前打开的文件记录进去。

再次启动 Emacs 时,M-x desktop-read,恢复上次运行时打开的文件。

5. 开发相关

5.1. Q:如何折叠代码?

M-x hs-minor-mode

hs-hide-all:折叠所有代码

hs-show-all:展开所有折叠的代码

hs-toggle-hiding:展开当前折叠的代码

5.2. Q:如何做文件 diff?

M-x ediff

5.3. Q:如何使用 etags

Emacs 自带的工具,类似 ctags。在源码目录中执行: etags * 后会生成一个 TAGS 文件,里面包含了符号信息。

注意:etags 不支持目录递归,如果源码目录有多层,需要借助 find 命令:

$ find . -name '*.[c|h]' | etags -

常用快捷键:

快捷键 含义
M-. 符号之间的跳转
C-u M-. 如果上面的跳转不是正确的位置,就继续跳。比如跳转到一个 struct 成员名时,可能有多个 struct 的成员名同名。
M-x list-tags 列出文件中所有符号

5.4. Q:如何设置 C 语言的代码风格?

例如设置 Linux 内核编程设置,内核编程要求缩进为 8 个空格,打开 .c 文件后执行:

M-x c-set-style,选择linux。

5.5. Q:Speedbar

从 23.2 开始,Speedbar 已自带。Speedbar 可以列出源码文件以及文件里定义的函数等等。

运行 M-x speedbar 后,会在一个名叫 SPEEDBAR 的 Frame(和 IDE 或类似的东西不太一样,不是展开在旁边的)

5.6. Q:如何在 Emacs 中打开多个 shell?

以 eshell 为例:

C-u <前缀> M-x eshell

“前缀”为不同的数字,只需使用不同的“前缀”即可。

6. 其他

6.1. Q:还有有关 Emacs 更详细的学习资源推荐吗?

初学者应当按快捷键 C-h t,花半小时看完 Emacs 自带的学习向导。

深入 Emacs Lisp 编程:

6.2. Q:如何保养手指?

想想 Emacs 的完整拼写:Escape Meta Alt Control Shift

  1. 推荐把键盘:HHKB
  2. 脚下放块键盘,用脚趾按 Ctrl 键,同时还能锻炼到身体上下协调性