学习Emacs系列教程(九):缓冲管理 (十):多窗口

转载 2012年03月23日 13:13:17

学习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
建立当前缓冲的间接缓冲




学习Emacs系列教程(十):多窗口

  首先先明确下Emacs窗口的概念,我们双击Emacs图标打开程序见到的Windows窗口叫做Frame,包含了标题栏,菜单栏,工具栏,最下面的Mode Line和回显区域,而中间一大块显示文本的区域则是Window,实际上每个窗口都有自己的Mode Line。下文中我将称Frame为框,Window为窗口,这里和我们平时理解的Windows窗口有点区别。

  在Emacs里面,一个框可以分割出多个窗口,多个窗口可以显示同一个或者不同Buffer,但是一个窗口只能属于一个Frame。一个窗口同时也只能显示一个Buffer,但是同时打开两个窗口也能显示一个Buffer的不同部分,这两个窗口是同步的,就是说如果在一个窗口中对Buffer做了修改,在另一个窗口中可以立即表现出来。但在一个窗口中移动光标之类的操作不会影响另一个窗口。多缓冲中有当前缓冲这个概念,同样对于多窗口也有当前窗口,对于当前选中的窗口其Mode Line相对于其它窗口颜色会深一些。

 

一、显示窗口

  命令C-x 2 (split-window-vertically) 垂直拆分窗口,就是把一个窗口上下等分为两个,拆分出来的窗口默认是显示当前Buffer。可以多次使用这个命令,会把一个窗口不停的两等分。对应也有水平拆分窗口的命令C-x 3 (split-window-horizontally),这两个命令也可以混合使用,如果你屏幕够大画个迷宫出来也不是不可能的。拆分命令还可以加参数,比如M-5 C-x 2就是说上面那个窗口只占5行,其余的位置都给下面的窗口。

  C-x o (other-window) 可以在多个窗口中切换,从上到下一个一个的来。使用参数来控制选中下面第几个窗口,想往回选的话参数设为负数。

  C-M-v (scroll-other-window),用来滚动下一个窗口。

  上一章我们看到有些命令加了C-x 4这个前缀,这一类命令都是用来操作多窗口的。

  C-x 4 b bufname (switch-to-buffer-other-window) 在另一个窗口打开缓冲。

  C-x 4 C-o bufname (display-buffer) 在另一个窗口打开缓冲,但不选中那个窗口。

  C-x 4 f filename (find-file-other-window) 在另一个窗口打开文件。

  C-x 4 d directory (dired-other-window) 在另一个窗口打开文件夹。

  C-x 4 m (mail-other-window) 在另一个窗口写邮件。

  C-x 4 r filename (find-file-read-only-other-window) 在另一个窗口以只读方式打开文件。

   这一类的命令默认是垂直拆分窗口。

 

二、重排窗口

  窗口排的密密麻麻看上去肯定不舒服,这时使用C-x 0 (delete-window) 来关闭当前窗口,需要注意的是窗口和缓冲是两个概念,关闭一个窗口对缓冲,或者我们正在编辑的文件没有任何影响。也可以使用C-x 1 (delete-other-windows) 关闭其它所有窗口。如果想连窗口打开的缓冲一并关掉使用C-x 4 0 (kill-buffer-and-window)。

  我们还可以对窗口的大小做些改变:C-x ^ (enlarge-window)让窗口变得高点,C-x { (shrink-window-horizontally) 这个是把窗口变窄,变宽的话是C-x } (enlarge-window-horizontally) ,C-x - (shrink-window-if-larger-than-buffer)这个看字面意思就能理解,如果窗口比缓冲大就缩小点,C-x + (balance-windows)这个命令和前面那个没有任何关系是将所有窗口变得一样高。

  最后再说一个在窗口中切换的命令,有时候窗口开的太多自己也记不住顺序,使用C-x o就会很麻烦。有一类命令能让你在上下左右切换当前窗口,M-x windmove-right 就是移到右边那个窗口,对应的"left","up“, "down",向四个方向都能移。


  不知不觉写了十章了,虽然慢了点,但还坚持下来了,继续努力!

 

小结:

按键

命令

作用

C-x 2

split-window-vertically

垂直拆分窗口

C-x 3

split-window-horizontally

水平拆分窗口

C-x o

other-window

选择下一个窗口

C-M-v

scroll-other-window

滚动下一个窗口

C-x 4 b
switch-to-buffer-other-window
在另一个窗口打开缓冲
C-x 4 C-o
display-buffer
在另一个窗口打开缓冲,但不选中
C-x 4 f
find-file-other-window
在另一个窗口打开文件
C-x 4 d
dired-other-window
在另一个窗口打开文件夹
C-x 4 m
mail-other-window
在另一个窗口写邮件
C-x 4 r
find-file-read-only-other-window
在另一个窗口以只读方式打开文件
C-x 0
delete-window
关闭当前窗口
C-x 1
delete-other-windows
关闭其它窗口
C-x 4 0
kill-buffer-and-window
关闭当前窗口和缓冲
C-x ^
enlarge-window
增高当前窗口
C-x {
shrink-window-horizontally
将当前窗口变窄
C-x }
enlarge-window-horizontally
将当前窗口变宽
C-x -
shrink-window-if-larger-than-buffer
如果窗口比缓冲大就缩小
C-x +
balance-windows
所有窗口一样高

windmove-right
切换到右边的窗口(类似:up, down, left)
 

  未完待续。。。


TCP接收/发送滑动窗口与内核接收/发送缓冲区之间的关系

转自:http://blog.csdn.net/yusiguyuan/article/details/28625129?utm_source=tuicool&utm_medium=referral ...
  • sunshinewave
  • sunshinewave
  • 2016年03月16日 00:16
  • 2413

改造Emacs GDB调试的多窗口布局

转自:http://ppgunjack.iteye.com/blog/1179657 Emacs支持多窗口的GDB调试,要打开GDB的多窗口模式只需要设置Emacs全局变量gdb-man...
  • shyanyang
  • shyanyang
  • 2014年07月06日 17:15
  • 2577

环形缓冲区(ring buffer),环形队列(ring queue) 原理

1. 序言 环形缓冲区(ring buffer),环形队列(ring queue) 多用于2个线程之间传递数据,是标准的先入先出(FIFO)模型。一般来说,对于多线程共享数据,需要使用mutex来同步...
  • wabil
  • wabil
  • 2015年12月23日 13:34
  • 3406

学习Emacs系列教程(十):多窗口

原文地址:http://blog.sina.com.cn/s/blog_96b8a15401012yug.html
  • PurpleGalaxy
  • PurpleGalaxy
  • 2014年10月17日 14:28
  • 349

学习Emacs系列教程(九):缓冲管理

首先提及一点,这里的缓冲就是Emacs中的buffer。闹,所谓的缓冲就是当前你正在编辑的东东。比如,你打开一个文件Emacs会建立一个缓冲来装载这个文件,当你调用帮助时Emacs会建立一个叫"*He...
  • ruglcc
  • ruglcc
  • 2012年08月02日 10:14
  • 931

学习Emacs系列教程(四):Minibuffer

上回介绍了在Emacs中如何插入删除文本的简单操作,以及一些杂七杂八的命令,都还是蛮容易的。这回先跳过编辑这部分,介绍Emacs中的Minibuffer,呃,翻译过来叫迷你缓冲,听着比较难受,后面还是...
  • ruglcc
  • ruglcc
  • 2012年08月02日 09:21
  • 933

学习Emacs系列教程(六):编辑(3)

这次介绍编辑中关于粘贴复制的部分,不过在Emacs中称粘贴复制为Killing和Yanking,而不是通常说的Cutting和Pasting,当然差别不会太多。   一、Killing   Ki...
  • ruglcc
  • ruglcc
  • 2012年08月02日 09:39
  • 999

学习Emacs系列教程(一):基本使用

前言的前言:本人也是初学Emacs,之前对Vim也只接触了一点,所以也谈不上对哪个更喜欢,也分不出哪个更好。写这个教程的目的一是方便自己更好的学习Emacs, 二是没事找事。如果有专家路过还望多指点...
  • ruglcc
  • ruglcc
  • 2012年08月02日 08:18
  • 752

学习Emacs系列教程(八):查找替换

http://www.cnblogs.com/robertzml/archive/2010/03/03/1675870.html 查找替换是任何编辑器都不可能缺少的功能,就连小小的Notepad都有...
  • kezhen
  • kezhen
  • 2015年02月02日 17:15
  • 980

学习Emacs系列教程(五):编辑(2)—— 标记

http://www.cnblogs.com/robertzml/archive/2010/02/15/1668592.html 学习Emacs系列教程(五):编辑(2)—— 标记  学习Em...
  • PurpleGalaxy
  • PurpleGalaxy
  • 2014年10月17日 14:30
  • 395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习Emacs系列教程(九):缓冲管理 (十):多窗口
举报原因:
原因补充:

(最多只允许输入30个字)