概念上,Emacs在两个方面有别于一般程序。首先,“窗口"的概念不同。其次,Emacs的“缓冲区”是脱离窗口或框架独立存在的。
(Emacs里的frame相当于Microsoft Windows的window概念。A frame can show several windows, each showing a buffer.)
1 窗口与框架
我们所看到的Emacs“窗口”并非Emacs的窗口,而是Emacs的图形窗口框架(GUI windows frames)。理解这个概念是必须的,因为在未有图形化窗口之前,Emacs已经可以在“终端”运行了,用Windows的术语来说,就是“控制台"程 序。看看下面的图,就明白了。
1.1 缓冲区,独立于窗口与框架之外
本质上,窗口和框架只是显示缓冲区内容的工具。缓冲区内可以包含文件内容,可以是Emacs内部自定义的,譬如*Messages*,*scratch*,或*help*等,也可以是用户自定制而其中内容未写入文件的。
许多图形界面的应用程序是将图形窗口(Emacs中称之为Frames)与一些文件紧密联系在一起的,而Emacs的将缓冲区与图形窗口分离的方式是强大又灵活的。实际上,我们在大部分时间里宁愿使用一个Emacs Frame,而使
用C-x b来切换缓冲区,这要比在多个Frame中采用鼠标切换或采用切分窗口等方式更容易,尽管它们在一些情况下存有优点。
1.2 更深入地了解缓冲区
你知道该怎样获知Emacs中开了几个缓冲区及它们的详细信息吗?有三种方法可以实现:
- C-x C-b,显示缓冲区列表;
- 缓冲区菜单,列举了打开的缓冲区以及导向它们的快捷命令;
- 在Emacs的窗口中,摁下Ctrl键,点击鼠标左键,可以弹出缓冲区列表。
Emacs自行定义了一些缓冲区,它们的名字,通常是像*buffername*,*help*,*scratch*这样的格式,并且缓冲区列表本身就是Emacs自定义的缓冲区,如下图:
当你启动Emacs的时候,会产生*Messages*和*scratch*两个缓冲区。*Messages*是用来显示从Emacs启动开始的所有命令信 息的缓冲区,*scratch*是草稿缓冲区,你可以在其中乱写东西,但不会被保存,除非用户使用
C-x C-W命令。
在 用户使用 Emacs编辑文件时,所读取的文件会被复制到同名的缓冲区内。如果用户需要帮助,那么也可以打开*help*缓冲区。可打开的缓冲区的数量是没有限制 的。大部分时间,仅有一两个缓冲区被显示,还有好多即使你没看到,但它们也是存在的。你可以把缓冲区想象为一堆页面,其中仅有一页是当前页,你可以切换到 令一页,或者创建新页。每个缓冲区都关联一个主模式,它决定了在该缓冲区内,Emacs的行为。譬如,text模式,被设计为书写文档的;Lisp模式, 是用于书写Lisp程序的。用户可以在一个Emacs窗口或框架中显示多个缓冲区,要紧是记住你创建的所有缓冲区。
2 在多缓冲区模式下工作
如 果你想创建一个包含文件内容的缓冲区,可以C-x C-f,Emacs会自动创建一个缓冲区并将你带入其中。如果你已经在一个缓冲区打开了这份文件的副本, 那么C-x C-f会把你带入那个已存在的缓冲区中,在此请仔细体会一下,Emacs给你带来的好处吧!而如果你要打开的文件不存在,Emacs会为你创建 一个新文件的缓冲区,并将你带入其中。
请记住:
C-x C-f是打开一个文件,该命令后总是跟随这目录/文件名的,如果要打开的文件不存在,就创建新文件。
2.1 切换缓冲区
你有意识到模式行并不显示文件名,而仅仅显示缓冲区名吗?其他一些版本的Emacs可以两个名字都显示,但GNUEmacs只显示缓冲区名,这是因为通常情况下,文件名和缓冲区名是一致的,除非你去修改它们。
要在不同缓冲区之间移动,就C-x b吧。Emacs会给你提供一个默认的最近隐掉的缓冲区名,回车就可以进入。或者输入你想进入的缓冲区名字的前几个字,然后摁Tab键,Emacs会自动为你补全缓冲区名,回车进入即可。
请记住:
C-x,b之后则跟随一个缓冲区的名字。如果相应缓冲区不存在,Emacs会自动创建一个新的空缓冲区,与C-x C-f的不同之处是,新建的缓冲区不与文件关联,在退出Emacs时,Emacs不会提醒你要保存缓冲区。
查看已打开的缓冲区,还有以下两种可选方式:
- C-x C-b,这种方法可用于终端环境中的Emacs;
- 在Emacs窗口中,摁下Ctrl键,点击鼠标左键。该方法只对图形化的Emacs有效。
2.2 删除缓冲区
为什么要删除缓冲区?
- 你的Emacs中开的缓冲区太多了,想去掉几个;
- 对已有文档的修改具有灾难性,将这个缓冲区干掉就可以了。
要删除缓冲区,可键入C-x k,Emacs 会显示当前被显示的缓冲区名,也可键入想删除的缓冲区的名字,然后回车。如果已与文件建立关联的缓冲区,内容有了 改动,Emacs会提示你保存一下。其他情况,则缓冲区就永远的消失了。而键入M-xkill-some-buffers可成批删除缓冲区,系统会一个一 个列举已存在的缓冲区,问你是不是把它kill掉,你只需要回答`yes'or`no'就可以了。当所有的缓冲区都被kill掉之后,Emacs不会屏幕 空着的,它会创建一个新的*scratch*缓冲区。
3 在多个窗口中工作
窗口是屏幕上显示Emacs缓冲区内容 的区域。可以一次打开多个窗口,每个窗口可以显示不同的缓冲区,也可以显示相同缓冲区的不同部分,这些窗口之间不存在覆盖现象,只是对屏幕进行分割。一旦 创建新窗口,旧窗口就自动缩小。就好像屏幕是馅饼,可以把它切成许多块,但这些窗口的排列只有两种方式:水平的或竖直的。
3.1 创建水平排列的窗口
最常用的命令是
C-x 2, 可以将当前窗口水平切分为两个窗口,可以不断重复这个命令,切分出更多的窗口。你也可以让Emacs每次启动时打开多个窗口。如果你需要在水平切分的两个 窗口中编辑两份文档,则可以在启动Emacs时,指定这两个文件的名字。譬如,我想编辑1.tex和2.html两份不同的文档,启动Emacs时,可以 直接emacs 1.tex2.html即可。如果编辑超过两份文档,那么Emacs会在一个窗口中显示所指定的文档中最后的那份,然后会在另一个窗口中给出缓冲区列表。
可以在一个窗口中,使用
C-M-v去滚动另一个窗口的屏幕。
3.2 在多个窗口间迁移
要将光标从一个窗口切换到另一个窗口,可以
C-x o(o表示other)。在图形化的Emacs中,可以用采用鼠标来切换窗口。
3.3 将窗口咔嚓掉
要删除当前所在的窗口,可以
C-x 0。而要删除所有的窗口,只保留当前窗口,可以
C-x 1。另外也可以像删除缓冲区那样,交互删除一批窗口,M-xdelete-windows-on。但删除一个窗口仅仅意味着它不再显示,而不会删除缓冲区内的任何信息,我们依然可以使用C-x b来切换到自己需要的缓冲区。
4 在多个框架中工作
现在,我们都已经知道Emacs将图形化窗口称为“Frames”的。这一节中,将讨论如何创建框架,框架之间的操纵,以及框架的删除。
4.1 创建新框架
C-x 52,打开一个新框架,Emacs会让这个新框架包含当前的缓冲区,并把它置于当前框架之上。如果你建立的新框架完全覆盖了当前框架,那么可以定制新框架的尺寸来把它们分开。比较方便的解决方法,就是把以下代码添加到你的.emacs文件中:
(setq initial-frame-alist '((top .10) (left . 30) (width . 90) (height . 50)))(setq default-frame-alist '((width .80) (height . 45)))以 上代码设定了Emacs框架的宽度和高度。第一个框架的尺寸是在initial-frame-alist中设定的,90个字符宽,50行高,框架左上角坐 标为(10,30)。后续框架尺寸,由default-frame-alist定义,80个字符宽,45行高。你也可以自己根据你的显示器自行设置其他参 数。
如果你想为已经打开的一个名为xxx的文件创建一个新框架,那么可以C-x 5 fxxx。如果你想为已经打开的一个名为xxx的缓冲区创建一个新框架,可以C-x 5 b xxx。
注意:这里复习一下C-x 4f xxx和C-x 4 b xxx。4.2 在多个框架间迁移
C-x 5 o 即可。
5. 关于缓冲区更多的知识
在本节中,将了解多个缓冲区的保存、缓冲区重命名、设置缓冲区只读,以及针对缓冲区列表的一些操作——这不仅仅是一个有用的工具,在讨论目录编辑器时也是一个很好的原理上的导引。