学习Emacs系列教程(九):缓冲管理
首先提及一点,这里的缓冲就是Emacs中的buffer。闹,所谓的缓冲就是当前你正在编辑的东东。比如,你打开一个文件Emacs会建立一个缓冲来装载这个文件,当你调用帮助时Emacs会建立一个叫"*Help*"的缓冲来显示帮助内容,打开Tutorial则会出现TUTORIAL.cn这个缓冲。本质上来说缓冲就是内存中开辟的一段空闲空间。
每个缓冲都有自己的名字,像上面说的"TUTORIAL.cn" ,或者"*scratch*",这个是Emacs默认建立的缓冲用于调试Lisp表达式,缓冲的名字显示在mode line上。在一个Emacs里面我们可以建立N多个缓冲,但同时只能有一个缓冲处于激活状态,称之为“当前缓冲”,大部分操作命令只会对当前缓冲起作用。
一、操作缓冲
我们可以通过命令 C-x b buffer (switch-to-buffer) 来建立一个缓冲,这里buffer指你对这个缓冲起的名字,如果这个缓冲已经存在则会直接打开它。其实当你输完C-x b 后会出现一个默认的缓冲,就是上一个使用的缓冲,可以用回车直接切换过去。建立了多个缓冲之后使用C-x LEFT 或者 C-x RIGHT 来左右切换,LEFT和RIGHT是左右方向键。还有另外两个建立缓冲的命令,C-x 4 b buffer (switch-to-buffer-other-window) 在另一个window中建立缓冲和C-x 5 b buffer (switch-to-buffer-other-frame) 在另一个frame中建立缓冲,windows和frame的概念将会在下一章中介绍,这里只是告诉大家这两个命令。采用这种方式建立的缓冲一开始里面是一篇空白,并没有与某个文件联系起来,在随便编辑过后可以直接关掉且不会写到磁盘上,当然,除了你想把它存为文件。另一种建立缓冲的方式是,新建或打开一个文件,Emacs会默认建立已这个文件名为名的缓冲,所以这里可以看出文件和缓冲的区别,缓冲不一定是文件,但文件一定对应了一个缓冲。需要注意的一点是,缓冲名不要用空格开头,这种缓冲在Emacs中有其它用途,大家应尽量避免。
显示所有的缓冲使用命令C-x C-b (list-buffers) ,可以看到下面的效果。
最前面有个"."标识的是当前缓冲。在CRM这一栏中,还有些特殊符号,%表示是只读缓冲,*表示缓冲已经被修改过了。剩下四栏根据名字也可以理解了。这个命令加个前缀,C-u C-x C-b 则只会现在映射到文件的缓冲,对于上图就是dde。
在使用Emacs一段时间后可能积累了大量的缓冲,甚至拖慢了程序的速度,这时我们需要关闭一些不用的缓冲,释放点内存。命令C-x k buffer (kill-buffer)就是关闭指定的缓冲,如果这个缓冲对了一个修改过的文件则会出现提示是否直接关闭。一次也可以关掉很多缓冲,使用 kill-some-buffers,这个命令会出现很多提示,然后根据用户确认来关闭,首先会问是否关闭所有未修改过的缓冲,如果回答"no",则会从未修改的到修改过的缓冲一个一个询问是否关闭。如果你三天都没关过Emacs那就试试 clean-buffer-list ,默认帮你关掉三天都未使用过的缓冲。
下面再介绍一些杂项操作:
C-x C-q (toggle-read-only),切换当前缓冲的只读属性。
C-u M-g M-g num ,跳至前一使用缓冲的第num行,这个在写参考文献引用行的时候稍微有用。
rename-buffer,重命名一个缓冲。
rename-uniquely,重命名当前缓冲,直接在其后加一个数字后缀。
view-buffer,只读方式打开一个缓冲,而且什么都不能修改,按q退出view模式。
二、Buffer Menu
上一节说到我们可以使用C-x C-b 来查看所有的缓冲,另外还有个命令可以起到同样的效果buffer-menu,但是这个命令不仅能让你看看现在有哪些缓冲,更重要的是它能对这些缓冲进行各种管理。在使用buffer-menu这个命令后,我们可以看见Emacs的模式名变成了"Buffer Menu",说明现在进入了另一种模式,具体怎么操作这些缓冲详见下表:
按键 | 效果 | 备注 |
---|---|---|
SPC, n | 移动到下一项 | |
p |
移动到上一项 |
|
d, k |
标记删除缓冲,并移动到下一项 |
按x后生效 |
C-d |
标记删除缓冲,并移动到上一项 |
按x后生效 |
s |
标记保存缓冲 |
按x后生效 |
x | 执行标记删除或保存的缓冲 | |
u | 取消当前缓冲的标记,并移动到下一项 |
|
Backspace | 取消当前缓冲的标记,并移动到上一项 | |
~ | 设置缓冲为未修改 | |
% | 切换缓冲的只读属性 | |
1 | 将选中缓冲满窗口显示 |
|
2 | 将选中缓冲显示在一半窗口中 |
|
t | 缓冲用tags table 方式显示 |
|
f, RET | 显示选择缓冲 |
|
o | 缓冲在新窗口显示,并选中该窗口 |
|
C-o | 缓冲在新窗口显示,但不选中该窗口 |
|
b | 将选中缓冲移动到最后一行 |
|
m | 标记缓冲在新窗口显示 | 按v后生效 |
v | 显示标记的缓冲 |
|
g | 刷新buffer menu |
|
T | 切换显示文件关联缓冲 |
|
q | 退出Buffer Menu |
|
需要注意的是大部分功能是立即生效的,但像d,s,m这些只会起标记作用,在确认之后才会执行,而且按了这三个键后对应会在缓冲名前显示"D", "S", ">" 三个符号用作提示。
三、间接缓冲
间接缓冲是指与其它缓冲共享内容的一种缓冲,它链接在一个基缓冲之上。命令 M-x make-indirect-buffer RET base-buffer RET indirect-buffer 会建立一个叫"indirect-buffer" 的缓冲,它和"base-buffer" 绑定。或者使用 clone-indirect-buffer 来快速复制当前缓冲。间接缓冲和基缓冲之间有一个同步,就是他们的内容是完全一样的,不过也仅仅是内容一样,本质上却是两个完全分离的缓冲。不同于基缓冲,间接缓冲是不能和文件关联的,如果你试图保存一个间接缓冲只会作用到其基缓冲上。另外,由于两种缓冲的关联性,你关闭基缓冲时间接缓冲也会被关闭,而关闭间接缓冲不会有任何事发生。
使用间接缓冲的地方也少,尤其当一篇文章或代码很长,既想编辑页头又想看看页尾,这时间接缓冲是最好的选择。
小结:
按键 | 命令 | 作用 |
---|---|---|
C-x b | switch-to-buffer | 打开或新建一个缓冲 |
C-x 4 b | switch-to-buffer-other-window | 在另一个window中打开或新建一个缓冲 |
C-x 5 b | switch-to-buffer-other-frame | 在另一个frame中打开或新建一个缓冲 |
C-x LEFT | next-buffer | 移动到下一个缓冲 |
C-x RIGHT | previous-buffer | 移动到前一个缓冲 |
C-x C-b | list-buffers | 显示所有缓冲 |
C-u C-x C-b | 显示映射到文件的缓冲 | |
C-x k | kill-buffer | 关闭缓冲 |
kill-some-buffers | 关闭多个缓冲 | |
clean-buffer-list | 关闭三天未使用的缓冲 | |
C-x C-q | toggle-read-only | 切换缓冲只读属性 |
C-u M-g M-g num | 跳至前一缓冲num行 | |
rename-buffer | 重命名缓冲 | |
rename-uniquely | 重命名缓冲,在其名后加数字 | |
view-buffer | 只读方式打开缓冲 | |
buffer-menu | 打开Buffer Menu | |
make-indirect-buffer | 建立间接缓冲 | |
clone-indirect-buffer | 建立当前缓冲的间接缓冲 |
未完待续。。。