神的编辑器 Emacs 生存指南

关键字

Emacs, GNU, Freeware, Open Source, Lisp, Richard Stallman, Guy Steele, James Gosling

内容提要

本文面对的读者并不是 Emacs 的重度用户,而是先习惯了 Windows 下文本编辑器而又需要在 Linux 下工作时用到 Emacs 的程序员们。

对于热爱思考的程序员们来讲,Emacs 是一款在成长之路上必须修炼的软件。 当听到 Emacs 这个单词,如果你没有激动,也许你不能算是一个真正意义上的自由程序员。

总的来说,世界上只有两种编程语言,C 和 Lisp。而 Emacs 正是它们的合体。

它是一款开源文本编辑器软件,Emacs 和 GCC 一起夯实了自由软件运动和开源文化的物理基础。人们可通过在 Emacs 中编写软件代码,并使用 GCC 编译来创造自由软件。

当我们谈到 Emacs,一般指 GNU Emacs,本文开始会对它的历史和花絮不太着笔调的侃述一番,然后按对 Emacs 的掌握程度由浅入深地来划分本文内容。

我们预期本文的读者主要有三类人:

  1. 习惯使用 Windows 或 Mac,但需要在 Linux 下进行文本编辑和开发的工作求生者,那么本文适合你;
  2. 在 Linux 下使用 Emacs 的入门者,已熟悉 Emacs 基础操作,但想更进一步的学习者,那么本文续集适合你;
  3. 如果你是每日 8 小时 以上的时间活在 Emacs 中的大神,为了使用它,你的“ 小指头受了伤。然后给它装上了脚踏板,并已开始用它煮咖啡”,那么阅读本文正文部分对你来说也许意义不大,但你可以指出本文的谬误之处,以帮助前两个级别的程序员们。

GNU Emacs 历史

追溯 Emacs 的诞生,距今可能有 45 年以上的历史,版本号到达了 26.2。1975 年某个突发灵感的一天,Richard Stallman 和 Guy Steele 作为 MIT Lisp 组织的成员开始合作开发了 Emacs。前者是 GNU 组织自由软件组织的发起人,也是 GCC 的作者,黑客中的黑客中的黑客,后者是 Schema 语言发明者,现代也为 Common Lisp 的发展贡献了不少力量。所以 GNU Emacs 的主要编码语言是 C 和 Emacs Lisp。

Emacs 最初的故事发生于上个世纪 60 年代后期,在文本编辑器 TECO (Text Editor and COrrector)的基础上扩展了一系列的命令和宏。那么 Emacs 的缩写是什么?

  • Editor MACroS:编辑器宏
  • ESCAPE、META、ALT、CONTROL、SHIFT:五个功能键
  • Eight Megabytes And Constantly Swapping:8 MB,不停的交换
  • Emacs Makes All Computing Simple:它简化了所有计算

值得一提的是,Java 之父 James Gosling 在 1981 年开发了在 Unix 上运行的 Emacs 类编辑器 Gosling Emacs,以 C 语言编写,Mocklisp 作为扩展语言。1984年, Richard Stallman 开始致力于开发 GNU Emacs,这是一个自由软件,以代替 Unix 下专有的 Gosling Emacs。最初 GNU Emacs 在 Gosling Emacs 基础上开发,不过后来用一个真正的 Lisp 解释器 Emacs Lisp 解释器代替了原来的 Mocklisp 解释器,这意味着实际上重写了几乎全部代码。

GNU Emacs 是 GNU 计划的第一个项目,以 C 语言编写,以 Emacs Lisp(其解释器也由 C 实现)作为扩展语言。GNU Emacs 最早广泛发布的版本是 15.34,出现于1985年。

实际上版本 2 到 12 并不存在,GNU Emacs 的早期版本都是以“1.x.x”的形式编号,直到 1.12 版时开发人员放弃了这一记法,因为他们认为主版本号是不应该改动的,所以版本号从“1”跳跃到了“13”。因此,Version 13 是第一个 public release,它发布于 1985 年 3 月 20 日。

Emacs 生存指南

对于国内使用 Windows 为主的用户来说,Emacs 入门门槛稍高。而像笔者一样,需要使用 Linux 开发时,我们通常可以选择 Vim 和 Emacs 两种编辑器。

学习 Emacs 对于只在 Linux 工作的人非常重要,但此生存指南秉承“物为我用”的考虑,会参考《文本编辑的本质》中计算机中的纯文本编辑一节提到的功能展开。在通过适当的练习,掌握了这些功能的操作后,在 Emacs 中即可生存无忧。

首先是下载安装

下载地址:https://www.gnu.org/software/emacs/

在 Windows 之中,下载安装 Emacs 并不难,通常是一个安装包或者压缩包,这和 Windows 中的其他软件并没有不同,唯一需要指出的是,启动文件是 bin 目录下的 runemacs.exe,而直接运行 emacs.exe 也不是不行,只是会有一个控制台窗口。我们可以双击 runemacs.exe 启动。

Windows 中有一点需要注意的是设置编码为 UTF-8。另外,Emacs 25 版本后频繁垃圾回收导致性能低下,窗体卡顿,设置中文字体有一定效果,但根本的是设置垃圾回收,方法是在用户目录创建一个 .emacs 主配置文件,如下替换 <username> 为当前用户名:

C:\Users\<username>\AppData\Roaming\.emacs

写入如下内容,后保存,你的 Emacs 就会快得飞起来。

(custom-set-variables
 '(current-language-environment "UTF-8")
 '(custom-enabled-themes nil))
(custom-set-faces
 '(default ((t (:family "Courier" :foundry "raster" :slant normal :weight normal :height 98 :width normal)))))


(when (eq system-type 'windows-nt)
(setq gc-cons-threshold (* 512 1024 1024))
(setq gc-cons-percentage 0.5)
(run-with-idle-timer 5 t #'garbage-collect)
;; 显示垃圾回收信息,这个可以作为调试用
;; (setq garbage-collection-messages t)
)


(set-language-environment 'Chinese-GB)
(setq locale-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(set-default buffer-file-coding-system 'utf8)
(set-default-coding-systems 'utf-8)
(set-clipboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(modify-coding-system-alist 'process "*" 'utf-8)
(setq default-process-coding-system '(utf-8 . utf-8))
(setq-default pathname-coding-system 'utf-8)
(set-file-name-coding-system 'utf-8)
(defun change-shell-mode-coding ())

在 Linux 之中,我们通常使用自带的包管理工具安装 Emacs,以 CentOS 为例,执行 “sudo yum install emacs -y” 即可。我们可以在字符界面运行 emacs 启动。

在 macOS 中,我们通常使用包管理工具 brew 安装,执行 “brew cask install emacs” 即可。我们可以在 LaunchPad 中启动安装好的 Emacs。

为了缩短按键距离和提高操作连贯性,使用鼠标和菜单并不是 Emacs 的思维方式。Emacs 主要靠键盘快捷键运作,每一个快捷键实际是绑定的一个 Emacs Lisp 函数或命令。

Emacs 概念

要掌握 Emacs,首先要进入 Emacs 创造者的思维方式,心理学告诉我们,思维方式的元素即抽象概念。所以,先学习几个 Emacs 概念:

  • Window:这里的 Window 并不是 Windows 中的窗口概念,而是指 Emacs 窗口中的一块区域。
  • Frame:可以理解为视图,编辑一个文件我们可以同时打开多个 Frame,可以分别放置在一个或多个显示设备中。
  • Buffer:用来编辑的一块缓存,它可以关联或不关联一个文件,Emacs 窗体中会显示正在编辑的 Buffer
  • Minibuffer:Emacs 窗体下方一行,我们按一些快捷键时,会获得输入焦点
  • mode:每个文件可以同时会对应一种模式,默认文本模式,编写 C 程序会切换到 C mode

快捷键缩写约定

  • C : Control 键。
  • M : Meta 键。通常没有 Meta 键的键盘上的 Alt 键被当作 Meta 使用。
  • S : Shift 键。
  • s : Super 键。通常键盘的窗口图标的 Win 键。
  • :同时按。比如 C-a 就是按下 Control 键的同时,按下 a。
  • 空格:出现在快捷键中表示,按下一个后再按另一个。
  • RET:回车键。
  • SPC:空格键。

快捷键

基础的:文件、移动、删除、撤销
  • 新建:C-x, C-f,然后输入一个待新建的文件路径和名称,Emacs 会关联一个 Buffer。
  • 打开:C-x, C-f,然后输入一个待新建的文件路径和名称,Emacs 会关联一个 Buffer
  • 保存:C-x, C-s,如果关联了文件,会直接写入硬盘,如果没有则需要输入一个文件路径和文件名,Emacs 会将 Buffer 内容写入该文件。
  • 另存:C-x, C-w,然后输入一个文件名,如果存在会覆盖保存,如果不存在会创建保存。
  • 退出:C-x, C-c
  • 输入点:会有一个竖着的长方形的光标指示
  • 移动:可以使用键盘的箭头键和翻页键
    • 前一个字符:C-f,f 即 forward
    • 后一个字符:C-b,b 即 backward
    • 行首:C-a,设计为 a 键估计是为了方便,a 是字母表的首字母
    • 行尾:C-e,e 即 end
    • 上一行:C-p,p 即 previous
    • 下一行:C-n,n 即 next
    • 段首:M-a
    • 段尾:M-e
    • 段首前:M-{,即 M-S-[
    • 段尾后:M-},即 M-S-]
    • 下一屏:C-v
    • 上一屏:M-v
    • 转到行:M-g g,输入行号
  • 插入:输入点移动到一个位置,直接输入
  • 删除:C-d,或按 Del 键
  • 撤销:C-/,或 C-_ 或 C-x u(先按 C-x,再按 u)

以上即使用 Emacs 进行文本编辑的基础快捷键,接着还有:

最常用的:选择、剪切、复制、粘贴
  • 选择:按 C-SPC 或 C-@(C-S-2)确定起点,再移动光标到合适的位置,反白即为选择的区域
  • 剪切:C-k,可近似理解为剪切,但实际上不是。参考帮助。
  • 复制:M-w(macOS 终端需要设置 Meta 转 ALT)
  • 粘贴:C-y
一定用得上的:查找和替换
  • 向下查找:C-s,到文件尾后会有提示音,再按将从文件头查
  • 向下查找下一个:C-s,到文件尾后会有提示音,再按将从文件头查
  • 向上查找:C-r,到文件头后会有提示音,再按将从文件尾查
  • 向上查找下一个:C-r,到文件头后会有提示音,再按将从文件尾查
  • 正则查找: C-M-s,C-M-r,分别向下和向上
  • 替换:M-x replace-string RET oldstring RET newstring RET,这里用到了 replace-string 命令,是个高级内容。
  • 正则替换: M-x replace-regexp RET regexp1 RET regexp2 RET
较常用的设置和高频文本
  • 个性化:比如调整换行的方式,调整显示的字体等,大多通过修改 .emacs 文件实现,如果出现中文乱码,可在菜单选择多语环境的语言环境为 Chinese-GB18030,并保存设置。
  • 输入当前日期: C-u M-! date,实际是返回的 Shell 命令结果
  • 输入当前时间: C-u M-! time,实际是返回的 Shell 命令结果
最关键的:帮助
  • 帮助:C-h r,会打开 Emacs 帮助手册,并可以在菜单中选择语言,以及 r 换成 m k f v 等各有意义,留在续集 《Emacs 成长指南》 中叙述。

快捷键那么多,如何掌握

练到手熟,人的手指会形成肌肉记忆,最快的方式就是:练习、练习、再练习。素材可以选择 C-h r 的内容,或者自定义目标。

这些快捷键可满足最基本使用,在《EverEdit、Emacs 与 Vim 的常用快捷键对比》中有表格式列举,方便读者记忆。

进一步怎么学

提问:如何同时输入时间和日期?当然,不嫌麻烦你可以按两次快捷键,但如果限制为一个快捷键的话,则回答并不容易,这需要熟悉 Emacs 一大法宝 org-mode,或者用到自定义函数了。

毫无疑问,想透彻掌握 Emacs,学习 Emacs Lisp 是必经之路,之后就能随心所欲编写自己的扩展,而随心所欲之中,也包含了 Emacs 之外操作系统的知识,比如 Shell 的相关内容,笔者将在《Emacs 成长指南》 中叙述。

相关文章

Emacs 成长指南,待续…

发表评论

电子邮件地址不会被公开。 必填项已用*标注