Emacs 的整合环境
前面不断的强调 EMACS 不只提供一个编辑的环境 而提供一个整合的工作环境
未进入本文的正题
EMACS 的编辑环境之前 先对 EMACS 的工作环境做一个简介
EMACS 所能提供的工作环境如下
♦ EMACS 可执行 Shell 的指令
♦ EMACS 可做为 Directory Editor Dired
♦ EMACS 可以编辑 编译及除错程式
♦ EMACS 具有编辑其它 host 上档案的能力
♦ EMACS 可以列印档案
♦ EMACS 具有年历 日记的功能 Calendar Diary
♦ EMACS 具有读 Man Page 的能力
♦ EMACS 可以收发电子邮件 Mail Rmail
第 8 页
共 53 页
所以
在
9
♦
♦
♦
♦
♦
♦
EMACS
EMACS
EMACS
EMACS
EMACS
EMACS
可以阅读网路上的电子布告栏 GNUS
具有 version control 的功能
对於档案的处理 具有 Outline 的能力
具有资料库的处理能力
可以提供电子计算机的功能
提供了娱乐的环境 game 让工作者可以暂时放下工作的压力
由以上的分析可知 只要进入 EMACS 的工作环境 就可以在其下完成所有的工作 所以
EMACS 的理想 是离开 EMACS 就是离开电脑工作的时候 因为它的最终目标 就是要完成一个
以编辑器为轴心的作业系统
EMACS 所提供的这些功能 都是先唤起代表此功能的模式 mode
EMACS 的模式 分成主
要模式 major mode 与次要模式 minor mode 每一次只能使用一个主要模式 而且必须要的 但一
个主要模式可以搭配一个以上的次要模式 现在就来简述 EMACS 工作环境的功能 至於如何使用
这些 EMACS 的工作环境 本文就不多做介绍
如何在 Emacs 中执行 Shell 的指令
在 EMACS 中有两种执行 shell 指令的方法 一种是进入 shell command mode
另一种是进
入 shell mode 二者都可以执行 shell 的指令
其最大不同之处是 进入 shell mode 的状态 执行
shell 指令的同时 仍可以切换到其它模式处理别的工作 但如果使用 shell command mode 就必须
等指令执行完後才可以做其它的事
使用 shell command mode 时 使用者在萤幕的最下方 输入欲
执行的指令
EMACS 会开启一个名为 “*Shell command output*” 的视窗 将 shell 指令执行的结
果显示在此视窗中.shell mode 则是执行一个 subshell 其输入与输出都是透过同一个缓冲区 所以
输入与输出是在同一个地方 它不似 shell command mode
指令输入与结果的显示在不同的地方
shell command mode 又可以有两种模式 一种就是很单纯的执行一个 shell 的指令 另一种是对某
一特定区域的资料执行 shell 的指令
shell command mode 容许 执行後的结果 直接输入到目前
所使用的工作区内 有了如此的功能 使用者可以很轻易的将 shell 指令执行的结果 直接放入适
当的位置 而不需另外从事剪贴的工作
要如何使用 EMACS 所提供的 shell 功能呢 以下是最
基本 的方法 至於高阶的用法则请自行参考 GNU EMACS 所提供的 “GNU Emacs Manual”
♦ shell command mode
ESC-! shell-command
唤起 shell command mode
ESC- shell-command-on-region 针对某一特定区域执行 shell command mode 的 shell
指令
(特定区域 是指缓冲区的某一范围(region)而言 所以此指令只是 针对缓冲区的某
一部分运作的资料 )
Ctrl-u ESC-! 与 Ctrl-u ESC- 在 ESC 前加上 Ctrl-u 可以将 shell 指令执行的结果
输出到 游标所在的位置
♦ shell mode
ESC-x shell\indexESC-x shell 是唤起 shell mode 的指令
有关目录的编辑方法
Dired 是专门针对目录来运作的编辑功能 进入 Dired mode 後
EMACS 会根据使用者所指
定的目录来列出其下的档案及次目录 此时可根据需要 EMACS 对这些档案及次目录作些运作
EMACS 所提供可操作 Dired 的种类如下
1
2
可阅读 编辑 Dired 所列举出来的档案
操作 Dired 下的档案
(a)在 Dired 可以删除 delete 档案 此功能可以很容易的将 EMACS 的备份档 其档名以 ~
结尾
暂存档 档名在两个 # 中间 或具某一特殊档名模式的档案 删除
(b) 档案的拷贝
(c) 档名的更新
第 9 页 共 53 页
10
(d) 改变档案的 mode
(e) 改变 gid uid
(f) 档案的列印
(g) 档案的压缩 解压缩
(h) 载入 编绎 EMACS 的 LISP file
(i) 可产生 hard links 与 symbolic links
(j) 可将档名换成大写或小写的英文字母
3
4
5
6
可在 Dired 中执行 shell 的指令
可使用 UNIX 的 diff 指令比较档案间的异同
可隐藏次目录
可使用 find 的公用程式来寻找档案
以上所列举的就是 Dired 的功能,有人说它类似 PC 上的 PCTOOLS 读者是否有相同的感觉呢
进入 Dired 模式的方法很简单 只要键入 “ESC-x dired”即可 此时的 minibuffer 会显示出如
下的文字
Dired (directory)
“ ” 之後是目前所在的目录 此时可以修改目录名 确定所要使用的目录 按下 RET 後 系
统会另开启一个视窗来显示此目录下的所有档案 之後就可以对这些档案做运作 Dired 所使用 的
缓冲区是一个唯读 read-only 的缓冲区 所以 mode line 会出现二个 %% 来表示其为唯读的状态
如果要缓冲区的唯读状态改为可读 可以键入 Ctrl-x Ctrl-q 的指令 将缓冲区的状态改变 运作此
缓冲区有其特别的方法 因此对此缓冲区做编辑并无实质上的作用 以下就介绍运作 Dired 的方法
在 Dired 中删除档案
Dired 最基本的指令 就是将要删除的档案做上旗标 flag 之後 再将有旗标的档案删除
d 将游标移至所欲删除的档案列 键入 d 此列的最前方会出现 D 这就是删除的旗标 此时
的游标会移至此列的下一列
u 若想放弃已定好的旗标 可以键入 u 使萤幕上的 D 消失
x 键入指令 d 只是将要删除的档案先做上旗标 并未真正执行 删除的动作 只有键入 x 才会
将所有做上旗标的档案删除 执行删除档案之前 会先询问是否真要删除的意见 此时如果 回
答 “yes”则执行删除的动作 若回答 “no” 不执行删除的动作 但旗标依然存在著
在 Dired 中将多个档案同时做上旗标
-# 键入
系统会自动将所有的自动储存的档案 auto-save file
做上删除的旗标
系统会自动将所有的备份档 backup file 做上删除 的旗标
~
键入
%d regexp RET 将所有适合的 regular expression 档案做上删除的旗标
所有做上旗标的档案要执行删除的动作
都必需执行指令 x
在 Dired 中访问档案
f dired-find-file
如果想要访问目前游标所在列的档案 只要在此列上键入 f 即可
此时
档案的内容会显示在原先显示 Dired 缓冲区的视窗上 使用此方法访问档案 就如同以 Ctrl-x Ctrl-f
访问档案一样
o dired-find-file-other-window 此方法也是用来访问档案 但与键入 f 有些不同之处 键入 o
後 所访问的档案会出现在另一个视窗上而游标也会移至 所访问的视窗 显示 Dired 缓冲区的视
窗并未消失在萤幕上
Ctrl-o dired-display-file
此方法与键入 o 雷同 二者不同之处在於键入 Ctrl-o 後所访问的
档案会出现在另一个视窗上 但游标不会移至所访问 档案的视窗 依然留在显示 Dired 缓冲区的
视窗上
第 10 页
共 53 页
11
v
dired-view-file
此指令仅供流
档案之用 因为以此而开启的档案是唯读档案
将 Dired 的档案做上标记
m dired-mark
将目前游标所在的档案做上标记 “*” 如果给予数值引数
则做上标记的档
案数目会依所给予的数目而定
* dired-mark-exectables
将所有的可执行档 executable files 做上标记 “* 若给予 数值引
数 则会将所有做上标记的可执行档的标记取消 unmark
@ dired-mark-symlinks 将所有的 symbolic files 做上标记 “* 若给予数值引数 则会将 所
有做上标记的 symbolic files 档的标记取消(unmark
/ dired-mark-directories
将所有为目录的档名 但除了 “.” 与 “..” 之外
均做上标记 “*
若给予数值引数 则会将所有做上标记的 目录名称的标记取消 unmark
ESC-DEL markchar dired-unmark-all-files
消除所有以字元 character
markchar 做为标
记的记号
如果给予数值引号 则在消除每一个记号时 会询问是否要 消除记号
回答 “y” 则
表示要将记号消除 回答 “n” 则表示 不要消除已做好的记号 若此时键入 ! 则表示消除其余的
记号 不再询问意见
c old new dired-change-marks 使用此指令 可将原本以 old 为标记的记号 换成以 new 为
标记的记号
%m regexp RET dired-mark-files-regexp
可使用 regular expression 将具有某一类型的档案
做上标记
在 Dired 中的运作方式 有几件事情必需注意
如果给予指令数值引数 n 时 此时指令所运作的档案是从 目前游标所在的档案起往後算 n 个
档案 包括游标所在的档案
如果给予负数的数值 则往游标所在处之前算 n 个档案 包括 游
标所在的档案
如果不给予任何的数值引数
则指令的运作范围会以做了 标记的档案为主
如果不给予数值引数也不对任何档案做标记 则指令只对 目前游标所在列的档案运作
所有运作 Dired 缓冲区的指令都是大写的英文字母
所需的讯息
所有的 指令都是使用 minibuffer 来接收
以下就是运作 Dired 缓冲区的指令
C new RET
dired-do-copy
拷贝档案 若有多个档案同时要拷贝 则引数 new 代表 档案所
要拷贝到的目录 若只拷贝一个档案 可利用此引数 new 将档案从新命名
R new RET
dired-do-rename
更换档名 若有多个档案同时要换档名 则引数 new 代表档
案 换名称後所要放置的目录 若只有一个档案 此引数 new 代表更换的档名 当档名更换完毕
Dired 缓冲区的档案名称 会自动跟著更换
H new RET
dired-do-hardlink
将档案标上 hard links 的标记 引数 new 代表 hard links 所
要连接 的目录 若只有一个连接时 此引数 new 代表连结的名称
S new RET
dired-do-symlink
将档案标上 symbolic links 的标记 引数 new 代表 symbolic
links 所要连接的目录 若只有一个连接时 此引数 new 代表连结的名称
M midespec RET
dired-do-chmod
更改特定档案的模式 mode permission bits 此程式使
用 chmod 的程式 所以 式适用的引数
G newgroup RET
dired-do-chgrp
改变特定档案的团体 group 为新的团体
newgroup
O newowner RET dired-do-chown 改变特定档案的拥有者 owner 为新的拥有者 owner
P command RET
dired-do-print
列印特定的档案 可利用 minibuffer 输入列印的指令
command
Z
dired-do-compress
压缩或反压缩特定的档案 如果档案已被压缩则将其反压缩
反之
则将档案压缩
L
dired-do-load
载入特定的 EMACS Lisp 档案
第 11 页 共 53 页
12
B
dired-do-byte-compile
位元编译 byte compile 特定的 EMACS Lisp 档案
Dired 在编辑远方档案与使用 ftp 的用法 使用 EMACS 的远方编辑或使用 EMACS 来做 ftp
时 若只 给予目录名 系统会进入 Dired 的模式 此时可使用运作 Dired 缓冲区的指令来操作所
要的档案 至於何为远方的编辑会在下一节中讨论
如何编辑远方机器上的档案
EMACS 除了提供了一般编辑器所具有的功能之外 它还提供了一般编辑器所有的功能 那就
是编辑远方 host 的档案
EMACS 编辑远方 host 的档案 是使用了 ftp 的技巧 将所欲编辑 的
档案 ftp 到目前的 host 上 待编辑完毕再以相同的技巧 把档案 ftp 传回远方的 host 而已 往昔
要编辑远方的档案只有两种做法 一是签入 login 到档案所在的 host 去 另一种就是以 ftp 的
方法将档案先传回目前所在的地方 修改完後再 ftp 回去 Remote Editing 也可以用到 “anonymous
ftp” 上 它可以进入 远方的目录下 使用者即可根据需要挑选要 ftp 的档案 使用 remote editing 的
方法非常简单 在键入 “ Ctrl-x Ctrl-f” 後 再根据语法给予适当档名 EMACS 就会处理自行 ftp 远
方 host 上的档案 其语法如下 Find file /host filename host 是指远方 host 的名称 filename 是
指存放在远方 host 的档案 例如
Find file /[email protected]
.login 就是编辑 host 为
“gate.sinica.edu.tw” 的机器 而使用者为 “user1” 档案的名称为 “.login” 的档案
程式的编辑,编译与测试
EMACS 是一个整合的环境 在提供程式编辑的同时 自然会提供一个可供程式执行的环境
以下就要谈谈 EMACS 可以为程式 撰写者提供那些服务
EMACS 对於不同的语言提供不同的编
辑模式
EMACS 提供的服务有程式内缩的安排 括号对应的提示 程式注解的安排 游标移动的
方式与程式的删除等等 基本上 EMACS 是提供一个 撰写程式的格式 只是此格式可根据使用者
的需要而自行设计
EMACS 选择适合的语言模式 是根据所编辑的档案名称附名来判断的 如附
名为 .c 的 C 语言程式 EMACS 会自动给予 C 语言模式 而不需使用者自行处理 EMACS 提
供的程式语言模式有 LISP SCHEME C C++ FORTRAN MAKEFILE AWK PERL ICON 与
MUDDLE 等 编辑好的程式可以直接进入 EMACS 的编译模式 不需离开 EMACS 到 UNIX 的
shell 下进行编译的动作 进入 EMACS 的 编译模式很简单 只要键入 “ESC-x compile” 即可
EMACS 预设的编译指令是 make 执行 ESC-x compile 指令的结果如下所示
compile command
make -k 若要使用其它的编译器 只需在 “compile command ” 的後面给
予适当的编译指令即可 此指令与在 UNIX shell 下使用编译的 方法完全相同
除了编辑 编译
之外 程式撰写者还需要的功能是 Debugger 的提供 EMACS 也提供了此项的服务
EMACS 提
供了四种 debugger 分别为 gdb dbx xdb 与 sdb 使用者可根据需来选择合适的 debugger 此
处 只将使用 debugger 的指令列举如下
ESC-x gdb RET file RET
ESC-x dbx RET file RET
ESC-x xdb RET file RET
ESC-x sdb RET file RET
如何在 Emacs 中列印文件
除了以上的功能外
EMACS 还提供了列印的功能
EMACS 的列印可针对个整缓冲区或某
部份的区域列印 其相关的指令如下
ESC-x print-buffer 列印整个缓冲区的内容 EMACS 处理此工作的方法是先使用 shell 的 pr
指令 而後再使用 shell 的 lpr 列印指令
ESC-x lpr-buffer 此指令与上一个指令相似 只是不透过 pr 而直接使用 lpr
ESC-x print-region 与 ESC-x print-buffer 相似 唯一不同之处在於 此指令只列印 部份的区域
ESC-x lpr-region 与 ESC-x lpr-buffer 相似 唯一不同之处在於此 指令只列印 部份的区域
第 12 页
共 53 页
13
在 Emacs 中如何收发信件
在 EMACS 众多的整合功能中 信件收发的功能自然是不可或缺的
EMACS 对电子邮件的
设计却与一般的电子邮件系统背道而驰 它是在以编辑为前提的条件下来提供电子邮件的子系统
换言之 电子邮件为以编辑器为主导的一个子功能 EMACS 所提供的电子邮件系统分成二个部份
一部分为发送信件
另一部为收取信件
收取信件的同时也能发送信件 它的作
rmail
法是使用发送信件的功能将信件发送出去
EMACS 读取电子邮件 是将作业系统存放电子邮件的
档案拷贝至 EMACS 自己的档案中 此档案名为 RMAIL
EMACS 在读取信件时会至此档
RMAIL 中读取所要的信件 EMACS 如此设计档案的读取有它的理由 其理由如下
1 作业系统存放电子邮件的格式不一 读取电子邮件的软体 也是变化万千 EMACS 的 RMAIL
就是要将如此复杂的事情简单化
2 RMAIL 记录了信件所有的相关资料
的记录
但作业系统所提供的 信件档案
并未有做如此详细
3 一般作业系统为了要确保信件读取时的安全性 必需经由 一套繁杂的方法来保障信件读取
的安全以及资料的不流失
EMACS 的 RMAIL 所采取的措失就是既安全又简单
RMAIL 的方
法是 先把存於系统内的信件读出後 再拷贝至 RMAIL 的 档案内 待一切就绪才将存在系统内
的信件删掉 如此作的好处 是 即使系统当掉只会使信件多做一份拷贝 也不会有流失信件 的事
件发生
EMACS 对於发送信件与读取信件提供了许多有用的 操作功能
处只告诉读者如何 进入送信件与读信件的模式
ESC-x mail
发送信件
ESC -x rmail (读取信件
读者可自行参考相关手册
此
其它与 Emacs 相关的工作环境
现在让我们一一道来
EMACS 除了提供以上种种的工作环境境 还有其它的环境可以运用
Diary 更可以
The Calendar and the Diary
EMACS 的 CalendAr 与一般的月历功能相似
适时提醒使用者该注意的事情
进入 Calendar 的方法如下
ESC-x calendar Diary 的使用可以在
进入 calendar 的模式中後 再来设定相关的资料
ESC-x
Reading Man Page from EMACS 阅读 manual page 的方法非常简单 其用法如下
manual-entry RET unix-command-name RET
GNU
Reading News with GNUS
读送网路新闻为现今交换电脑资讯的重要媒体与管道
EMACS 也提供了此一子系统 称为 GNUS. EMACS 的 GNUS 是将 “.newsrc” 档的内容显示出
来 它的内容 包括所有被订阅的(subscribe 的 newsgroups 以及未被阅读的 文章 在 GNUS 中
还可以看到或隐藏未被订阅的 newsgroups
并可以再订阅未订阅的 newsgroup 或取消订阅某一个
newsgroup
当然 GNUS 也提供了可游走於各 newsgroups 间的指令 在 EMACS 中使用 GNUS
这一个子系统只需键入如下的指令即可
ESC-x gnus RET
功能
version control
管理原始档案 source files 也是 EMACS 所提供了服务项目之一
version control 是一个套装软体 它可以记录一个原始档案 (source file 所有改变的版本 multipe
它保留所有 改变的记录且存放於一个档案中 对於每一版本重复的部份只会 保留一分
versions
记录 version control 也会 记录每一版本被创造 谁创造 了它等等的相关资料 目前 EMACS 是
透过 VC 来使用作业系统 所提供的 RCS 或 SCCS 的 version control 软体 若作业系统提供
RCS
EMACS 会先使用 RCS 若无 RCS 则会使用 SCCS
EMACS 允许使用者自行决定使用
RCS 或 SCCS 的 version control
透过 EMACS 的 VC 所能使用的 version control 的功能并不
多
它只提供最基本的 version control 的功能 但确是最常为人使用的 功能 若想使用 SCCS 或
RCS 所提供的所有功能 就必须进入 EMACS 的 shell mode 中了 以下就来简介 EMACS version
control 的功能 EMACS 的 VC 提供的功能如下
第 13 页 共 53 页
14
♦
♦
♦
♦
♦
♦
将档案注册於 version control 之下
可将注册的档案从 version control 的控制中取出与放入
放入 version control 的每一个版本都可以随时取出
可比较任一版本间的异同
可将一组相关的档案 置於 version control 之下
可自行设计标头 version header 此标头可置於 version control 下的档案中
至於其它的 version control 功能 则必需进入 EMACS 的 shell 中直接使用 RCS 或 SCCS
例如 将数个版本合并 使用 help 协助使用 version control 等的功能 就从 EMACS 所提供的 VC
得到解答
EMACS 的大
Outline Mode 以 editor 为基石的 EMACS 当然少不了制作文章大纲的功能
纲模式 outline mode 可以使文章的部份主体 暂时隐藏起来 只呈现文章的大纲部份 如此一来
吾人不需 维护一套为本文 另一套为大纲部份的两套系统了 因为
制作本文的同时就已经隐含
了大纲的部份了
前面已经将 EMACS 可以做的事以及它的特质都做了简要的介绍
的基本要素
编辑功能