emacs编辑器是一款极其流行的编辑器,甚至比Unix出现的都早。开发人员对它爱不释手,
于是就将其移植到了Unix环境中,现在也移植到了Linux环境中。跟vi很像,emacs编辑器一开始
也是作为控制台编辑器,但如今已经迁移到了图形化世界。

emacs编辑器仍然提供最早的命令行模式编辑器,但现在也能使用图形化窗口在图形化环境
中编辑文本。在从命令行启动emacs编辑器时,编辑器会判断是否有可用的图形化会话,以便启
动图形模式。如果没有,它会以控制台模式启动。

本节将介绍控制台模式和图形模式的emacs编辑器,这样你就知道如何使用任意一种了。

10.3.1 检查 emacs 软件包

很多发行版默认并没有安装emacs。你可以像下面这样使用which和/或yum list命令检查
一下自己所用的基于Red Hat的发行版。

$ which emacs
/usr/bin/which: no emacs in (/usr/lib64/qt-3.3
/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:
/usr/sbin:/sbin:/home/Christine/bin)
$
$ yum list emacs
[…]
Available Packages
emacs.x86_64 1:23.1-25.el6 base

emacs编辑器软件包目前并没有安装在CentOS发行版中。不过,还是可以把它安装上的(关
于如何显示已安装软件的更多讨论,请参见第9章)。

对于基于Debian的发行版,可以使用which和/或apt-cache show命令来检查emacs编辑器
软件包的安装情况,在Ubuntu发行版中的演示如下。

$ which emacs
$
$ sudo apt-cache show emacs
Package: emacs
Priority: optional
Section: editors
Installed-Size: 25
[…]
Description-en: GNU Emacs editor (metapackage)
GNU Emacs is the extensible self-documenting text editor.
This is a metapackage that will always depend on the latest
recommended Emacs release.
Description-md5: 21fb7da111336097a2378959f6d6e6a8
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 5y
$

which命令的执行方式在这里有点不一样。当它没有找到已安装的命令时,直接返回的就是
bash shell提示符。在演示所用的Ubuntu发行版中,emacs编辑器软件包是选装的,但也可以进行
安装。下面显示了在Ubuntu上安装emacs编辑器。

$ sudo apt-get install emacs Reading package lists… Done
Building dependency tree

Reading state information… Done

The following extra packages will be installed:

[…]

Install emacsen-common for emacs24

emacsen-common: Handling install of emacsen flavor emacs24

Wrote /etc/emacs24/site-start.d/00debian-vars.elc

Wrote /usr/share/emacs24/site-lisp/debian-startup.elc

Setting up emacs (45.0ubuntu1) …

Processing triggers for libc-bin (2.19-0ubuntu6) …

$

$ which emacs

/usr/bin/emacs

$

现在再使用which命令的话,它就会显示出emacs程序的位置。这说明该Ubuntu发行版已经
可以使用emacs编辑器了。

就CentOS发行版而言,可以使用yum安装命令来安装emacs编辑器。

$ sudo yum install emacs
[sudo] password for Christine:
[…]
Setting up Install Process
Resolving Dependencies
[…]
Installed:
emacs.x86_64 1:23.1-25.el6
Dependency Installed:
emacs-common.x86_64 1:23.1-25.el6
libotf.x86_64 0:0.9.9-3.1.el6
m17n-db-datafiles.noarch 0:1.5.5-1.1.el6
Complete!
$
$ which emacs
/usr/bin/emacs
$
$ yum list emacs
[…]
Installed Packages
emacs.x86_64 1:23.1-25.el6 @base
$

将emacs编辑器成功安装到你的Linux发行版之后,就可以开始学习它的各种功能了。我们先
从控制台中的使用开始吧。

10.3.2 在控制台中使用 emacs

控制台模式版本的emacs要使用大量按键命令来执行编辑功能。emacs编辑器使用包括控制键
(PC键盘上的Ctrl键)和Meta键的按键组合。在大多数终端仿真器中,Meta键被映射到了Alt键。
emacs官方文档将Ctrl键缩写为C-,而Meta键缩写为M-。所以,如果你要输入Ctrl+x组合键,文档
会显示成C-x。为了避免冲突,本章将会沿用这种写法。

1. emacs基础

要在命令行用emacs编辑文件,输入:

$ emacs myprog.c

随emacs控制台模式窗口一起出现的是一段简短的介绍以及帮助界面。不要紧张,只要按下
任意键,emacs会将文件加载到工作缓冲区并显示文本,如图10-3所示。
image.png
你会注意到,在控制台模式窗口的顶部出现的是一个典型的菜单栏。遗憾的是,这个菜单栏
无法在控制台模式中使用,只能用于图形模式。


说明 如果你在图形化桌面环境下使用emacs,本节中介绍的一些命令的效果会和描述的不太一
样。要想在图形化桌面环境中使用控制台模式的emacs,可以使用emacs –nw命令。如果
你想使用emacs的图形化特性,请阅读10.3.3节。


和vim编辑器的不同之处在于:使用vim时,你必须不停地从插入模式中进出,从而在输入命
令和插入文本之间切换;而emacs编辑器只有一个模式。如果你输入可打印字符,emacs就将它插
入到光标当前位置;如果你输入一个命令,emacs就执行命令。

如果emacs正确地检测到了你的终端仿真器,可以使用方向键和PageUp以及PageDown键在缓
冲区域移动光标。如果未能正确检测,有一些命令可用来移动光标。

  •  C-p:上移一行(文本中的前一行)。
  •  C-b:左移一字符。
  •  C-f:右移一字符。
  •  C-n:下移一行(文本中的下一行)。

还有一些命令能够让光标在文本中进行较长距离的跳跃。

  •  M-f:右移到下个单词。
  •  M-b:左移到上个单词。
  •  C-a:移至行首。
  •  C-e:移至行尾。
  •  M-a:移至当前句首。
  •  M-e:移至当前句尾。
  •  M-v:上翻一屏。
  •  C-v:下翻一屏。
  •  M-<:移至文本的首行。
  •  M->:移至文本的尾行。

还有几个命令可以将编辑器缓冲区保存至文件并退出emacs。

  •  C-x C-s:保存当前缓冲区到文件。
  •  C-z:退出emacs并保持在这个会话中继续运行,以便你切回。
  •  C-x C-c:退出emacs并停止该程序。

你会注意到这些功能中有两个需要两次键命令。C-x命令叫作扩展命令(extend command)。
这为我们提供了另外一组命令。

2. 编辑数据

emacs编辑器在插入和删除缓冲区中的文本时非常强大。要插入文本,只需将光标移动到想
插入文本的位置就可以开始输入了。要想删除文本,emacs使用退格键删除光标当前所在位置之
前的字符,使用删除键来删除光标当前位置之后的字符。

emacs编辑器还有剪切①文本的命令。删除文本和剪切文本的差别在于:当你剪切文本时,emacs
会将其放在一个临时区域,你可以取回(参见接下来的一小节);而删除的文本则会永远消失。
有几个命令可用来剪切缓冲区中的文本。

  •  M-Backspace:剪切光标当前所在位置之前的单词。
  •  M-d:剪切光标当前所在位置之后的单词。
  •  C-k:剪切光标当前所在位置至行尾的文本。
  •  M-k:剪切光标当前所在位置至句尾的文本。

emacs编辑器还包括了一种独特的块剪切(mass-killing)的方法。移动光标到待剪切区域的
起始位置并按下C-@或C-Spacebar键,然后移动光标到待剪切区域的结束位置并按下C-w命令
键。这两个位置之间的文本都将被剪切。
——————————
① 英文为kill,emacs专有的说法。
如果你在剪切文本时不巧弄错了,使用C-/命令就能撤销剪切命令,返回到剪切前的状态。

3. 复制和粘贴

你已经看到了如何从emacs缓冲区域剪切数据,现在该看看如何将它粘贴到其他地方了。遗
憾的是,如果你用过vim编辑器,那么emacs编辑器的用法可能会让你犯晕。

不巧的是,粘贴数据在emacs中也叫yanking。而在vim编辑器中, yanking指的是复制。如果
你恰好要用两种编辑器,这可就难记了。

当你用剪切命令剪切了某个数据后,将光标移动到你要粘贴数据的位置,用C-y来粘贴。这
会将文本从临时区域取出并将其粘贴在光标所在的位置。C-y命令会取出最后一个剪切命令存下
的文本。如果你执行了多个剪切命令,可以用M-y命令来循环选择它们。

要复制文本,只需将它粘贴到剪切它的地方然后移动到新的位置并再使用一次C-y命令即
可。如果需要,你可以粘贴文本任意多次。

4. 查找和替换

在emacs编辑器中查找文本可用C-s和C-r命令。C-s命令是在会从缓冲区域中从光标当前位
置到缓冲区尾部执行前向查找,而C-r命令会是从在缓冲区域中从光标从当前所在位置到缓冲区
头部执行后向查找。

当输入C-s和C-r两者中的任意一个时,底行会出现一个提示,询问要查找的文本。emacs
可以执行两种类型的查找。

在渐进式(incremental)查找中,emacs编辑器在你键入单词时以实时方式执行文本查找。
当键入第一个字母时,它会高亮显示缓冲区中所有该字母出现的地方。当键入第二个字母时,它
会高亮显示文本中所有出现这两个字母组合的地方。如此往复,直到输入完要查找的文本。

在非渐进式(non-incremental)查找中,在C-s或C-r命令后按下回车键。这会将查询锁定在
底行区域,允许你在查找前输入完整的待查找文本。
要用新字符串来替换一个已有文本字符串,就必须用M-x命令。这个命令需要一个文本命令
和参数。

该文本命令是replace-string。输入该命令并按下回车键,emacs会询问要替换的已有字
符串。输入之后,再按一次回车键,emacs会询问用来替换的新字符串。

5. 在emacs中使用缓冲区

emacs编辑器可以使用多个缓冲区同时编辑多个文件。你可以把文件加载到一个缓冲区中,
编辑时在多个缓冲区中切换。

当你处于emacs中时,可以使用C-x C-f组合键将新的文件加载到缓冲区。这是emacs的查找
文件模式。它会把你带到窗口的底行,允许你输入要开始编辑的文件名。如果不知道文件的名称
或位置,可以按下回车键。它会在编辑窗口启动一个文件浏览器,如图10-4所示。

你可以在这里浏览到要编辑的文件。要进入上一级目录,移动到双点条目并按下回车键。要
进入下一级目录,移动到该目录条目并按下回车键。如果找到了要编辑的文件,按下回车键,emacs
会自动将它加载到新的缓冲区域。
image.png
你可以按下C-x C-b扩展命令组合来列出工作缓冲区。emacs编辑器会拆分编辑器窗口,在
底部窗口显示一个缓冲区列表。除了主要的编辑缓冲区,emacs还提供了另外两个缓冲区:

  •  草稿区域,称为scatch
  •  消息区域,称为Messages

草稿区域允许输入LISP编程命令以及个人笔记。消息区域则显示在操作期间由emacs生成的
消息。如果在使用emacs时出现了任何错误,它们会显示在消息区域中。

有两种方式可在窗口中切换到不同的缓冲区域。

  •  C-x o:切换到缓冲区列表窗口。用方向键移动到你想要的缓冲区域并按下回车键。
  •  C-x b:输入你要切换到的缓冲区域的名字。

当选择切换到缓冲区列表窗口的选项时,emacs会在新的窗口区域打开缓冲区。emacs编辑器
允许在单个会话中打开多个窗口。接下来的一节将讨论如何在emacs中管理多个窗口。

6. 在控制台模式的emacs中使用窗口

控制台模式的emacs编辑器要比图形化窗口早出现了好多年。即便在当时,emacs也是出类拔
萃的,因为它可以支持在主窗口中打开多个编辑窗口。

可以用下面两个命令将emacs编辑窗口拆分成多个窗口。

  •  C-x 2:将窗口水平拆分成两个窗口。
  •  C-x 3:将窗口竖向拆分成两个窗口。

要从一个窗口移动到另一个,可用C-x o命令。注意,在创建一个新窗口时,emacs会在新
窗口中使用原始窗口的缓冲区域。一旦移动到了新窗口,你可以在新窗口中用C-x C-f命令来加
载一个新文件,或者用其中一个命令切换到一个不同的缓冲区域。

要关闭窗口,移动到该窗口并用C-x 0(数字0)命令;如果你想关掉除了你所在窗口之外
的所有窗口,用C-x 1(数字1)命令。

10.3.3 在 GUI 环境中使用 emacs

如果在GUI环境中使用emacs(比如Unity或GNOME桌面),它会以图形模式启动,如图10-5所示。
image.png
如果你已经在控制台模式下用过emacs,应该非常熟悉图形模式。所有的键命令都以菜单项
的形式存在。emacs菜单栏包括下列菜单项。

  •  File:允许你在窗口中打开文件、创建新窗口、关闭窗口、保存缓冲区和打印缓冲区。
  •  Edit:允许你将选择的文本剪切并复制到剪贴板,将剪贴板的内容粘贴到光标当前所在位置,以及查找文本和替换文本。
  •  Options:提供许多emacs功能设定,如高亮显示、自动换行、光标类型和字体设置。
  •  Buffers:列出当前可用的缓冲区,可以让你在缓冲区域间轻松切换。
  •  Tools:提供对emacs高级功能的访问,比如命令行界面访问、拼写检查、文件内容比较(称为diff)、发送电子邮件消息、日历以及计算器。
  •  Help:提供emacs的在线手册,以获取特定emacs功能的帮助。

除了普通的emacs图形化菜单项外,针对编辑器缓冲区中特定的文件类型,通常还会有一个
独立的菜单项。图10-5中打开一个C程序,所以emacs提供了一个C菜单项,允许用户进行相关的
高级设置,例如C语法高亮、编译、运行以及命令行代码调试。

图形化的emacs窗口是古老的控制台程序向图形化世界迁移的一个例子。现在许多Linux发行
版都提供了图形化桌面(甚至在不需要它们的服务器上),图形化编辑器也越来越司空见惯。流
行的Linux桌面环境(如KDE和GNOME)都提供了针对各自环境的图形化文本编辑器,本章接下
来将介绍。