GNU Emacs 是什麽
GNU EMACS 是 GNU 计划下的第一个产品
EMACS 为 Editor MACros 的缩写
Richard
Stallman 於 1975 年在 MIT 首次 撰写 EMACS editor 目前 GNU EMACS 已发展到 19.28 版
本文所讨论的 GNU EMACS 也以 19.28 版为主 GNU EMACS 秉持著 GNU 的精神 它依然是
free 的 任何人都可以 “anonymous ftp” 的方式至 prep.ai.mit.edu 这个 site 取得 GNU EMACS 的
原始码
GNU EMACS 不是 public domain 的产物 它有版权也有使用上的限制 那就是任何得
到它的人都不可以将其视为私有的财产 修改过的 GNU EMACS 也不可以作为商品来牟利 金钱
交易的行为是绝对被禁止
EMACS 有多种版本可适合不同的工作平台 platfrom 适合 UNIX 环境的有 GNU EMACS
Unipress EMACS 以及 CCA EMACS
其中以 GNU EMACS 最常被使用 本文也只介绍 GNU
EMACS 适合个人电脑的 EMACS 有 FreEMACS MicroEMACS 以及 Epsilon 当然 也有使用
在 VMS 环境的版本
GNU EMACS 是由 C 与 LISP 语言写成 任何人都可依据需要将个人所发展的函式 function
加入 GNU EMACS 上 当然 新发展的软体是不可以从事商业买卖 只能将它无条件的奉献出来
新发展的函式可以直接在 EMACS 中使用 不需重新编译 complie 整个 EMACS 而且新增的
函式也不会破坏 EMACS 原有的结构 就因为有此特性 EMACS 的函式可以 与日俱增 愿与他
人共享成果的使用者 可以透过电子邮件或电子公布栏 将函式的原始码公诸於世 公布的函式
最後会经由 FSF 的审查 以决定是否要加入新版的 EMACS 中 FSF 也鼓励使用者将所发现的错
误 透过相同的管道 提供给 FSF 作为改进 之用 GNU EMACS 就是在如此的运作下 靠大家共
同的努力来提升品质 以达产品的稳定性
GNU EMACS 的特质
倒不如说它是一个以编辑器为主干的 环境软
GNU EMACS 与其说它是一个编辑器 editor
体 一般的软体都是将编辑器视为一个附属功能 只有 EMACS 以编辑器为基石 在其上发展其它
的功能 以收发电子信件的软体为例 电子信件软体是以收发信件为环境的基石 任何电子信件的
软体都只有在使用编辑器时 才呼叫相关的编辑器
EMACS 的出发点就与众不同
EMACS 一
切以编辑器为主 任何的功能都是建基在编辑器之上
所以 进入 EMACS
就等於是进入了一个编辑环境 这个编辑环境提使用者许多功能 让使
用者如置身在一个全功能的作业系统中 EMACS 自行发展了一个 “bourne-shell-like” 的 shell 除
了 EMACS 自己的 shell 外
EMACS 还可以让使用者自行选择所使用的 shell EMACS 可以读
送 e-mail
EMACS 可以透过 ftp 来编辑远方 host 上的档案 而不需要签入 login 档案所在的
host
EMACS 也可做 telnet 与 relogin 的动作 EMACS 也可以读 news
EMACS 也提供了年
可以让使用者查阅日期 也可以将重要的事情在年历上标示出来 EMACS 又提供
历 calendar
了 “Diary” 的功能 当特定的日期与时间到来时 会在萤幕上将 “Diary” 上 的事情显示;EMACS 也
有撰写文章大纲的功能
EMACS 更提供多种程式的编译功能 让使用者可以在 EMACS 中一边
编辑程式一边编译程式 EMACS 更有自己的 debugger 使程式的除错 编辑与编译在 EMACS 中
同时完成
所以 EMACS 所提供的不只是一个编辑器而己 它所提供的是一个整合的工作环境 而这个环
境是建立在编辑的基石上 它希望使用者进入了 EMACS 以後 可以在 EMACS 的环境中完成 所
有的工作 不需要离开 EMACS 要离开 EMACS 就是要离开电脑的 时候 logout
EMACS 除
了是一个整合的工作环境外 它还具有以下的特性
display editor
real-time editor
advanced editor
第 2 页
共 53 页
3
Self-documenting
Customizable
Extensible
support X window enviornment
EMACS 是一个 display 编辑器
因为每一个被编辑的文字都会被显示在萤幕上
EMACS 是一个 real-time 的编辑器 因为当新的文字被键入时 萤幕会在非常短的时间内被更
新 EMACS 的编辑功能不只具备一般编辑器所有的功能 它还提供如下的功能
♦ 文字的填充 filling of text
♦ 程式自动内缩功能
♦ 可以同时阅读一个以上的档案
对於字元 characters 字 words 列 lines 句子 sentences 段落 paragraphs
以及各种 程式中的 expression 和注解 comments 都有其自有的处理方法
页 pages
EMACS 是一个 Self-documenting 的软体 因为在任何时候都 可以 “ Ctrl-h” 指令来得立即的
帮助 因为 透过 “ Ctrl-h” 可以得知每一个 EMACS 的指令
EMACS 是可以 Customizable 的 使用者可视个人的需求 来改变 EMACS 指令的定义 GNU
EMACS 的 Customization 的设定非常简单 使用者可以很方便的使用它
EMACS 是 Extensible
的 GNU EMACS 是 由 LISP 语 言 所 写 成 的 函 式 共 同 组 成 的
函式与函式间的互动关系
dependency 不强 就因为 EMACS 是由函式所组合而成的 所以可以随时将函式作增减而不会
破坏 EMACS 既有的结构
EMACS 也针对 X 的视窗环境 提供自己的选单 menus 和滑鼠按
纽 mouse bottons 功能 EMACS 对於 text-only 的终端机也提供许多与 X 环境相当的服务品质
例如在文字模式的终端机 可以同时开启数个的档案 档案可以互相切换 当使用 shell 模式 来执
行 shell 指令的同时也可以编辑档案 但本文的只讨论 text-only 的 EMACS 使用法
以上的种种
就是有关 EMACS 的特色 至於如何使用这些功能就下列章节所要讨论的重点
Emacs 的线上辅助说明
EMACS 是一个整合的工作环境 初次使用 EMACS 或不熟悉 EMACS 的人 常会不知所措
所以 EMACS 提供了非常便捷且功能强大的线上辅助说明 on-line help 来帮助使用 EMACS
Emacs 的基本知识
在未讨论 EMACS 的线上辅助说明时 先谈谈如何启动 EMACS
启动 EMACS 的方法很简
单 只要在萤幕的提示下键入 “emacs” 即可 离开 EMACS 只要键入”Ctrl-x Ctrl-c”即可离开
EMACS
键入 “Ctrl-x Ctrl-c” 的方法是 先按住键盘上的 Ctrl 键不放再按下英文字的 “x” 即可
键入 “Ctrl-c” 的方法一样 先按住键盘上的 Ctrl 键不放再按下英文字的 “c” 即可 当然进入与离
开 EMACS 的方法还有多种 这里只是介绍一种方法 让使用者可以很快的使用 EMACS 的线上
辅助说明 至於其它的方法会在以下各章节中陆续提及
除了进入与离开 EMACS 的方法必须知道外 还有一个指令非常用那就是 “Ctrl-g”
用来取消键入的指令 如果不想执行所键入的指令 可以随时将其取消
“Ctrl-g” 可
EMACS 键入指令的方法有二种
♦ Ctrl 键
♦ Meta 键
所有 EMACS 的指令都可以 Meta 键表示出来 键盘上若无 Meta 键 则可以 ESC 键来取而
代之 常用的 EMACS 指令通常会有一个 Hotkey 与之连结
Hotkey 的构成 通常是以 Ctrl 为
第 3 页 共 53 页
4
开头的型态出现 例如 “Ctrl-x Ctrl-c” 这一个 Hotkey 则代表了 EMACS 指令的 “save-buffers-kill-
emacs” 若要使用 Meta 键来表达与 Ctrl-x Ctrl-c 相同的效果 则必须键入
“ESC-x save-buffers-kill-emacs”
使用 Meta 键 可以利用 EMACS completion 的功能 因为 completion 可以让使用者键入最
少的字 就可使系统唤起所欲执行的命令 以下就介绍 EMACS 的 completion
EMACS completion 的意思是 只要键入字串的部份
EMACS 会将其余的部份自动填入其应
在的位置 如果所给予的字串不足以决定其余的部份 EMACS 会将所有可能的结果都列出来 以
供使用者来决定所需要的字串名称
completion 所适用的范围如下
♦ 指令
♦ 特定目录下的档案
♦ 缓冲区
♦ EMACS 的变数
至於何谓特定目录下的档案 缓冲区以及 EMACS 的变数 会在以後的章节中陆续谈及 此处
讨论 completion
只 是 为 了使 用 completion 於 EMACS 的线 上 辅 助说 明 使用 EMACS 的
completion 有三种方法
♦ TAB 尽可能将其余的字串填满
♦ SPACE 将 puncutation 字元之前的字填满 填充的字不会超过一个字以上
♦ ? 将所有可能的 completions 选择都列出来
使用 completion 的做法是将部份字串键入後 再按下 TAB
SPACE 或 ? 即可
“M-x au TAB” 则萤幕的最下方会出现 “键入 TAB 则萤幕会在另一个视窗出现
Possible completions are
auto-fill-mode
auto-raise-mode
若键入 “M-x au SPACE”
若键入 SPACE
例如
键入
auto-lower-mode
auto-save-mode
则萤幕的最下方也会出现 “M-x auto-”
则萤幕的另一个视窗也会出现如下的命令
Possible completions are
auto-fill-mode
auto-raise-mode
auto-lower-mode
auto-save-mode
这似乎意味著 TAB 与 SPACE 的功能一样 其实不然 二者的差异可从下一个例子看出 键
入 “M-x auto-f TAB” 可得 “M-x auto-fill-mode” 但键入 “M-x auto-f SPACE” 只能得到 “M-x
auto-fill-” 欲得到 “M-x auto-fill-mode” 则必须再键入一次 SPACE 这就是前面所说的 “SPACE” 一
次只填一个 “puncutation” 之前的一个字的意思 而 TAB 则是尽可能的将所有可以判断出来的字串
呈现出来 其显示字串的长度并不以一个 “puncutation” 为限 键入 ? 的作用 是在 EMACS 的另
一个视窗上显示所有可能的字串 此时使用者可根据视窗上的讯息键入适当的命令 例如键入 “M-
x au ?” 萤幕上出现另一个视窗显示如下的资讯
Possible completions are
auto-fill-mode
auto-raise-mode
键入 “M-x au ?” 的地方
不同的地方
auto-lower-mode
auto-save-mode
则不会执行
若视窗的内容太多无法一次穷尽
二个指令来使视窗做上下的移动
completion
的动作
此时就必需卷动视窗
第 4 页
共 53 页
这是 ? 与 TAB
SPACE 最大
卷动视窗可以用 “Ctrl-v” 与 “Meta-v”
5
Emacs 的自学教材
想快速了解 EMACS 的人 可以参考 EMACS 的自学教材 tutorial
使用 EMACS 自学教
材的方法很简单 只要键入 “Ctrl-h t” (help-with-tutorial) 即可进入 EMACS 的自学的状态了
EMACS 的自学教材可分成以下几部份
1. 介绍 EMACS 指令的键入方法 即介绍 Ctrl 与 Meta 键
2. viewing screenfuls
3. basic cursor control
4. Ctrl-g 的用法
5. EMACS 的 window 与 multiple windows
6. inserting and deleting
7. undo
8. EMACS 档案的处理
9. EMACS 的 buffers
10. extending the command set
11. 简介 EMACS 的 mode line 与 echo area
12. searching
13. recursive editing levels
14. getting more help
15. leaving EMACS
16. 有关 EMACS 的版权问题
EMACS 的自学教材是以编辑功能的介绍为主 虽然 EMACS 的功能不只如此
但编辑是
EMACS 的最基础的功能 要了解 EMACS 当然要从它的基本著手 所以 EMACS 的自学教材也以
编辑的介绍 为主 至於 EMACS 其它的工件环境 是无法从 此自学教材中得知 所以 本文会
在第三章简介 EMACS 的工作环境
Ctrl-h 的用法
EMACS 除了自学教材可供参考外 它还提供了其它的线上辅助说明功能 让使用者可以随时
查阅需要的相关讯息
EMACS 的线上辅助说明都是以 “Ctrl-h” 为开端 其种类 有以下二种
Ctrl-h
Ctrl-h Ctrl-h
键入 Ctrl-h (help-command) 萤幕的最下端会出现如下的讯息
C-h Type ? for further options
- 此时的 “Ctrl-h” 只是用做前置字 prefix key 它是用来等候使用者输入其它的指令 若输入 “?”
则萤幕的下方会出现所有可使用的选择 使用者可根据需要来选择合适的选项 若键入两次的
“Ctrl-h”Ctrl-h (felp-for-help) 萤幕下方 会出现
type one of the options listed or Space to scroll 此时
EMACS 会另外开启一个视窗 将所有与求助的选项都列出来 且会做一简要的说明 要卷动此视
窗则键入 Space 此新开启的视窗共有二十一个选项 包括
a b c f C-f i k C-k l m n p s t v w C-c C-
d C-n C-p C-w. 使用这二十一个选择项的方法非常简单 只要在 “Ctrl-h” 之後输入任一个选择就可
以了 例如 要选择 “a”
则执行 “Ctrl-h a” 即可
现在将 EMACS 常用的线上辅助说明一一作解释
Ctrl-h c
Ctrl-h k
Ctrl-h w
Ctrl-h a
Ctrl-h v
Ctrl-h i
别
EMACS 常用的线上辅助说明有
“Ctrl-h c” 与 “Ctrl-h k” 的功能相似
二者都是在寻求与 Hotkey 有关的讯息 二者唯一的差
就在於对指令的解释详细与否而已 ” Ctrl-h c” 是简述与 Hotkey 连结的命令 而 “Ctrl-h k”则
第 5 页 共 53 页
6
详述连结 Hotkey 的命令 二者都有一个前题的预设 那就是都是先知道 Hotkey 为何
步知道此 Hotkey 所使用命令的名称 今举 “Ctrl-x Ctrl-c” 的例子来说明二者的差别
而想进一
键入 “Ctrl-h c RET” (RET 亦即键盘上的 Enter 键 任何一个指令输入完毕时 必需 紧跟著
一个 Enter 此作用是用以告知系统 指令输入已经结束 可以开始执行相关的动作了 ) 则萤幕下
方会出现 Describe key briefly
- 在 “ ” 的後面键入 “Ctrl-x Ctrl-c” 则在原先出现 Describe key
briefly - 的地方则出现 C-x C-c runs the command save-buffers-kill-emacs” 键入 “Ctrl-h k RET” 则
萤幕下方出现 Describe key
- 在 “ ” 的後面键入 “Ctrl-x Ctrl-c” 则 EMACS 会另以一个视窗
显示如下的讯息
save-buffers-kill-emacs Offer to save each buffer, then kill this emacs process. With
prefix arg, silently save all file-visiting buffers, then kill. 此讯息的第一行是 Hotkey 所连结命令的全
名 以後的行数则是对此命令的详细说明 “ Ctrl-h w”w (where-is) 的用法与 “ Ctrl-h c” 和 “ Ctrl-h k”
正好相反
“ Ctrl-h w” 是在知道 EMACS 的命令而欲知是否有相对应的 Hotkey 时所使用的 例
如键入 “Ctrl-h w” 萤幕的下方会出现
where is command
在 “ ” 之後键入 “save-buffers-kill-emacs” 则在原处会出现 save-buffers-kill-emacs is on C-x C-
c 所以想知道命令是否有相对应的 Hotkey 可以此方法查知
“Ctrl-h w” 可以使用 EMACS 的
completion 但其最大的 不便处 就是必需给予指令的第一个字元 如 “save-buffers-kill-emacs” 必
若不键入 s 开头的子串
需先给予以 s 开头的子字串 才能逐步使用 EMACS 的 completion
而键入 s 之後的 任何字串 则无法找到相对应的指令 所以使用 “Ctrl-h w” 必需要记著指令的第
一个字 除此之外 EMACS 的线上辅助说明还提供了另一种帮助 可让使用者键入任意的子字串
都可以找到相对应的指令 那就是 “ Ctrl-h a”
键入 “Ctrl-h a” 则萤幕的下方会出现 command-
apropos (regexp)
此时只要给予与命令相关的任一子字串或 “ regular expression” 6.3 节会讨论何谓
regular expression 再按下 RET EMACS 会另开一个视窗 将所有涵盖此子字串或 regular expression
的指令全列出来
此指令与 “ Ctrl-h w” 最大不同处如下
♦ 使用 “ Ctrl-h a” 所键入的子字串 并不限於指令的第一个字元, 而 “ Ctrl-h w” 则必需以指
令的第一个字为起始字
使用 “ Ctrl-h a” 可给予指令中任何位置的子字串
♦ “ Ctrl-h a” 无法使用 completion 而 “ Ctrl-h w” 可使用 completion
♦ “ Ctrl-h a” 主要的目的是当使用者无法正确的键入指令的 第一个字元时 可以借此将所有
包含使用者记得的部份子字串 的指令都列举出来
EMACS 除了以上几个常用的线上辅助说明之外
还有一个非常实用的资料查阅中心 那就是
“ Ctrl-h i”
“ Ctrl-h i” 执行 “Info program” 它主要是用来浏 已建构成 树状结构的文件档案
目前所有与 EMACS 有关的文件档案都可 透过 Info 来阅览 最终所有与 GNU 有关的文件资料
将可以由此 而窥得其文件档案全貌
使用 info 模式 info mode 的方法很简单 只要键入 “Ctrl-h i” 就可查阅所有与 EMACS 相
关的文件资料 进入了 info 之後要如何 有效的使用它呢 会在下一节详细讨论
以上所谈的 就是较常使用的线上辅助说明种类
若线上辅助说明的讯息 是以另一个视窗显
示出来 此时的讯息 又无法一 幕 了然 想参考其它部份的资料 就必需卷动视窗
视窗卷动
的指令 可参考如下的方法
delete-other-windows
(本文所有与 Hotkey 相对应的指令都放於括号中) 保留
♦ Ctrl-x 1
游标所在的视窗 而将其它的视窗关闭
♦ Ctrl-x o other-window 可使游标在不同的视窗间切换 换言之 如果游标在工作的视窗
可以此指令将游标移出显示线上辅助说明讯息的视窗 反之亦然
♦ Ctrl-v scroll-up 将萤幕向上卷 如此则可看清萤幕下方的讯息
scroll-down) 萤幕向下卷 如此可以重复参考已经看过的资料
♦ Meta-v
第 6 页
共 53 页
7
Emacs 的 info 使用说明
前已略述 info 的使用法 现在就更进一步详述之 在 EMACS 的线上辅助说明功能中 info 的
内容可说是最为丰富的 因为
任何线上辅助说明的文件都可在 info 模式中找到 因为 info 就
是用来放置整个 EMACS 手册
info 对於 EMACS 文件的安排是采取树状的结构
行 info program 使用 info program 的方法有二
Ctrl-h i
ESC-x info
所以是以根部
root
为出发点
info 执
info 对於档案的编排 是以 Hypertext 的方法来处理所有的 相关文件 当键入 “Ctrl-h i” 或
“ESC-x info” 後 会先进入 info 树状 tree 结构的最顶端 如下就是进入 info 时的第一个画面
-*- Text -*- This is the file .../info/dir, which contains the topmost node of the Info hierarchy. The first time
you invoke Info you start off looking at that node, which is (dir)Top. ? File dir Node Top This is the top
of the INFO tree This (the Directory node) gives a menu of major topics.
此时 出现在萤幕的第一列是标头 header
息 最多可有五件事情
♦ 结点所在的档案 File
♦ 结点的名称 node
♦ 此结点的下一个结点 Next
♦ 此结点的上一个结点 Prev
♦ 此结点的上一层结点 up
此时的画面
只显示了二件事情
它包含此结点
node
的基本讯息 表头所提供的讯
是因为此画面为 info 树状结构 的最上层
在表头之下的资讯 是用来告知如何用 info
它提供了五件事情 现一一说明
♦ h 不知如何使用 info 模式者 可在进入 info 模式後 使用 info 的线上 辅助说明 欲使
用 info 的线上辅助说明 只要在进入 info 模式後 键入 “h” 即可 此不只是一个线上辅助
说明 还是一个教学指引 跟随著它的说 明 即可明了如何使用 info 模式.
♦ d
“Ctrl-h i” 指令 会先进入 info 树状结构的根部 任何情况下
可键入 “d” 回到此根
部
♦ ?
想知所有与 info 有关的指令 只要键入 “?” 就可以得知所有 指令的全貌
♦ q
欲离开 info 只要键入 “q” 就可以离开 info 而回到先前的 缓冲区
♦ m Texinfo< Return > 这一个指令是用来使用 info 的 Menu Item 使用的方法如下
1. 键入 “m”
2. 键入所欲参考的文件名称 也可使用 completion 的功能来简化输入的工作
3. 键入 RET
何为 Menu Item 会再解释
在这五个指令之下的是 此结点可以使用的 Menu Item
使用者可以直接至所要参考的 Menu
之下 键入 “RET” 此时
info 会将此 Menu 的相关文件显示在萤幕上
使用 info 除了以上的
指令之外 还有几个必需知道的指令
现介绍如下
♦ n
将结点移至下一个与此结点相连的结点
♦ p
将结点移至上一个与此结点相连的结点
♦ u
将结点移至上一层的结点
若想做跨越的移动 这几个指
♦ m
以上结点间移动的指令 必需结点间有相连接的关系
令是无法做到的 此时 必需透过 Menu 来做夸越结点的文件阅读 使用 Menu 的方式有二
“mTexinfo” 这种使用 menu 的方法 在进入 info 的第一个画面就可以看到了
此
方法由三件事共同组成
第 7 页 共 53 页
8
1.
2.
m 键入 m 是使用 menu 的指令
Texinfo 键入 m 时 minibuffer 会出现 menu item 此时 可在其後输入所欲阅 的
文件名称 所以 Texinfo 意 指文件的名称 此时 就可以键入画面上以 “*” 为
开头 的名称 如果是刚进入 info
可使用的 Texinfo 名称有
Info
Emacs
VIP Forms GNUS CL Gcc Cpp Makeinfo Info-stnd Texi Hyperbole
Octave
3. RET 待文件名称输入完毕後 要按下 RET
以告知系统文件名称已经 输入完
成了 可以开始执行的动作了
直接键入 “RET”
如果在阅 某一个结点时 文件中出现以 “* Menu ” 为首的 文
字 就表示此列以下若有以 “*” 为开头的列 均为一个 可以使用的 Menu Item 此
时 可以直接键入 “RET” 参考 另一个结点的文件
使用 Menu 有些条件 就是所要使用的 Menu 必需在此结点 的文件中有明列出来的才可以
使用 要使用其它结点的 Menu 必需先到有要使用的 Menu 的结点 才可以使用它的 Menu Menu
有其一定的结构 所有 Menu 的第一列 都是以 “ Menu ” 为开端 如下所示 * Menu The list
of major topics begins on the next line. 此列之後的所有列 只要以 “ *” 为开始的列 就表示一个可
以 使用的 item Menu Item 的表示法如下所述 * Info (info). Documentation browsing system. 它
主要由四个部份主成
1. 每一个 Menu Item 都是以 “*” 为开头
2. Subtopic
“*” 之後就是 Subtopic 的名称 再加上一个 “ ”
info 就是根据此 Subtopic 找
到所对应的结点名 此例子的 Subtopic 的名称就是 “Info”
如果要以指令 “m” 的方式
使
用 Menu Item 所要给予的 Texinfo 的名称就是此 Subtopic 的名称
3. node name 在 Subtopic
之後就是所使用的结点名 一般为了使用上 的方便 会尽可能的
使用相同的 Subtopic 和结点的名称
若二者的名字相同时 在 Subtopic 後的结点名会省略而
以 两个 “ ”表示之 如 “* Info ”
4. node description 结点後面的内容是选择性 它主要是用来概略描述此结点
l
如果想要回到前一个 last 所参考过的结点 可以使用指令 l 一步一步的往回走
b
指令 b 可以使游标移至文件的最前端
SPC 若文件太长可键入空白键
SPC 来卷动萤幕
Ctrl-g 任何时候想要取消所键入的指令 可键入 Ctrl-g