Emacs Cookbook
Table of Contents
- 1. 初级
- 2. 操作相关
- 2.1. Q:如何用只读模式,以免浏览文档/代码时误操作?
- 2.2. Q:查看快捷键绑定在哪个 mode、哪个函数上
- 2.3. Q:如何放大/缩小文本?
- 2.4. Q:C-k删除时如何包含换行符?
- 2.5. Q:如何跳转到行首第一个非空白字符?
- 2.6. Q:如何改变选定区域字母的大小写?
- 2.7. Q:如何替换不可见字符?
- 2.8. Q:如何替换正则表达式匹配的文本
- 2.9. Q:如何删除所有的空白行?
- 2.10. Q:公司的 GNU/Linux 服务器上只有 Vim,没有 root 权限怎么办?
- 2.11. Q:在编辑远程主机的文件下又如何使用 sudo?
- 2.12. Q:如何做个性能测试,看看当前哪些操作耗 CPU 和内存?
- 2.13. Q:粘贴了好大段文本,结果 Emacs 被搞死了
- 2.14. Q:如何录制宏?
- 2.15. Q:有什么好的文件管理插件?
- 2.16. Q:ido-find-file 如何不自动不全打开文件?
- 2.17. Q:Tramp 列出目录后,如何刷新目录?
- 3. buffer、window 和 frame 相关
- 4. 配置相关
- 5. 开发相关
- 6. 其他
公开: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 里,我们所有码字的区域都叫作“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:如何录制宏?
常用步骤:
- C-x (: 开始录制宏
- 做需要重复的操作
- C-n,移动到下一行
- C-a,到行首
- C-x ),结束宏录制
- 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 启动后,会自动载入上次退出前的状态。
深入学习:
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 自带的学习向导。
- YouTube 的 emacsrocks 频道:https://www.youtube.com/user/emacsrocks/playlists
- 李杀的 Emacs 教程:http://ergoemacs.org/emacs/emacs.html
- Emacs 官方文档
- Emacswiki
深入 Emacs Lisp 编程:
- 李杀的 Emacs Lisp 教程:http://ergoemacs.org/emacs/elisp.html
- 官方的 Emacs Lisp 编程指南
6.2. Q:如何保养手指?
想想 Emacs 的完整拼写:Escape Meta Alt Control Shift
- 推荐把键盘:HHKB
- 脚下放块键盘,用脚趾按 Ctrl 键,同时还能锻炼到身体上下协调性