EdmondFrank's 时光足迹

この先は暗い夜道だけかもしれない それでも信じて進むんだ。星がその道を少しでも照らしてくれるのを。
或许前路永夜,即便如此我也要前进,因为星光即使微弱也会我为照亮前途。
——《四月は君の嘘》

Emacs使用指南

Emacs快速指南

传说中的神级编辑器??

基础介绍

vim 和 emacs 分别被称为「 编辑器之神」与「 神之编辑器」,自有其独到之处。

快捷键的无差别延续

vim 和 emacs 诞生于 30 年前,快捷键基本没什么变化。这意味着,一旦你学会使用这两个编辑器,无论以后软件怎么更新,都不需要学习别的快捷键了。因为历史较长,加上快捷键变化不大,新兴编辑器大多提供模拟 vim/emacs 操作的插件。这也方便了用户迁移到其他编辑器,无需学习更多的同质快捷键。

基础和适用的默认配置

vim 和 emacs 都可以运行在终端,也有图形化的软件,非常适合快速编辑文件。当需要在无法运行图形界面的服务器上编辑代码的时候,二者也足以胜任。虽然在终端也有 nano 这样的编辑器,但毕竟过于简洁,无法支撑较为复杂的编辑工作。这两个编辑器的默认配置的功能就已经很强大了,语法着色、补全、缩进等功能都很不错。

emacs有别于vim的地方

为了实现强大的功能,vim 选择了多模式编辑(Normal, Insert, Visual 模式),而 emacs 没有输入上的 mode 差别,所以需要依赖复杂的快捷键来实现强大的编辑功能,正如上图所示。emacs 插件想象力更加丰富,有「伪装成编辑器的操作系统」之称。插件的 major mode 和 minor mode 的设计很出彩,对一个文件,只有一个 major mode,但是可以有多个 minor mode,这样一个文件一个主插件,多个附加插件,可以实现很多有趣的效果。

快捷键说明

在网上的Emacs文档或手册中,总有一些快捷键说明如下所示:

C-v : 其中C 代表 Ctrl,因此这项快捷键代表 Ctrl + C M-v : 其中M 代表 Alt,这项快捷键代表 Alt + V

基本光标控制

1
2
3
4
5
6
7
8
9
                    上一行 C-p
    向左移 C-b::: 目前光标位置 ::: 向右移 C-f
                    下一行 C-n

                 亦可使用小键盘方向键

M-f 移动到词的末尾 M-b 移动到词的首部

请注意 C-f 、C-b 和 M-f 、M-b 两对之间的类比关系。通常的惯例是:META 系 列组合键用来操作“由语言定义的单位(比如词、句子、段落)”,而 CONTROL 系列组合键用来操作“与语言无关的基本单位(比如字符、行等等)”。

这里对简单的光标移动命令做一个总结,其中也包括了整词和整句的移动:

    C-f     向右移动一个字符
    C-b     向左移动一个字符

    M-f     向右移动一个词【对中文是移动到下一个标点符号】
    M-b     向左移动一个词【对中文是移动到上一个标点符号】

    C-n     移动到下一行
    C-p     移动到上一行

    C-a     移动到行首
    C-e     移动到行尾

    M-a     移动到句首
    M-e     移动到句尾

窗格(WINDOWS)

Emacs 可以有多个“窗格”,每个窗格显示不同的文字。后面会介绍怎么对付多个窗 格,现在我们先学会如何关掉多余的窗格。其实也很简单:

    C-x 1   只保留一个窗格(也就是关掉其它所有窗格)。

也就是先按 CONTROL-x 然后再按 1。C-x 1 会保留光标所在的窗格,并将其扩大 到整个屏幕,同时关掉所有其它的窗格。

把光标移到本行然后输入 C-u 0 C-l。

输入 C-h k C-f。观察当一个新窗格出现时当前窗格(用来显示 C-f 命令的文档)是如何缩小的。

输入 C-x 1 关掉文档窗格。

Emacs中的删除

在Emacs删除文字有很多种方法。在说明相应的操作方法前,我们需要先弄明白几个概念:“删除(Delete)”、“移除(Kill)”、“召回(Yank)”还有“移除环(Kill-Ring)”

好吧,“删除”和“移除”在文本编辑的过程中实现的效果非常类似——对应的字符或内容在文档中“消失”了。存在细微差别的地方在与取回这些“消失”的内容的方法上:

被“删除”的内容,只能使用“撤销(Undo)”的办法来找回这些“消失的字符”。和大多数人预想的一样,这些“消失的字符”只会重新出现在原来它们所在的地方。

Emacs的剪贴板以及Undo/Redo

被“移除”的内容,除了可以使用“撤销”的方法了找回内容以外,还可以使用“召回”的方法让这些“消失”的内容出现在当前光标之后。这样的操作效果和使用了“剪贴板”的效果类似了。

“召回”,是将移除的内容插入到光标所在位置的一种操作。使用召回操作,让人有一种使用“剪贴板”的感觉。不过Emacs会记录多次“移除”操作的内容,这一点可要比windows操作系统提供的“剪贴板”功能要强大多了。这种记录多次“移除”操作内容的机制在Emacs中叫做“移除环”——Yank Ring。

Emacs中的查找和替换

任何编辑器都有查找和替换的功能,Emacs也不例外。在Emacs中最常用的查找方法是“增量查找”。除此之外,Emacs还提供了“正则查找”、“词组查找”、“简单查找”三种方法。这些查找方法,一般来说,熟练掌握其中的一至两类就足够应付日常使用的需要了。

Emacs中的文件操作

基础的Emacs文件操作是创建、保存、另存。

创建新文件: 使用组合键 Ctrl-x Ctrl-f 打开“find file” 在提示符处输入一个不存在的文件名 回车确认后,Emacs即创建了一个空的Buffer供输入使用。 保存文件 Emac的保存文件非常简单,只需要按下组合键Ctrl-x Ctrl-s即可。 另存文件 要另存一个文件,按下组合键Ctrl-x Ctrl-w,按提示输入新的文件名即可。

常用快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
C-v : 向前移动一屏(PageUp)
M-v : 向后移动一屏(PageDn)

导航操作:
c-p            上一行
c-n            下一行
c-f            下一个字符
c-b            上一个字符
c-a            行首
c-e            行尾

M-p            下一段
M-b            上一段
M-f            下一个单词
M-b            上一个单词
M-a            句首
M-e            句尾

c-v            下一页
M-v            上一页

c-l            以本行为中间显示

M-<            文本头
M->            文本尾部

c-M-v            不移动光标让另一个窗口翻下一页
c-S-M-v(S:shift)    不移动光标让另一个窗口翻上一页

撤销操作:
c-_ / c-x c-u        撤销
c-h l            列出最近操作
M-x revert-buffer    重新读入buffer(撤销本次全部更改)

文件操作:
c-x c-f            打开文件(没有就创建一个新的)
c-x c-s            保存文件
c-x c-w            另存为文件
M-x recover-file 文件名    从错误中恢复(读取自动保存的文件)

buffers:
c-x b 输入buffer名字    切换buffer
    方向键可以切换buffer
c-x k 输入buffer名字    终止buffer
c-x c-b            列出所有buffer
    之后按下:
    1            让选中的个buffer全屏
    o            让选中的buffer在另外的窗口显示并且切换到该窗口
    c-o         让选中的buffer在另外的窗口显示并且不切换到该窗口
    s            标记当前buffer为保存
    d/c-d        标记一个要删除的buffer并且光标下/上移动
    x            按下x后执行标记了要删除的buffer或者标记要保存的buffer

fram&windows:
c-x 2            在frame内横向分割两个windows
c-x 3            在frame内纵向分割两个windows
c-x 1            删除其他windows
c-x 0            删除当前windows
c-x o            切换到另外的窗口
#c-x {            水平缩小当前窗口(分两个窗口的时候)
#c-x }            水平扩大当前窗口
c-x 5 2            水平创建一个新的frame
c-x 5 0         杀死当前的fram(最后一个不可以哦)
c-x 5 o            切换fram

Searching:
c-s            向前搜索
c-r            向后搜索
搜索时按下:
    M-p        搜索历史向上
    M-n        搜索历史向后
M-%            搜索并替换,替换时询问每一个是否需要被替换(y表示是n表示否!表示全部y)
M-x replace-string    搜索并替换,不询问
c-r             进入紧急编辑(保存当前的查询替换的状态)
c-M-c            退出紧急编辑
c-[            取消紧急编辑(无视原来保护的现场Orz)
M-x occur 匹配串    找到并列出所有匹配串

helping:
c-h            帮助首菜单
c-h c-h            帮助buffer
c-h k    按键        显示绑定这个键位的功能
c-h a    输入功能    显示对应的按键(正则匹配)
c-x c-h            显示全部c-x的命令
c-x w    输入功能    显示对应的按键(非正则匹配)
c-x h    输入功能    显示这个功能的具体功能