Emacs 操作和文件
前言
学习 Emacs 内置文档 Emacs tutorial ,结合在线文档 A Guided Tour of Emacs。
学习知乎 Pavinberg 的 专业 Emacs 入门(二):基础操作 和(三)多文件与模式。
一直想学习 Emacs,但是苦于无法入门。有看过一步步配置出自己的 Emacs 的教程,包括博客教程和视频教程,但学着很不得劲。最后的水平也就记住了退出和保存的快捷键 C-x C-c 和 C-x C-s 。
我不喜欢 Emacs 的图形化界面,感觉像十年前的前端样式,“不是我喜欢的 Emacs ,直接拒绝”。在终端中输入 emacs -nw ,emacs 就在终端中启动了。
先过一遍 Emacs 内置的快速指南,快捷键是 C-h t 。如果像我一样不习惯阅读英文,用命令 M-x help-with-tutorial-spec-language,选择一份中文文档进行学习。这里的 M 是 Meta 键,通常是键盘上的 Alt 。

保存和退出
退出 Emacs:C-x C-c 。
如果需要临时从 Emacs 回到终端,可以不用保存和退出,选择挂起 Emacs:
C-z(suspend-frame) 挂起 Emacs 回到命令行,如果安装了 evil 插件,C-z会被占用,需要C-x C-z才可以挂起。fg(foreground 的缩写) 将挂起的 Emacs 恢复到前台。
Emacs 会定期将正在编辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个“#”字符,比如正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。
打开原来的文件(注意不是自动保存文件)然后输入 M-x recover file 来恢复自动保存文件。
配置生效:
C-x C-e测试单行配置C-M-x测试整个函数M-x eval-buffer加载整个配置文件。常用于在*scratch*缓冲区测试代码。M-x eval-region执行部分配置
光标移动
Emacs 的上下左右移动快捷键要学,因为之前 Vim 的中英文切换让我十分狼狈,以至于养成了“每次输入完中文都会主动切换回英文”的习惯。
简而言之就是利用 Vim 的模式,插入模式用 Emacs 进行光标移动,普通模式下则用 Vim 移动。
C-f(forward-char) 前移一个字符。C-b(backward-char) 后移一个字符。C-p(previous-line) 上移至前一行。C-n(next-line) 下移至下一行。- 以词为单位:
M-b光标向左移动一个词,M-f光标向右移动一个词。 - 首尾:
- 行:
C-a为移至行首,a代表 ahead。C-e为移至行尾,e代表 end。 - 句子:
M-a光标移至句首,M-e光标移至句尾。 - 文件:
M-<移动到文件开头,M->移动到文件末尾。
- 行:
- 窗口:
M-r按第一次——光标移动到窗口中间行;接着按第二次——光标移动到窗口最上面一行;接着按第三次——光标移动到窗口最下面一行。
Meta 系列组合键用来操作“由语言定义的单位(比如词、句子、段落)”,而 Ctrl 系列组合键用来操作“与语言无关的基本单位(比如字符、行等等)”。
M-p(Previous sentence):上一句M-n(Next sentence):下一句M-a(c-beginning-of-statement):将光标移动到“一句”的头部M-e(c-end-of-statement):将光标移动到“一句”的尾部
编辑操作
粘贴
- 删除字符:
<DEL>删掉光标左侧的字符。想要删掉右侧的字符,按下C-d键。 - 移除词:
M-d移除光标右边一整个词。M-<DEL>移除光标左侧一整个词。 - 移除右侧直到句子结尾:
M-k。 - 移除右侧直到行结尾:
C-k。 - 选中部分区域:把光标移动到某处,按下
C-SPC,此时 Emacs 最下方的空行显示 “Mark set“;接着任意移动光标到另一个位置,可以看到半透明的选择框。这就是和平日里使用鼠标进行选择是一样的。 - 复制:
M-w复制选中的区域。 - 移除:
C-w移除选中的区域。
删除是 delete,移除是 kill。区别在于:被 kill 的文本被 Emacs 记录下来,后续可以重新插入被移除的文本,类似平时用的剪贴功能。
Emacs 内部维护了一个环形“剪贴板历史”,当你想插入之前移除的内容时(即粘贴之前剪切的内容),按下 C-y,这被称为 "yank",它会将最近一次移除的内容插入回来。
C-y(yank):召回最近一次移除的内容M-y(yank-pop):粘贴历史记录。一次M-y召回再前一次被移除的内容,再按一次M-y又可以召回再上一次的内容。连续使用M-y会回到起始点。插件counsel可以辅助这个过程。
只消除一个字符或者只消除空白的命令,无法用 C-y 插入被移除的字符或空白,比如 <DEL> 和 C-d 。但这也不是绝对的,这两条命令有前缀参数 C-u 时,就变成了”移除“命令。
撤销
撤销(undo)可以恢复删除和移除的文本。移除文本+召回(yank)效果等同“剪贴”。
- 撤销(undo):
C-/或C-_或C-x u。撤销刚刚的操作。对字符进行编辑例外,例如按了 5 次删除键删除了 5 个字符,按一下撤销即可复原。 - 重做(redo):Emacs 对于历史记录也维护成了一个环。但 Emacs 并没有直接的重做操作,而是先按一下
C-g,即没有操作,此时再按撤销键时,会撤销上次的“撤销”,相当于重做;也可以理解为按下C-g后这个环的移动方向会改变。所以 Emacs 其实不分 undo 和 redo,而是靠改变历史记录的移动方向来控制。插件undo-tree可以辅助这一过程。
标记与跳转
标记和点一起界定区域(Region)。
C-x h(mark-whole-buffer):选中当前缓冲区M-h(mark-paragraph):选中当前段落
在区域的配合下, Narrowing 限制缓冲区(以及编辑)的视图到一个特定区域。像增量搜索和跳转到缓冲区头部/尾部这些命令,也会随之限制在这个特定区域。Narrowing 适用于只想修改某个区域,不想影响到区域以外的缓冲区。
C-x n n(narrow-to-region):视图从缓冲区到指定区域C-x n w(widen):视图从指定区域返回缓冲区
C-SPC 不仅是选中文本这么简单的功能,它的本质是设定一个标记(mark)。Emacs 还有一个标记跳转功能,例如,我们先在文本的第一行,按下两次 C-SPC(这样我们即打了标记,又没有选中文本),然后光标移动到别的位置(甚至以后学过之后,到别的文件),这时候按下 C-x C-SPC 或 C-u C-SPC,即可立刻跳转回刚刚的位置。同样的,有更好用的插件 counsel 可以辅助这一功能。
想要跳到特定的行,M-g M-g 加行号、回车即可 。
标记的概念在 Emacs 中有强烈的体现:
| 当你…… | 标记设置在…… |
|---|---|
输入 C-SPC | 当前所在位置 |
跳转到缓冲区头部或尾部 (M-< 或 M->) | 跳转前的位置 |
| 退出增量搜索 | 搜索前的位置 |
| 召回文本 | 召回区域的开始处 |
| Insert a buffer or file | 插入文本的开始处 |
多次使用标记会在 Emacs 内部形成一个环,环中最多保留16个标记。在这16个标记中,通过 C-u C-SPC 进行跳转。
重复操作
前缀 C-u (universal-argument) + 数字 + 移动命令,可以起到重复执行指定次数的移动命令。M-[digit] 是 C-u [digit] 的缩写。不过我电脑上已经占用了 M-1 M-2 M-3 这三个快捷键,所以就用不上了。
C-u 3 C-p上移3行距离C-u 10 C-f右移10个字符距离C-u C-n下移4行距离。C-u不显式指定数字时,隐式指定数字4,用于不确定要移动多远距离时
C-u与M-x组合时的C-u M-x是基于前缀字符串搜索命令。可以类比我们的键盘上,按下1是输入数字 1,但按下shift+1得到的是叹号,C-u就类似shift的作用,并且由于可以接数字等额外参数,C-u非常强大。
页面移动
接下来的前移后移和居中,适合浏览代码:
C-v(scroll-up-command):向下翻滚一屏。M-v(scroll-down-command):向上翻滚一屏。C-l(recenter-top-bottom):光标所在行居中。多按几次,就是“中-上-下”循环
搜索文本
增量搜索
在缓冲区中进行搜索,可以看作是另一种光标移动操作。安装了 swiper 的话会显示搜索结果列表,更为直观(swiper 和 counsel 是一套插件)。
C-s(isearch-forward):从光标位置,向前增量搜索C-r(isearch-backward):从光标位置,向后增量搜索
以向前搜索为例,C-s 后接想找的字符串,匹配到结果后,继续按 C-s ,光标会跳转到下一个匹配的字符串。此时,按 C-g ,光标返回初始位置;按 <return> ,光标停留在匹配字符串,此时用 C-x C-x 也能让光标返回初始位置。
C-s C-s:复用最近一次搜索用到的字符串。比如退出搜索后发现匹配的位置不对,此时可以用该快捷键,而不用重新输入字符串搜索C-s M-p:选中搜索历史记录中上一条记录C-s M-n:选中搜索历史记录中下一条记录C-h k C-s:更多增量搜索相关的命令
查询替换
查询替换命令 M-% (query-replace) 会提示输入一个搜索字符串和一个替换内容。然后,对于缓冲区中的每个匹配项,可以选择是否替换搜索字符串。以下是每个提示下可用的选项:
- 输入
y来替换当前匹配项。 - 输入
n来跳到下一个匹配项而不替换。 - 输入
q来退出而不进行任何其他替换。 - 输入
.来替换此匹配项,然后退出。 - 输入
!来不再询问地替换所有剩余匹配项。
正则搜索
正则表达式是一种简洁的方式,可以通过使用一种特殊的语言来描述你要查找的内容的形式,从而一次性搜索许多不同的字符串。快捷键 C-M-s (isearch-forward-regexp) 用于正则表达式搜索。
如果你是正则表达式的新手,或者你正在构建一个特别复杂的正则表达式,你可以使用正则表达式构建器 M-x re-builder 。这个命令会弹出一个单独的窗口,你可以在其中测试你的正则表达式,并且在你编辑正则表达式时,原始缓冲区中的任何匹配项都会被突出显示。
与其逐个匹配,你也可以选择一次性显示所有匹配项。M-x occur 会提示输入正则表达式,然后在单独的缓冲区中显示当前缓冲区中所有匹配该正则表达式的行(以及它们的行号)。点击任何匹配项都会带你到缓冲区中的该行。
其他小操作
C-g 取消命令。命令输入一半,输错了或者不想用了,可以用 C-g (keyboard-quit)中断。特别的,ESC + C-g 会显示组合键未定义,建议多按两次 ESC 取消。
调字号:放大 C-x C-= 、缩小 C-x C--、重置字号 C-x C-0。
大小写变换:
M-u(upcase-word):将光标后一词变为小写。M-l(downcase-word):将光标后一词变为大写。M-c(capitalize-word):将光标后一词的首字母变成大写。
交换位置:
C-t(transpose-chars):交换光标左右两侧的字符M-t(transpose-words):交换光标左右两侧的单词C-x C-t交换光标所在行和上一行。- 还有交换句子、段落、选择区域等,但没有快捷键。
获得帮助
Emacs 内置了多种获取帮助的方式。其共有前缀 C-h。
C-h c(describle-key-briefly):简要描述快捷键功能。C-h k(describle-key):详细描述快捷键功能。C-h f(describle-function):描述函数。C-h v(describe-variable):描述变量。C-h a(apropos-command):列出含某一关键词的命令。C-h d:列出含某一关键词的符号的文档。
C-h c和C-h k根据快捷键确定;C-h x根据命令名确定。
C-h x(describe-command):解释一个命令C-h m(describe-mode):查看当前缓冲区的主模式、副模式C-h r(info-emacs-manual):继续学习 Emacs 的权威指南 GNU Emacs ManualC-h i(info):一些 Emacs 功能有自己的、独立的手册 (C-h i d)C-h ?(help-for-help):帮助的帮助。列出以上功能,以及其它帮助功能。插件which-key可以在敲快捷键给予一定的提示作用
初识界面
一些概念:
- 菜单栏,在 Frame 的最上方。默认包括了 File、Edit……等等下拉菜单。在终端中不能用鼠标时,需要用
menu-bar-open命令打开,对应快捷键<f10>。此外还有一个M-\tilde{}键(对应命令tmm-menu)可以从下方展开互动界面打开菜单。 - 工具栏,只在图形界面时可以使用。通常会关掉工具栏:在配置文件中加入代码
(tool-bar-mode -1)。 - Window:Tool bar 以下、Echo area 以上这一整个区域,就是 Window,即窗口。我们日常称为窗口的在 Emacs 中被称为 Frame,而 Frame 内的核心区域才被称为 Window。
- Frame:如果用图形界面打开 Emacs 程序,那么一整个程序窗口被称为 Frame,如果打开了多个窗口就有多个 Frame;如果在终端内打开 Emacs,那么 Emacs 所占据的整个终端的界面被称为 Frame。
- 状态栏(mode line):回显区正上方的一行,显示当前 Buffer 的一些信息,包括了文件编码、是否修改、当前 Buffer 名、光标所在位置占全文百分比、行号等等。
- 回显区(echo area):屏幕最下面一行,用以打印各种简短的信息。
- 在输入
M-x后、C-x b后在 Echo area 显示的等待输入的区域被称为Minibuffer, 它们的输入方式是共通的,都可以用相同的补全机制等。 - 缓冲区(buffer):为了方便理解,可以简单看作文件(file)。
- Scroll bar :图形界面时 Window 的最右侧有一滚动条。在配置中加入
(when (display-graphic-p) (toggle-scroll-bar -1))表示关闭滚动条。 - Cursor :光标是一个 1 字符宽的方块,但其真正表达的位置是其左侧的长边,即两字符之间。
- Point :光标所在的位置称为 Point。区别于光标的是,光标有且只有一个,但 Point 是针对 Buffer 的,每个 Buffer 都有一个 Point。许多命令的触发都要读取 Point 信息。在多数情况下,用户感知到的是 cursor,而实际编辑操作基于 point 。
快捷键
<DEL>指的是退格键 Backspace,而不是 Delete 键。
打开多文件
C-x C-f(helm-find-files):打开文件。若打开一个不存在的文件,则等同于创建一个新文件C-x C-s(save-buffer):保存文件(当前缓冲区)。保存文件时,Emacs 默认会为文件备份,例如打开了names.txt后会出现names.txt~
关闭文件备份的方法:M-x customize-variable <Return> make-backup-files <Return> 或 (setq make-backup-files nil) 。
Emacs 可以打开多个文件,同样使用 C-x C-f 打开即可。 但是你如果打开了第二个文件,便会发现第一个文件就消失不见了,应当去哪里找呢?事实上,所有打开的文件都会被放入一个被称为 Buffer 的对象中,当打开了第二个文件时,第一个文件所在的 Buffer 会切入后台,而第二个文件的 Buffer 会占据当前的 Window。Buffer 的名字显示在 Mode line 中间,通常是文件名本身。
Emacs 也可以用这个方式打开目录(文件夹),会显示出目录内的文件,可以用光标选择想打开的文件。
Buffer 的切换
每个已打开的文件都是一个缓冲区。因此切换缓冲区,等同于打开一个已经打开的文件。
C-x C-b(list-buffers):列出缓冲区,仅能查看。C-x b(helm-list-buffers):列出缓冲区,可以切换。C-x s(save-some-buffers):保存所有缓冲区(所有文件)。C-x k(kill-buffer):关闭 Buffer。
切换 Buffer 最简单的方法是使用 C-x b ,输入 Buffer 的名字后按回车即可切换。
显然 Buffer 多了会记不住名字也不便于管理,于是可以使用第二个方法 C-x C-b ,此时会弹出一个 Window,名为 *Buffer List* ,列出了当前所打开的所有 Buffer。其中可以看到多个以星号 * 开头结尾的 Buffer,那些都是 Emacs 用于输出一些信息的 Buffer,并不是由于打开文件而产生。Buffer 开头如果是 %,表示这个 Buffer 被修改过而没有保存。
在 *Buffer List* 中:
- 按问号(
?)可以显示帮助。 q退出。d标记一个 Buffer 打算关闭,s标记一个 Buffer 打算保存,u取消标记,x执行刚刚标记过的删除和保存操作。- 在这里上下移动光标也不需要
C-p和C-n,直接按p和n即可。
多窗格
Emacs 可以像 tmux 那样同时打开两个文件相互参照对比。
C-x 0(delete-window):关闭光标所在处的窗格。C-x 1(maximize-window):只保留光标所在的窗格。其它窗格的 Buffer 依然没有关闭。C-x 2(split-window-below):向下分割出一个窗格。C-x 3(split-window-right):向右分割出一个窗格。C-x o(other-window):切换光标到下一个窗格。
不管是向下分,还是向右分,光标还是位于原来的窗格。切换窗格时,多按几次
C-x o,就能循环遍历所有窗格。
光标可以不切换到新窗格,就能在新窗格中滚动页面。当前窗格滚动快捷键是 C-v 和 M-v ,新窗格是 C-M-v (scroll-other-window) 和 C-M-S-v 。这两个快捷键很重要,平时翻阅帮助文档时候,就是创建一个新窗格,在新窗格内查看文档。
与窗口的区别:终端中的 Emacs 只有一个窗口,即当前的终端窗口;GUI 界面的 Emacs 可以创建多个窗口。每个窗口有单独的菜单栏、滚动条,就像平时的应用多开。
开一个新窗口并打开新文件这个需求很常见,对此如果只有以上快捷键,需要先 C-x 3 分割出一个窗口,C-x o 切换到新窗口,C-x C-f 打开新文件,过于繁琐。对此 Emacs 提供了一个快捷键 C-x 4 f 来实现“在另一个窗口打开新的文件,如果只有一个窗口就分割成两个”的效果。
此外,还有 C-x 4 b 表示“在另一个窗口切换到另一 Buffer,如果只有一个窗口就分割成两个” 。C-x 4 d 表示 “在另一个窗口打开目录,如果只有一个窗口就分割成两个”。
可以总结出
C-x 4为前缀时,就表达“在另一个窗口做……“。
多 Frame
C-x 5 2打开一个新的 Frame。C-x 5 f在一个新的 Frame 打开文件。C-x 5和C-x 4基本类似,只是前者在 Frame 间操作,后者在 Window 间操作。
多 Frame 在终端打开的 Emacs 上没法使用,而且多个 Frame 之间切换很麻烦,通常我的桌面应用不止有两个 Emacs Frame,还有浏览器、IDE、文档等,切换应用十分不方便。
模式
Emacs 的核心要素之一就是模式(mode)。一个模式就对应着一组环境,不同模式可以分别进行配置,应对不同的场景。例如,编写 C++ 代码时就对应 c++-mode ,编写 Python时使用 python-mode 。在不同的语言的 mode 中,编译、执行的方式都是不同的,这样只要事先定义好 mode,就可以在使用过程中方便切换各种需求场景。
主模式
主模式用于根据缓冲区的内容自定义外观和可用功能。Emacs自带了数十种主要模式,用于编辑常用编程语言、标记语言和配置文件格式。这些主要模式告诉 Emacs 如何:
- 正确缩进代码
- 进行语法高亮
- 区分函数边界
- 调用代码要求的解释器,编译器或调试器
主模式默认根据 Buffer 的文件类型来选择,一个 Buffer 只能对应一个主模式。例如,Emacs 发现你打开了 .cpp 为后缀的文件,就会把 Buffer 自动设置成 c++-mode ,最直观的区别是 Emacs 为不同语言的源码提供了不同的语法高亮。 主模式的名字会显示在 Mode line 上。
次模式
同一个 Buffer 可以有多个次模式,次模式可以进一步调整、增加一些配置。通常来说,插件都是靠次模式来起作用的。一般每个次模式代表一个附加功能,比如语法检查(flymake)和自动补全(company)。
M-x auto-fill-mode:一行超过70个字符,则自动换行M-x flyspell-mode:高亮拼错的单词M-x follow-mode:在两个并排显示的窗口共用一个缓冲区时,跟随模式会强制它们一起滚动,使得第二个窗口中显示的文本紧跟在第一个窗口中的文本之后
一些次模式的影响范围是全局的,即不局限于某个缓冲区,是针对整个编辑器的,如:
M-x incomplete-mode:随着输入,显示补全M-x iswitchb-mode:用C-x b切换缓冲区时,会显示所有缓冲区的名字
C-h m 描述了已激活的主模式和次模式,通常会列出在该模式下有用的重要命令,这在学习使用新模式时非常有帮助。
mode hook
每一个主模式都对应着一个 Mode hook,Mode hook 的作用是当启动一个主模式时,自动执行一些已经“挂钩”到这个主模式的函数或次模式。由此,我们可以自由地向一个主模式上挂上各种功能,在启动这个主模式时就可以自动跟随着一起启动。
例如,我们希望在主模式“文本文件模式” text-mode 时启动次模式“检查拼写” flyspell-mode ,我们就可以这样写配置:
;; 打开 txt 文件时,会自动开启检查拼写功能
(add-hook 'text-mode-hook 'flyspell-mode)text-mode 是基于文本的文件的一个主模式,有一些其它主模式是由它派生,例如 html-mode 。各种编程语言对应的主模式都是由编程模式 prog-mode 派生。
那么如果我们希望在任何编程语言时都有一些共同需要的功能,例如编程时我们希望有代码块折叠功能,就为 prog-mode-hook 挂上相应功能就好。
(add-hook 'prog-mode-hook #'hs-minor-mode)上面代码的
#'是 function quote(函数引用)的简写符号。#'hs-minor-mode等价于(function hs-minor-mode)。
目录操作
Dired,即 Directory Editor,是 Emacs 自带的用以处理目录和文件的功能。常见的操作例如删除文件、将文件从一处拷贝至另一处,更高级的操作如对比两个文件的异同、更改权限、链接文件等等,都可以通过 Dired 实现。
C-x C-f输入一个目录就会进入 Dired。- 更标准的方式是按
C-x d或调用M-xdired命令然后输入一个目录的名字启动。 - 当已经打开了一个文件时,输入
C-x C-j可以打开当前文件所在的目录。
Dired 会把目录下的文件都列出来,随后用户可以对文件进行操作。此时可以按下 h (Help)来打开帮助,读者可以翻到下面的 "Keybindings",里面列出了所有在 Dired 中可以使用的命令。
Dired 基本操作逻辑为,通过光标上下移动(此时不需要按 Ctrl 而直接按 p 和 n 就可以上下移动光标)到相应文件上,按下一个命令快捷键来对该文件调用命令。想要批量操作,只需要按 m (Mark)就可以选择,按 u (Unmark) 来取消选择。批量删除时,按 d (Delete)标记删除,按 x (Execute)执行删除。
杂项
键盘宏
键盘宏是一种记住固定按键序列以便后续重复使用的方法。它们对于自动化一些枯燥的编辑任务很有用。
F3(kmacro-start-macro-or-insert-counter):开始录制宏F4(kmacro-end-or-call-macro):停止录制宏,或者播放宏一次M-5 F4:播放宏5次M-0 F4:反复播放宏直到它失败
快捷键拓展
Emacs 的命令就像天上的星星,数也数不清。把它们都对应到 Ctrl 和 Meta 组合键上显然是不可能的。Emacs 用扩展命令来解决这个问题,扩展命令有两种风格:
C-x:字符扩展。C-x之后输入另一个字符或者组合键M-x:命令名扩展。M-x之后输入一个命令名
递归编辑
递归编辑状态由位于状态栏的方括号所指示,其中包含了用小括号来指明的模式名称。比如说,你有时可能会看到 [(Fundamental)],而不是 (Fundamental) 。
不能用 C-g 退出递归编辑,而应该用 ESC ESC ESC 。这条命令还可以关闭多余的窗格。
软件仓库
M-x list-packages可浏览所有可安装的软件包。这个命令显示的界面中可以安装和卸载软件包,以及查看软件包的简介。M-x package-install下载插件。M-x package-remove卸载插件。M-x package-refresh-contents刷新插件市场。有时候插件下载失败,是因为插件市场太久没更新,插件下载链接失效了。
版本控制
Emacs 帮助您操作和编辑存储在版本控制中的文件。Emacs 支持 CVS、Subversion、bzr、git、hg以及其他系统,但它提供了一个统一的接口,称为 VC。
C-x v v(vc-next-action):提交当前文件,并给出日志信息C-x v =(vc-diff):显示当前文件所做的更改的差异C-x v ~(vc-revision-other-window):提示输入版本号,并在另一个窗口中显示当前文件的该版本C-x v g(vc-annotate):显示文件的注释版本,其中每行显示该行最后一次更改的提交记录和更改者。在任何一行上,L查看该提交的日志消息,D查看相关的差异C-x v l(vc-print-log):显示文件先前更改的日志。当光标位于特定日志条目上时,按d查看与此更改相关的 diff ,按f查看该文件的版本
编辑远程文件
利用 Emacs 的 Tramp 功能,无须在远程安装 Emacs,在本地的 Emacs 上就能编辑远程文件,仿佛远程文件就在本地一样。本地的 Emacs 通过 SSH、FTP 等方式获取到远程文件,并在远程保存更改。
Emacs 服务器
通过 Emacs 打开一个文件,新打开的窗口通常需要重新加载一遍配置,这十分不方便。如果此时已经有一个 Emacs 实例,那么可以用 emacsclient 将新打开的窗口连接到该实例上。
与常用工具集成
M-x shell:切换到名为*shell*的 shell 缓冲区,若不存在,则创建并切换过去M-x compile:调用make并在新缓冲区中显示输出M-x gdb:在一个新缓冲区中调用gdbM-x man:等同于在 shell 中查看 man 文档,比如man unzipM-x calendar:打开日历M-x calculator:打开计算器M-x lunar-phases:显示即将到来的月相
迁移到 Emacs
在 Windows 中,核心编辑命令是 C-z、C-x、C-c 和 C-v。不幸的是,这些键在 Emacs 中经常用于其他目的(挂起、前缀键、前缀键和翻页)。在选项菜单中打开“CUA 模式”,可以将这些键恢复为撤销、剪切、复制和粘贴。
对于 Vim 用户,Viper (M-x viper-mode) 是一组在 Emacs 中模拟 vim 编辑行为的模式。它提供了不同级别的 vim 兼容性,具体取决于你希望你的 Emacs 有多像 vim。
尾声
把 Emacs 内置的快速指南过了一遍,GNU Emacs 官网上的文档没来得及看。接下来我要去看看 Emacs 的一款主题 Spacemacs。
