BBS水木清华站∶精华区

 
Emacs 的缓冲区与视窗 
 
EMACS 的缓冲区与视窗的关系密不可分,缓冲区是用来存放 
编辑文件的,但视窗却是用来显示缓冲区的文件。现在就来谈谈 
缓冲区和视窗。 
缓冲区(buffer)是 EMACS 编辑文件时,暂时存放文件的地方。 
这个地方只用来暂时存放文件,要想永久保留这些文件,必需将 
暂时存放的文件储存起来,一般是使用硬碟来安置缓冲区的文件。 
     在 EMACS 中所做的任何事情,都是先暂放於缓冲区内。 
EMACS 处理档案的方式,也是先将档案从硬碟中取出後, 
再放於缓冲区内。所以不论是删减、修改与新增文件,都是在 
缓冲区内进行,除非将缓冲区内的文件存回硬碟,否则硬碟的内容 
都不会因缓冲区内容的改变而改变。 
     文件未存回硬碟而离开 EMACS(kill EMACS),将永远消失 
。但 EMACS 有一个自动储存文件的功能,称为 `` auto save'' 。 
每当键入一定数量的字元(通常是三百个字元),EMACS 就会 
自动做储存的动作;经过一段停置的时间(通常是三十秒), 
EMACS 也会做自动储存的动作。 
     EMACS 自动储存的功能并非将文件直接存回该档案 
所在的硬碟中,而是将缓冲区的文件存入一个暂存档内。 
只有以存档的指令,例如 `` Ctrl-x Ctrl-s'' 的指令,将缓冲区的 
文件存回硬碟时,缓冲区内的文件才会存回硬碟中。只有当文件 
存回硬碟中,EMACS 才会自动清除此暂存档。若缓冲区的内容 
一直未存回硬碟,此暂存档就会一直存在著,直到存回硬碟才会消失。 
     EMACS 如此安排暂存档有两个好处,第一个好处是可以 
确保编辑的档案资料不会流失;第二个好处是可预防机器意外关机 
或当机,档案不及存回硬碟,所造成的损失。EMACS 命名此暂存档 
的方式,是以缓冲区所使用的档名为依据。在档名的前後各加上一个 
``#'' ,就是暂存档的名称。举例说明,若所编辑的档名为 ``emacs.doc'' , 
其产生的暂存档即为: 
 
        #emacs.doc# 
 
若所编辑的档案未存回硬碟时, EMACS 会自动产生一个暂存档。 
下次编辑此档时, EMACS 允予使用者从暂存档中将流失的资料回复。 
例如编辑的档案为 ``emacs.doc'',在离开 EMACS 时未存回硬碟 , 
 EMACS 会自动产生一个 ``#emacs.doc#'' 的自动储存档。当重新启动 
EMACS 且编辑 ``emacs.doc'' 档时, EMACS 会提示使用者此档案 
已被更改过但未给予适当的储存。此时,使用者可自行决定是否 
要从自动储存的档案中(#emacs.doc#)将 ``emacs.doc'' 档中 
未被储存的资料找回。 
     如何从自动储存档中将资料找回呢?想要从自动储存的档案中, 
恢复原始档案中流失的资料,可以使用 `` Meta-x recovery-file'' 
的指令。若存放於硬碟中的档案,有相对应的自动储存档时, 
可经由如下的步骤将资料找回: 
 
  1.  键入 ``Ctrl-x Ctrl-f RET'' 
           Find file: ~/ filename 
  2.  在 Find file: 处输入所欲编辑的档案後後, echo area 
           会出现如下的讯息: 
           Auto save file is newer: consider M-x recovery-file 
 
  3.  键入 ``Meta-x recovery-file RET'' 
           此时  echo area 会自动出现相对应的自动储存的档案名称, 
           若愿意执行恢复的动作,只要直接按下 RET 即可。否则, 
           以 ``Ctrl-g'' 指令,放弃此命令的执行。 
 
     除了暂存档外, EMACS 对於每一个编辑的档案, 
都会在编辑前做一份备份,以防止在编辑的过程中因一时的疏忽 
而将档案毁损。备份档的设计是,当档案被存回硬碟後,备份档 
也不会因此而消失。 
     EMACS 命名备份档的方式,是在所要编辑的档名之後加上 
``~'' 。例如, ``emacs.doc'' 的备份档就为 ``emacs.doc~''。 
 
     以上的设定是可以改变,因为它们都是变数。下面 
列出相关的变数,使用者可自行决定其所需。 
 
   *   auto-save-visited-file-name 
           设定自动储存档案的种类。可以设为暂存档也可设为正在 
           使用的原档案。 
   *   delete-auto-save-file 
           设定档案被存回硬碟後,自动储存的暂存档是否会自动删除。 
   *   auto-save-interval 
           设定自动储存时的字元数。 
   *   auto-save-timeout 
           设定自动储存时的时间。 
 
 
想知道如何设定变数吗?在 EMACS 中任何设定变数的方法都是以 
 `` Meta-x set-variable(或  ESC-x set-variable)''的指令来完成 
变数的设定。变数值的设定,可以只设定真假值或设定数值或是 
设定字串。 
     若只是设定变数的肯定或否定值时, EMACS 有一个遵循 
的规则。EMACS 中以任何 ``non-nil'' 的值来代表肯定,习惯上是以 
 ``t'' 来表示肯定;而以 ``nil'' 来代表否定。 
 
     在设定新的变数值之前,若想知道目前变数的值, 
EMACS 可以 `` Ctrl-h v''(describe-variable) 来查阅变数的值。 
现在就举设定 
``auto-save-visited-file-name'', 
 
``和 auto-save-interval'' 
  二个变数来说明变数设定的方法。 
 
  1.  以 `` Ctrl-h v'' 查阅 auto-save-visited-file-name 的变数。 
  2.  以 `` Meta-x set-variable'' 来设定变数 。 
  3.  再以 `` Ctrl-h v'' 来查阅所设定的 auto-save-visited-file-name 变数。 
 
现在来看看设定 auto-save-visited-file-name 这一个变数的实际过程: 
 
  1.  键 ``Ctrl-h v RET'' 
 
 
 
       1.   echo area 处会出现 Describe variable: 
 
       2.  在 Describe variable: 後键入 auto-save-visited-file-name 
 
       3.  萤幕上会另开一个视窗,显示如下的讯息: 
 
               auto-save-visited-file-name's value is nil 
 
               Documentation: 
               *Non-nil says auto-save a buffer in the file it is visiting, when 
 
               practical. 
               Normally auto-save files are written under other names. 
 
 
 
 
  2.  键入 ``Meta-x set-variable'' 
 
 
 
       1.   echo area 处会出现 Set varaible: 
 
 
       2.  在 Set variable: 後键入 auto-save-visited-file-name RET 
 
 
       3.   echo area 处会出现 Set auto-save-visisted-file-name to value: 
 
 
       4.  此时可以利用在 ``:'' 之後的  minibuffer,输入变数 
            的值。此变数的值不是肯定就是否定的。目前的值是 nil,要改 
            其值为肯定的可以输入  t。 
 
 
 
  3.  再以 ``Ctrl-h v'' 来检视变数设定的情形。 
 
上一个例子是设定肯定与否定值的例子,现在来看看设定变数值 
为数字的例子。  auto-save-interval 实际执行的过程: 
 
  1.  键入 ``Ctrl-h v RET'' 
 
 
 
       1.   echo area 处会出现 Describe variable: 
 
       2.  在 Describe variable: 後键入 auto-save-interval 
 
       3.  萤幕上会另开一个视窗,显示如下的讯息: 
 
               auto-save-interval's value is 300 
 
               Documentation: 
 
               *Number of keyboard input characters between auto-saves. 
 
               Zero means disable autosaving due to number of characters typed. 
 
 
 
 
  2.  键入 ``Meta-x set-variable'' 
 
 
 
       1.   echo area 处,会出现 Set varaible : 
 
       2.  在 Set variable: 後键入 auto-save-interval RET 
 
       3.   echo area 处会出现 Set auto-save-interval to value: 
 
       4.  此时可以利用 ``:'' 之後的  minibuffer,输入变数 
             的值。此变数的值为数字。目前的值是 300,使用者可根据需要 
             输入适当的数字。 
 
 
  3.  再以 ``Ctrl-h v'' 来检视变数设定的情形。 
 
     在 EMACS 执行过程中所设定的变数值,只对目前所执行的 
 EMACS 有用,一旦离开此 EMACS,所有的设定就恢复成原来的 
预设值。要想永久保留此设定的变数值,就必需将所设定的变数值 
储存在档名为 ``.emacs'' (.emacs 档为 EMACS 的启始档,进入 
EMACS 时会先执行此档内的指令, EMACS 的设定也是根处此档 
而来的的档案中。因为启动 EMACS 时, EMACS 会先执行 
.emacs 档,所有存於此档案的变数会被重新设定一次。 
     在 .emacs 档中设定变数 ``auto-save-visited-file-name'' 与 
``auto-save-interval'' 的方法如下所示: 
 
        (setq auto-save-visited-file-name t) 
        (setq auto-save-interval 350) 
 
前已述及 EMACS 可以容许多个缓冲区的同时存在,既然如此, 
自然有其处理每个缓冲区的方法。现在就来看看 EMACS 如何 
处理缓冲区。 
 
   *   Ctrl-x b  buffer RET (switch-to-buffer) 
     此指令用来选择不同的缓冲区,其预选的缓冲区是目前所使用 
     的缓冲区之外,最近被使用过的缓冲区。此指令可以使用  completion 。 
     使用此指令,  echo area 会出现如下的讯息: 
 
           Switch to buffer: (default filename) 
 
     若所要选择的缓冲区不是系统所预设的,可以利用 
      minibuffer 将所要选择的缓冲区名称键入。 
   *   Ctrl-x k  buffername RET (kill-buffer) 
     此指令是用来删除  minibuffer 所显示的缓冲区。若只键入 
     RET ,则删除目前的缓冲区,否则,删除所输入的缓冲区名称。 
     同样的,此指令可以使用  completion。 
   *   Ctrl-x Ctrl-b (list-buffer) 
     将目前 EMACS 所使用过的缓冲区显示出来。 
     以下的就是执行 ``Ctrl-x Ctrl-b'' 时,视窗所显示的资料: 
 
 
 
 
 
 
 
 
 
 
 
      MR Buffer      Size     File 
                     Mode 
      -- ------      ----     ----            ---- 
      .* chap4.tex   17460    LaTeX           /home/usr/hsko/work/chap4.tex 
      *% RMAIL       8788     RMAIL           /home/usr/hsko/RMAIL 
      * *Buffer      Buffer 
      List* 241      Menu 
 
      *scratch*      0        lisp 
                              Interaction 
      diary          928      Fundamental     /home/usr/hsko/diary 
      % *man ls*     15420    Man 
      *Help*         64       Fundamental 
 
        以上资料的每一栏位各有其所代表的意思,详述如下: 
 
 
 
        o  栏位  MR,标记缓冲区的状态,其可能的状态如下所示: 
 
 
 
             +  ``*'' 
                           表示此缓冲区被修改过。 
 
 
             +  ``.*'' 
                           ``.'' 表示此缓冲区为目前被选择的缓冲区, ``.*''表示此选用 
                     的缓冲区被修改过。 
 
 
             +  ``%'' 
                           ``%'' 表示此缓冲区为 read-only 的缓冲区。 
 
 
             +  ``%*'' 
                           表示此 read-only 的缓冲区被修改过。 
 
 
 
 
        o  栏位  Buffer,显示所使用的缓冲区名称。 
 
 
 
 
             +   Buffer 中的资料若为档案名称时,则表示缓冲区所放置 
                    的资料为一个档案。 
 
 
             +  若  Buffer 中的资料前後加上了 ``*'',则表示此缓冲 
                        区不是任何被访问的档案。 
 
 
 
 
        o  栏位  Size,显示缓冲区的大小。 
 
 
        o  栏位  Mode,显示缓冲区所使用的主要模式。 
 
 
        o  栏位  File,表示所访问档案的绝对名称。若缓冲区的资料 
             不是来自访问的档案,亦即栏位  Buffer 的名字前後加上 ``*'' 时, 
             则以空白表示。 
 
 
 
   *   Meta-x buffer-menu 
     此指令好似 Dired\indexdired 的功能,应用在缓冲区上。 
     此指令可对列出来的缓冲区各别做运作。其运作内容包括,储存 
     缓冲区、删除缓冲区、显示缓冲区以及编辑缓冲区等等。其实 
     运作於 `` Meta-x buffer-menu'' 的指令同样也可用在 `` Ctrl-x list-buffer'' 上, 
     只是使用 `` Meta-x buffer-menu'' 指令时, echo area 处会显示出 
     可运用的选项。其可运用的选项内容如下所示: 
 
     Command: d, s, x, u; f, o, 1, 2, m, v; ~, %; q to quit; ? for help. 
 
     现举较常使用的选项说明,至於其馀的选项,使用者可键入 ``?'' 
      ,来使用其所提供的线上述助。 
 
 
 
        o   d 
             标示所欲删除的缓冲区。 
             在  MR 栏位的最前方会出现 D。此时并未真正删除缓冲区, 
             只是将要删除的缓冲区做上标记,直到下达执行标记的命令时, 
             才会真正将标示 D 的缓冲区删除。此执行的指令为 `` x''。 
 
        o   s 
             标示所欲储存的缓冲区。 
             在  MR 栏位处标示上 S 。此时并未真正做储存的动作,只是 
             在要储存的缓冲区做上标记,直到下达执行标记的命令时, 
             才会真正将标示 S 的缓冲区存档。 
 
        o   x 
            对做好标记的缓冲区,下达执行的命令。也就是对标示有 D 
            与 S 的缓冲区,做执行的动作。 
 
        o   u 
            将设好的标记取消。 
 
        o   f 
            选择目前游标所在处的缓冲区。此时的视窗会将此缓冲区的内容 
            显示出来、 
 
 
谈完了 EMACS 的缓冲区,现在来谈谈与其关系密切的视窗。 
前已略述,进入 text-only 的 EMACS,即进入一个  frame。 
一个  frame 由数个视窗组成,每一个视窗显示一个 EMACS 
的缓冲区,且一次只显示一个缓冲区的内容。 
 
     EMACS 在任何时候,总有一个视窗为选择的视窗 
( selected window)。此视窗所显示的缓冲区,则称为目前的 
缓冲区( current buffer).point(或称为游标) 所在的视窗,就是 
EMACS 的选择视窗。EMACS 是透过游标来示  point 所在的位置。 
所以说,若想要知道目前的选择视窗,观察游标所在的位置就可知道。 
     至於什麽是  point  呢?  point 就是用来标示目前 
所使用的视窗或缓冲区所在的位置。EMACS 的每一个视窗, 
各有其所专属的点位置( point location).每一个缓冲区 
也有属於它自已的点位置。每一个缓冲区或视窗  point 的位置, 
并不会随著视窗或缓冲区的改变而变动。换言之,point 的位置会 
随时被记录下来,当再次访问其它的视窗或缓冲区时,游标仍会 
回到离开前的位置。所以,任何移动  point 的指令,只会对所选择 
的视窗产生影响,对於其它视窗的  point 是不会有任何影响的。 
 
EMACS 下的每个视窗除了有各自的  point 外,也各自有其相对应的 
 mode line。 
     EMACS 视窗的大小是容许重新调整的。除了大小是 
可以调整的,一个视窗也可以再分成两个视窗。其分割的方法, 
可以做水平或垂直的化分。视窗的操作,除了分割视窗之外, 
也可以使游标在不同的视窗间移动;当然,将不需要的视窗删除 
也是基本的功能。现在就来看看与视窗相关的指令。 
 
   *  Ctrl-x 2(split-window-vertically) 
     将一个视窗分成上下两个视窗。此时化分出来的两个视窗,分享 
     著化分前视窗的缓冲区。换言之,此时两个视窗的缓冲区内容是 
     一样的。因为共享著同一个缓冲区,所以改变其中一个视窗缓冲区 
     的内容,也会改变另一个视窗缓冲区的内容。分割成两个视窗的 
     好处之一是,可以编辑一个缓冲区,将另一个缓冲区作为参考的依据。 
 
 
        o   Ctrl-x ^ (enlarge-window) 
             将目前游标所在的视窗拉长一列。此指令,只有在 frame 
             存在一个以上的视窗时才有效果。若只有一个视窗,此视窗就 
             占据了整个 frame,此时自然就无多馀的空间可以放大了。 
 
        o   Ctrl-u  n Ctrl-x ^ (enlarge-window nn) 
             与  Ctrl-x ^  指令相似。不同之处在於,此指令可以将目前游标 
             所在的视窗拉长  n 列以上。 
 
 
 
   *   Ctrl-x 3(split-window-horizontally) 
        将视窗分成左右两个视窗。此时的两个视窗依然拥有相同的 
        缓冲区,所以,改变一个视窗缓冲区的内容,同时也会改变 
        另一个视窗缓冲区的内容。 
 
 
 
        o   Ctrl-x  (enlarge-window-horizontally) 
             将目前游标所在的视窗拉宽一行。对  frame 存有一个 
             以上的视窗才有效。若只有一个视窗,此视窗已经占据整个 
             frame 了,即使想放大,恐怕也爱莫能助了。 
 
        o   Ctrl-u  n Ctrl-x  (enlarge-window-horizontally nn ) 
             与  Ctrl-u  指令相似。此指令可以将目前游标所在的视窗 
             拉宽n 行。 
 
 
 
*   Using Other Windows and Deleting Windows 
 
 
   *   Ctrl-x o(other-window) 
     此指令是用来选择所欲使用的视窗。注意,此 `` o'' 是英文字的 
     `` o'',而非数字的 ``0''。 
   *   Ctrl-x 0(delete-window) 
     将目前游标所在的视窗删除。提醒大家注意,此 `` 0'' 是 
     阿拉伯数字的 `` 0''。 
   *   Ctrl-x 1(delete-other-window) 
     保留目前游标所在的视窗,其馀的视窗全部删除。 
 
 
 
     视窗的大小是有限的,但缓冲区的内容却经常超过视窗 
所能显示的□围。接下来就是要告诉各位,如何在有限的空间中, 
以窥缓冲区的全貌。 
 
想要在视窗的局限下,洞悉缓冲区的全貌,其最基本动作就是 
卷动萤幕。所谓萤幕的卷动,就是萤幕上下左右的移动。除了 
卷动萤幕之外,还需考虑萤幕的清除。在那些情形之下要清除 
萤幕呢?例如,远方送来的 message, 在萤幕的显示久久不退; 
系统送来的讯息也在萤幕上不会消失。这些情况的发生,都值得 
将萤幕做清除且重新显示的动作。以下就来看看这些相关的指令。 
 
   *   Ctrl-l(recenter)(清除萤幕) 
     清除萤幕且重新显示萤幕。 
   *  使萤幕上下卷动 
 
 
        o   Ctrl-v(scroll-up)(向上卷动萤幕一列) 
                向上卷动萤幕,且将目前萤幕的最後二列做为卷动後萤幕的 
                前二列。 point 出现在萤幕的第一列。 
 
        o   Ctrl-u  n Ctrl-v (向上卷动萤幕  n 列) 
                萤幕向上卷动  n 列。 
                若指定卷动的列数  n ,不超过  point 在此萤幕上所在 
                的列数,卷动後的  point 仍会留在原处不动,否则 point 
                移至萤幕的第一列。 
 
        o   Meta-v(scroll-down)(向下卷动萤幕一列) 
                向下卷动萤幕, 且将目前萤幕的前二列做为卷动後萤幕的後二列, 
                 point 出现在萤幕的最後一列。 
 
        o   Ctrl-u n Ctrl-v(向下卷动萤幕  n 列) 
                萤幕向下卷动 n 列。 
                若向下卷动的列数  n,不超过  point 在此萤幕所在位置以下 
                的列数, 卷动後的  point 仍会留在原处不动,否则 
                 point 移至萤幕的最後一列。 
 
        o   Meta < (beginning-of-buffer)(萤幕卷至缓冲区的最前端) 
                (beginning-of-buffer)将萤幕卷至缓冲区的最前端,  point 也移至第一列。 
 
        o   Meta >(end-of-buffer)(萤幕卷至缓冲区的最尾端) 
                将萤幕卷至缓冲区的最尾端,  point 也移至最後一列。 
 
        o   Ctrl-ESC-v(scroll-other-window) 
               前面六个卷动萤幕的指令,都是针对游标所在位置的视窗而言, 
               若要卷动其它的视窗,则必需使用 `` Ctrl-ESC-v''。 
                `` Ctrl-ESC-v'' 指令是用来卷动游标所在位置下一个视窗的萤幕。 
                所以,如果开启了两个视窗,可以使用此指令来参考非游标所在 
                位置的缓冲区资料。此指令方便之处在於,可以省略移动游标 
                的步骤,就可以卷动其它的视窗。 
                  如果今开启了 A 与 B 二个视窗,游标在视窗 A 处,以 
                  `` Ctrl-ESC-v'' 可以卷动视窗 B。如果开启二个以上的视窗, 
                  `` Ctrl-ESC-v'' 指令所卷动的视窗,就必需看那一个视窗最 
                 接近游标所在的视窗了。 
 
 
   *  使萤幕左右卷动 
 
 
 
        o   Ctrl-x <(scroll-left) 
                萤幕向左卷动。 
 
 
        o   Ctrl-x >(scroll-right) 
                萤幕向右卷动。 
 
 
 
   *  上下移动游标 
 
 
 
        o   Ctrl-p 或  ↑(previous-line) 
             ↑Ctrl-p 可以使游标向上移动一列。若有设定功能键,则可以用 
             来移动游标。 
 
 
        o   Ctrl-u  n Ctrl-p 
             使游标向上移动  n 列。 
 
 
        o   Ctrl-n 或  ↓next-line) 
                 Ctrl-n 可以使游标向下移动一列。若有设定功能键,则可以用 
                 ↓ 来移动游标。 
 
        o   Ctrl-u  n Ctrl-n 
                   使游标向下移动  n 列。 
 
 

BBS水木清华站∶精华区