Emacs的“缓冲区”是脱离窗口或框架独立存在的。
我们所看到的Emacs“窗口”并非Emacs的窗口,而是Emacs的图形窗口框架(GUI windows frames)。在未有图形化窗口之前,Emacs已经可以在“终端”运行了,用Windows的术语来说,就是“控制台"程 序。
本质上,窗口和框架只是显示缓冲区内容的工具。缓冲区内可以包含文件内容,可以是Emacs内部自定义的,譬如*Messages*,*scratch*,或*help*等,也可以是用户自定制而其中内容未写入文件的。
Emacs的将缓冲区与图形窗口分离的方式是强大 又灵活的。我们在大部分时间里使用C-x b来切换缓冲区,这要比在多个Frame中采用鼠标切换或采用切分窗口等方式更容易,尽管它们在一些情况下存有优点。
获知Emacs中缓冲区及它们的详细信息,有三种方法可以实现:
1. C-x C-b,显示缓冲区列表;
2. 缓冲区菜单,列举了打开的缓冲区以及导向它们的快捷命令;
3. 在Emacs的窗口中,摁下Ctrl键,点击鼠标左键,可以弹出缓冲区列表。
Emacs自行定义了一些缓冲区,它们的名字,通常是像*buffername*,*help*,*scratch*这样的格式,并且缓冲区列表本身就是Emacs自定义的缓冲区。
当我们启动Emacs的时候,会产生*Messages*和*scratch*两个缓冲区。*Messages*是用来显示从Emacs启动开始的所有命令信息的缓冲区,*scratch*是草稿缓冲区,我们可以在其中乱写东西,但不会被保存,除非用户使用C-x C-W命令。
在使用 Emacs编辑文件时,所读取的文件会被复制到同名的缓冲区内。如果用户需要帮助,那么也可以打开*help*缓冲区。可打开的缓冲区的数量是没有限制 的。大部分时间,仅有一两个缓冲区被显示,还有好多即使我们没看到,但它们也是存在的。我们可以把缓冲区想象为一堆页面,其中仅有一页是当前页。当然,我们可以切换到 令一页,或者创建新页。每个缓冲区都关联一个主模式,它决定了在该缓冲区内,Emacs的行为。譬如,text模式,被设计为书写文档的;Lisp模式, 是用于书写Lisp程序的。用户可以在一个Emacs窗口或框架中显示多个缓冲区,要紧是记住自己创建的所有缓冲区。
在多缓冲区模式下工作
如果想创建一个包含文件内容的缓冲区,可以C-x C-f,Emacs会自动创建一个缓冲区并进入其中。如果已经在一个缓冲区打开了这份文件的副本, 那么C-x C-f会进入这个已存在的缓冲区中。如果用户要打开的文件不存在,Emacs会创建 一个新文件的缓冲区,并进入其中。
这里需要牢记:
C-x C-f是打开一个文件,该命令后总是跟随这目录/文件名的,如果要打开的文件不存在,就创建新文件。
切换缓冲区
要在不同缓冲区之间移动,请用C-x b。Emacs会给我们提供一个默认的最近隐掉的缓冲区名,回车就可以进入。或者输入我们想进入的缓冲区名字的前几个字,然后摁Tab键,Emacs会自动为我们补全缓冲区名,回车进入即可。
C-x,b之后则跟随一个缓冲区的名字。如果相应缓冲区不存在,Emacs会自动创建一个新的空缓冲区。与C-x C-f的不同之处是,新建的缓冲区不与文件关联,在退出Emacs时,Emacs不会提醒我们要保存缓冲区。
查看已打开的缓冲区,还有以下两种可选方式:
1. C-x C-b,这种方法可用于终端环境中的Emacs;
2. 在Emacs窗口中,摁下Ctrl键,点击鼠标左键。该方法只对图形化的Emacs有效。
删除缓冲区
原因:一是Emacs中开的缓冲区太多了,想去掉几个;二是对已有文档的修改具有灾难性,将这个缓冲区干掉就可以了。
要删除缓冲区,可键入C-x k,Emacs 会显示当前被显示的缓冲区名,也可键入想删除的缓冲区的名字,然后回车。如果已与文件建立关联的缓冲区,内容有了 改动,Emacs会提示我们保存一下。其他情况,则缓冲区就永远的消失了。而键入M-xkill-some-buffers可成批删除缓冲区,系统会一个一 个列举已存在的缓冲区,问我们是不是把它kill掉,我们只需要回答`yes'or`no'就可以了。当所有的缓冲区都被kill掉之后,Emacs不会屏幕 空着的,它会创建一个新的*scratch*缓冲区。
在多个窗口中工作
窗口是屏幕上显示Emacs缓冲区内容 的区域。可以一次打开多个窗口,每个窗口可以显示不同的缓冲区,也可以显示相同缓冲区的不同部分,这些窗口之间不存在覆盖现象,只是对屏幕进行分割。一旦 创建新窗口,旧窗口就自动缩小。就好像屏幕是馅饼,可以把它切成许多块,但这些窗口的排列只有两种方式:水平的或竖直的。
创建水平排列的窗口
最常用的命令是C-x 2, 可以将当前窗口水平切分为两个窗口,可以不断重复这个命令,切分出更多的窗口。我们也可以让Emacs每次启动时打开多个窗口。如果我们需要在水平切分的两个 窗口中编辑两份文档,则可以在启动Emacs时,指定这两个文件的名字。譬如,我想编辑abc.txt和123.html两份不同的文档,启动Emacs时,可以 直接emacs abc.txt 123.html即可。如果编辑超过两份文档,那么Emacs会在一个窗口中显示所指定的文档中最后的那份,然后会在另一个窗口中给出缓冲区列表。
可以在一个窗口中,使用C-M-v去滚动另一个窗口的屏幕。
在多个窗口间迁移
要将光标从一个窗口切换到另一个窗口,可以C-x o(o表示other)。在图形化的Emacs中,可以用采用鼠标来切换窗口。
将窗口咔嚓掉
要删除当前所在的窗口,可以C-x 0。而要删除所有的窗口,只保留当前窗口,可以C-x 1。另外也可以像删除缓冲区那样,交互删除一批窗口,M-xdelete-windows-on。但删除一个窗口仅仅意味着它不再显示,而不会删除缓冲区 内的任何信息,我们依然可以使用C-x b来切换到自己需要的缓冲区。
几个快捷键:
快捷键 | 命令 | 功能 |
C-x b | 创建缓冲区或者切换缓冲区(由输入的缓冲区名字是否存在决定) | |
C-x f | 打开文件并将其读到缓冲区中 | |
C-x s | 保存缓冲区('-'存缓冲区,'n'-不保存缓冲区,'!'-保存所有缓冲区,'.'-只保存当前缓冲区缓冲区,'q'-取消保存指令,且不保存当前缓冲区。 | |
C-x s后执行C-r | 只读的的方式查看缓冲区内容,按C-c返回到保存操作 | |
C-x k | 删除当前缓冲区 | |
kill-some-buffers | 依次列出所有缓冲区,逐个询问是否要删除 | |
rename-buffer | 修改缓冲区名字 | |
C-x C-v | 使用文件内容替换缓冲区中的内容 | |
C-x C-q | 缓冲区只读/读写模式切换 | |
C-x 0 | 删除当前窗口 | |
C-x 1 | 删除当前窗口外的所有窗口 | |
C-x 2 | 当前窗口分割为上下2个 | |
C-x 3 | 当前窗口分割为左右2个 | |
delete-windows-on | 删除某个特定编辑缓冲区上的全部窗口 | |
C-x o | 切换到下一个窗口 | |
M-n C-x o | 执行切换到下一个窗口操作n次 | |
C-x ^ | 高亮当前窗口 | |
C-} | 水平加宽当前窗口 | |
C-{ | 水平缩小当前窗口 | |
shrink-window | 垂直方向上收缩窗口 | |
C-u | 一次以四倍方式执行以上扩大或者缩小、高亮等命令 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 | |
C-{ | 水平缩小当前窗口 |