跳到主要内容

Emacs 基本概念

做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。——侯世达

侯世达定律指明了复杂性的叠加带来的认知难度的指数级上升。所以有一条学习新事物的建议是,从教科书开始,或通过你的认知框架找到恰当的学习素材,之后从最简单的概念开始理解,逐步由浅入深,并基于我们人类总是乐观评估自身能力的习惯,充分考虑复杂性叠加带来的影响。

Emacs 概念

1. 文件和目录(file)

文件是操作系统的文件概念,目录用来容纳文件或目录。

2. 缓冲区(buffer)

缓存区对应一块内存,其实 buffer 源自计算机基本原理,或说 C 语言,就是预先向操作系统申请预留的一块内存。

信息

当我们打开一个文件编辑时,其实有一个假象,我们以为我们的修改是直接修改了硬盘上的文件,但其实不是。

真正发生的是,我们所有的输入输出直接修改的都是内存中的内容,直到我们向计算机下达保存命令时,我们在内存中编辑的文件的副本才被重新写入到硬盘中,如果告诉计算机我们不需要把改变的内存内容回写到硬盘上的文件,也可以丢弃所做的修改。

所以,buffer 就是 buffer,它的内容是从一个原始文件读取的副本,它们通过路径和名字来和原始文件对应。我们通过键盘和鼠标的操作改变的都是 buffer,直到我们使用保存缓冲区命令(Save Buffer,快捷键为 C-x C-s。如果现在还看不懂这个快捷键的表示也没关系,可以使用鼠标点击菜单 File-Save 替代)之后,所有的修改才生效。

Emacs 也有不对应文件的缓冲区,它们通常是由一对**来包裹缓冲区名,比如,*scratch**Help* 等。

3. 框架(frame)

  • frame: 操作系统的窗口

4. 窗口(window)

  • window: 操作系统中窗口的面板

和 Windows 操作系统的概念刚好相反,不知不是为了避开 Windows 这个注册商标。无论是 frame 还是 window 都是内存中数据结构的一种视图,它们共享一个进程。

5. 模式(mode)

模式对当前编辑的文本提供更多的感知,使用 Emacs Lisp 可以自定义新模式。

主模式(major mode)

一个缓冲区只能处于有一个主模式中,退出一种主模式的方法是进入另一个主模式。

模式mode功能
基本模式fundamental mode默认模式
文本模式text mode普通文本
邮件模式mail modeEmail
读邮件模式RMAIL mode管理邮件
只读模式view mode查看文件
Shell 模式shell mode内部运行 Shell
FTP 模式ange-ftp modeftp
Telnet 模式telnet modetelnet
大纲模式outline mode写大纲
缩进文本模式indented text mode自动缩进文本
图形模式picture mode画图
TEX 模式TEX modeTEX 文件
LATEX 模式LATEX modeLATEX 文件
C 模式C modeC 语言
C++ 模式C++ modeC++ 语言
FORTRAN 模式FORTRAN modeFORTRAN 语言
Emacs Lisp 模式Emacs Lisp modeEmacs Lisp 语言
Lisp 模式Lisp modeLisp 语言
Lisp 交互模式Lisp interaction modeLisp 表达式

辅模式(minor mode):定义的一些特定的行为

模式mode功能
自动换行模式auto-fill modeword wrap
改写模式overwrite mode替换而不是插入
自动保存模式auto-save mode自动保存文件到临时文件
行号模式line number mode显示行号
临时标记模式transient mark mode高亮
大纲模式outline mode大纲
VC 模式VC mode版本控制

移除环(kill-ring)和召回(yank)

kill-ring :类似 Windows 剪贴板,大部分大于一个字符的移除内容都会进入移除环,但也有一些自定义的不进入。

Emacs 中有两个类似的操作。删除(delete)和移除(kill),删除的文本不进入环,移除的文本进入环。

yank:类似 Windows 的粘帖,进入移除环的内容可以被召回到屏幕的光标处再次插入当前文本,效果就是粘帖。

实践一下:Emacs 启动和退出

1. 启动 Emacs

通常将 Emacs 目录放在 Windows 的 PATH 变量中,然后在命令行使用 emacs 启动。

如果后面跟上一个字符串,如 emacs filename.txt,则会默认创建一个 filename.txt 的同名 buffer。

当然,也可以在图形界面下和启动其他程序一样,使用鼠标双击程序或快捷方式来启动。

2. 退出 Emacs

在学习如何使用快捷键 Ctrl+x, Ctrl+c 之前,可以先使用鼠标点击菜单的退出菜单来退出 Emacs。

3. 配置文件

首先,删除 ~/.emacs~/_emacs 文件,建议使用 ~/.emacs.d/init.el 文件作为配置文件。

4. 练习,练习,再练习

Practice, Practice, Practice

在不同的时间和不同设备上反复执行以下步骤,直到手指和头脑都记住进入和退出 Emacs 的方式:

  1. 双击启动 Emacs 程序,或用任何你喜欢的方式进入;
  2. 按下 Ctrl+x,Ctrl+f ~/.emacs.d/init.el,访问这个缓冲区。
  3. 输入一些分号 ;;;;
  4. 按下 Ctrl+x,Ctrl+s,Emacs 会保存 init.el 文件。
  5. 按下 Ctrl+x,Ctrl+c,退出 Emacs。

问题处理:如果出现 Error in initial file,则是因为 init.el 中出现了错误,需要修正后重新进入,如果不了解如何修复,可以备份此文件,并清空内容,等以后了解后再恢复。

Windows 中配置为使用 Emacs 打开文件的方法

Windows 文件管理器中,右键添加使用某程序打开是修改注册表,将下面的代码中emacsclientw.exe的路径修改后, 将内容保存为 Open with Emacs.reg 文件,然后双击导入注册表中。

Open with Emacs.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]
[HKEY_CLASSES_ROOT\*\shell\Open with Emacs]
@="&Open with Emacs"
[HKEY_CLASSES_ROOT\*\shell\Open with Emacs\command]
@="d:\\soft\\Emacs\\emacs-29.0.50\\bin\\emacsclientw.exe -n \"%1\""
[HKEY_CLASSES_ROOT\Directory\shell\openwemacs]
@="Open &with Emacs"
[HKEY_CLASSES_ROOT\Directory\shell\Open with Emacs\command]
@="d:\\soft\\Emacs\\emacs-29.0.50\\bin\\emacsclientw.exe -n \"%1\""

Emacs 软件布局

1. 菜单

上方是菜单,默认是:File Edit Options Buffers Tools Text Help

通常 Help 之前的倒数第二个菜单是模式菜单,如 Text

2. 工具栏

菜单下有一行工具栏,也可能通过设置关闭,这不太重要。

缓冲区关联文件 读文件到缓冲区 读取目录 关闭缓冲区 写入文件 | 撤销 剪切 复制 粘帖 | 查找

3. 内容区域

中间是内容编辑区域。

下方有一条深色模式分割条、

  • 左侧:
    • %%:只读模式,已修改
    • %*:只读模式,已修改
    • --:可写模式,未修改
    • **:可写模式,已修改(很多编辑器都文件名加 * 表示已修改)
  • 中间:缓冲区名字
  • 右侧:括号内分别是主模式和辅模式,如(Markdown ElDoc)

Emacs 命令

先进性一个查看快捷键对应的命令的实验:

  1. 按快捷键 Ctrl+H,K,光标会跳转到最下方并显示:
Describe the following key, mouse click, or menu item:
  1. 再输入:Ctrl+F,则会显示:
C-f runs the command forward-char (found in global-map), which is an
interactive built-in function in ‘C source code’.

It is bound to C-f.

(forward-char &optional N)

Move point N characters forward (backward if N is negative).
On reaching end or beginning of buffer, stop and signal error.
Interactively, N is the numeric prefix argument.
If N is omitted or nil, move point 1 character forward.

Depending on the bidirectional context, the movement may be to the
right or to the left on the screen. This is in contrast with
<right>, which see.

Probably introduced at or before Emacs version 20.1.
This function has a ‘byte-compile’ property
‘byte-compile-zero-or-one-arg’. See the manual for details.

[back]

我们知道 Emacs 是一个内置帮助的文本编辑器,上述快捷键即查看快捷键的帮助文件。这是相当重要的一个特性:Emacs 中每个命令都有一个正式的名字,实际上它们是 Emacs 内部的宏、Lisp 函数(以及少量 C 函数)。由于这些名字都较长,所以一般常用的命令都被绑定为一个快捷键,比如刚才的 Ctrl+F

上述两句话关键,这里是可以提升效率的地方。和诸多领域的“底层逻辑”是一致的。类比地举例,它们在程序开发上称为“函数复用”,在重构时叫做“方法抽取”,在商业上被称作“场景化”,法语叫“Déjà vu”,在学习上叫“举一反三”。

信息

为什么在此插入一段看似无关的东西,是因为学习过程要利用认知心理学规律,推荐以下图书:

  • 《哥德尔、埃舍尔、巴赫——集异璧之大成》
  • 《表象与本质》:以旧识新,类比思维是认知的基础逻辑。

你会发现 Emacs 中编辑的操作方式其实也是自然而然的:mode 就是一种编辑任务的场景化,在场景提供的上下文中,mode 的功能提供对当前编辑文件的更多的感知和便利性:在具体的场景下,当你准备输入的信息,编辑器可以根据场景和上下文来预判可能的输入范围,然后来提供输入建议。

脑洞

Emacs 可集成 AIGC,对相似的文本处理过程提供复用和智能,从而带来效率。

理解

Emacs = Editor + Macros

Editor 大体没什么差别,无非上下左右移动、插入和删除六种,而魔法在于可复用的广义的 Macros 中。

所以自然而然地,编辑过程会被不断抽象和简化,直到它们被绑定为一个快捷键。

这就是 Emacs 关于文本编辑的本质。