Emacs User's Guide

目录

  1. 导言

    • GNU是什么

    • GNUEmacs是什么

    • GNUEMACS的特质

  2. Emacs的线上辅助说明

    • Emacs的基本知识

    • Emacs的自学我教材

    • Ctrl-h的用法

    • Eamcsinfo使用说明

  3. Emacs的整合环境

    • 如何在Emacs中执行Shell的指令

    • 有关目录的编辑方法

    • 如何编辑远方机器上的档案

    • 程式的编辑,编译与测试

    • 如何在Emacs中列印文件

    • Emacs中如何收发信件

    • 其它与Emacs相关的工作环境

  4. Emacs有关的议题

    • 如何起动Emacs

    • 如何离开Emacs

    • EMACS的萤幕安排

    • Emacs的缓冲区与视窗

  5. Emacs的基本编辑指令

    • 如何载入档案与储存档案

    • Emacs的基础编辑指令

    • 何谓Yanking

    • 如何在文件中做上标记

    • 文件的移动与拷贝

    • 何谓Undo

  6. Emacs进阶编辑指令

    • 文件的搜寻

    • 文件的取代

    • RegularExpression

  7. Emacs的其它相关事项

    • Registersand Bookmarks

    • 文字的勘误

    • 图形的编辑

  8. 中文编辑环境

    • Emacs下的中文编辑

    • 中文化的EMACSMule

  9. 结论



1.目录

Introduction

本文的主旨以讨论 EMACS 的入门为主,其内容包括 EMACS 发展的概述, EMACS 整合环境的简介以及 EMACS 的基石- editor 的详谈。本文在结构上分成八章,第一章讨论有关 EMACS 的源起、发展历史以及 EMACS 的特性简介。第二章讨论 EMACS 的 on-linehelp。第三章则简单介绍 EMACS 的整合环境。接下来就是本文的重点,探讨 EMACS 的本质。所以,第三章之的各章节则详细探讨 EMACS editor 的这一个主题。

现在就来讨论与 EMACS 发展有关的机构组织以及 EMACS 所扮演的角色特质。

GNU 是什麽

GNU 是 RichardStallman 於 1975 年,在 MIT 所成立的 FreeSoftware Foundation (FSF)中所执行的一项计划。GNU 的本意代表 ``Gnu'sNot Unix'';虽然如此,它却是一个与 UNIX 完全相容的软体系统。二者最大不同在於,GNU 是一个 free 的软体, UNIX 却是一个要付费的软体系统。 GNU 之所以与 UNIX 完全相容,是因为 UNIX 的使用者很多,为了让 UNIX 的使用者在使用 GNU 的时候不会有疏离的感觉,所以 GNU 尽量与UNIX 相容,它的相容只是看起来与用起来像 UNIX 而已, GNU 其实改进了所多 UNIX 的缺点,使它能尽善尽美。

Stallman 倡导 FSF 的宗旨,是要建立一个软体 free 的王国。他所谓的 free 并不是意谓著便宜或免费,因为在 FSF 下的有些软体还是必需付些工本费。他所谓的 free 是指使用上的自由。

要了解 Stallman 所言 free 的真意,就必须知道一般软体的使用情形。大部份的商业软体在使用上都或多或少有些限制。例如,必须付费才可使用软体程式,若运气不好,同一程式在不同的电脑上使用,可能还要另行付费。有些软体程式的使用也有一定的期限,期限一到就需另缴费用,否则使用权就会被撤销;甚至有些软体是以使用时间来计算费用的。当然,这些商业软体是绝对不予许使用者将这些软体任意给他人使用。除非给予软体公司相当的代价,使用者是绝对不可能拿到软体的原始程式的。

上述的种种都还是付钱就可以解决的,有些问题是钱也乏术的。因为,当商业程式销售失败或远景不被看好时,使用者所购置的软体就可能被开发者遗弃。此时,若想维持此软体的正常运作,就必须自求多福了。 Stallman 所领导的 GNU 计划就是要脱离商业软体的种种枷锁,这也是 GNU 计划所谓 ``free'' 的真谛。GNU 计划下的任何软体,只要使用者能找到软体的来源,任何人都可以自由的使用它。获得 GNU 软体的来源很多,如 publicarchivesanonymousFTPUUNET 等,甚至任何一个装有 GNU 软体的地方都可以取得。GNU 计划下的软体,不只提供软体的使用权,也提供软体的原始程式,任何人都可以根据需要来修改程式,也可以尽己之力来找出程式的错误,使隶属於 GNU 的软体在大家的努力下能尽善尽美。 GNU计划下的软体,是可不需付费而享有使用权。GNU对使用者唯一的要求就是,当使用者对於 GNU计划下的软体做了进一步的修改时,仍必须维持GNU的精神,就是对於修改过的软体仍然必须将其无条件的奉献出来,任何人都不可将修改过的 GNU 软体当成商品来买卖。所以 Stallman一直强调 GNU 计划下的软体是free的,而且永远会是 free 的。GNU 计划的最终目标是要完成一个全新的作业系统。目前完成的有 EMACStext editordebuggeryacc-compatibleparser generator以及 linker等等;也完成了将尽三、四十个公用程式(utilities);而 shell 也已经接近完成的阶段。目前只要等 kernel 和 compiler 完成,就可以在 GNU 的系统上发展程式。

未来完成的 GNU 系统将可以执行 UNIX 上的所有程式,但它却与 UNIX 系统不完全一致。 GNU 系统将改进 UNIX 系统的缺失,使它使用起来更方便。例如,未来的系统将会有较长的档名,档名会有版次等等;新的系统会使用 C与 LISP 做为系统程式语言。


GNUEmacs 是什麽

GNUEMACS 是 GNU 计划下的第一个产品, EMACS 为 EditorMACros 的缩写。 RichardStallman 於 1975 年在 MIT 首次撰写 EMACSeditor。目前 GNUEMACS 已发展到 19.28 版,本文所讨论的 GNUEMACS 也以 19.28 版为主。 GNUEMACS 秉持著 GNU 的精神,它依然是 free 的。任何人都可以 ``anonymousftp'' 的方式至 prep.ai.mit.edu 这个 site ,取得 GNUEMACS 的原始码。 GNUEMACS 不是 publicdomain 的产物,它有版权也有使用上的限制,那就是任何得到它的人都不可以将其视为私有的财产。修改过的 GNUEMACS 也不可以作为商品来牟利,金钱交易的行为是绝对被禁止。

EMACS 有多种版本可适合不同的工作平台(platfrom)。适合 UNIX 环境的有 GNUEMACSUnipressEMACS 以及 CCAEMACS ,其中以GNUEMACS 最常被使用,本文也只介绍 GNUEMACS。适合个人电脑的 EMACS 有 FreEMACSMicroEMACS 以及 Epsilon。当然,也有使用在 VMS 环境的版本。

GNUEMACS 是由 与 LISP 语言写成,任何人都可依据需要将个人所发展的函式(function)加入 GNUEMACS 上。当然,新发展的软体是不可以从事商业买卖,只能将它无条件的奉献出来。新发展的函式可以直接在 EMACS 中使用,不需重新编译(complie)整个EMACS ,而且新增的函式也不会破坏 EMACS 原有的结构。就因为有此特性,EMACS 的函式可以与日俱增。愿与他人共享成果的使用者,可以透过电子邮件或电子公布栏,将函式的原始码公诸於世。公布的函式,最后会经由 FSF 的审查,以决定是否要加入新版的 EMACS 中。FSF 也鼓励使用者将所发现的错误,透过相同的管道,提供给 FSF作为改进之用。GNUEMACS就是在如此的运作下,靠大家共同的努力来提升品质,以达产品的稳定性。


GNUEMACS 的特质

GNUEMACS 与其说它是一个编辑器(editor),倒不如说它是一个以编辑器为主干的环境软体。一般的软体都是将编辑器视为一个附属功能,只有 EMACS 以编辑器为基石,在其上发展其它的功能。以收发电子信件的软体为例,电子信件软体是以收发信件为环境的基石。任何电子信件的软体都只有在使用编辑器时,才呼叫相关的编辑器。 EMACS的出发点就与众不同,EMACS 一切以编辑器为主,任何的功能都是建基在编辑器之上。

所以,进入 EMACS ,就等於是进入了一个编辑环境,这个编辑环境提使用者许多功能,让使用者如置身在一个全功能的作业系统中。EMACS 自行发展了一个 ``bourne-shell-like'' 的 shell,除了 EMACS 自己的 shell 外, EMACS 还可以让使用者自行选择所使用的shellEMACS可以读送 e-mail。 EMACS 可以透过 ftp 来编辑远方 host上的档案,而不需要签入(login)档案所在的hostEMACS也可做telnetrelogin的动作。EMACS也可以读 newsEMACS也提供了年历(calendar),可以让使用者查阅日期,也可以将重要的事情在年历上标示出来;EMACS又提供了``Diary''的功能,当特定的日期与时间到来时,会在萤幕上将 ``Diary'' 上的事情显示;EMACS 也有撰写文章大纲的功能。 EMACS 更提供多种程式的编译功能,让使用者可以在 EMACS 中一边编辑程式一边编译程式; EMACS 更有自己的 debugger,使程式的除错、编辑与编译在 EMACS 中同时完成。

所以 EMACS 所提供的不只是一个编辑器而己,它所提供的是一个整合的工作环境,而这个环境是建立在编辑的基石上。它希望使用者进入了 EMACS 以后,可以在 EMACS 的环境中完成所有的工作,不需要离开 EMACS,要离开 EMACS 就是要离开电脑的时候(logout)。EMACS 除了是一个整合的工作环境外,它还具有以下的特性:

  • displayeditor

  • real-timeeditor

  • advancededitor

  • Self-documenting

  • Customizable

  • Extensible

  • supportX window enviornment

  EMACS 是一个 display 编辑器,因为每一个被编辑的文字都会被显示在萤幕上。
  EMACS 是一个 real-time 的编辑器,因为当新的文字被键入时,萤幕会在非常短的时间内被更新。
  EMACS 的编辑功能不只具备一般编辑器所有的功能,它还提供如下的功能: 
  • 文字的填充(fillingof text)。

  • 程式自动内缩功能。

  • 可以同时阅读一个以上的档案。

  • 对於字元(characters)、字(words)、列(lines)、句子(sentences)、段落(paragraphs)、页(pages)以及各种程式中的 expression和注解(comments)都有其自有的处理方法。

EMACS 是一个 Self-documenting的软体,因为在任何时候都可以 ``Ctrl-h'' 指令来得立即的帮助。因为,透过 ``Ctrl-h'' 可以得知每一个EMACS 的指令。

EMACS 是可以 Customizable 的。使用者可视个人的需求,来改变 EMACS 指令的定义。GNUEMACSCustomization 的设定非常简单,使用者可以很方便的使用它。EMACS Extensible 的。GNUEMACS是由 LISP 语言所写成的函式共同组成的,函式与函式间的互动关系(dependency)不强。就因为EMACS是由函式所组合而成的,所以可以随时将函式作增减而不会破坏EMACS既有的结构。 EMACS 也针对 的视窗环境,提供自己的选单(menus)和滑鼠按纽(mousebottons)功能。 EMACS 对於 text-only 的终端机也提供许多与 环境相当的服务品质,例如在文字模式的终端机,可以同时开启数个的档案,档案可以互相切换,当使用 shell 模式来执行 shell 指令的同时也可以编辑档案。但本文的只讨论 text-onlyEMACS使用法。以上的种种就是有关EMACS的特色。至於如何使用这些功能就是下列章节所要讨论的重点。 



2.Emacs 的线上辅助说明

EMACS 是一个整合的工作环境,初次使用EMACS或不熟悉EMACS的人,常会不知所措。所以,EMACS 提供了非常便捷且功能强大的线上辅助说明(on-linehelp),来帮助使用 EMACS 

Emacs 的基本知识

在未讨论 EMACS 的线上辅助说明时,先谈谈如何启动 EMACS。启动EMACS 的方法很简单,只要在萤幕的提示下键入 ``emacs'' 即可;离开 EMACS,只要键入``Ctrl-xCtrl-c''即可离开 EMACS 。键入 ``Ctrl-xCtrl-c'' 的方法是,先按住键盘上的 Ctrl 键不放再按下英文字的 ``x''即可。键入 ``Ctrl-c'' 的方法一样,先按住键盘上的 Ctrl 键不放再按下英文字的 ``c'' 即可。当然进入与离开 EMACS 的方法还有多种,这里只是介绍一种方法,让使用者可以很快的使用 EMACS 的线上辅助说明,至於其它的方法会在以下各章节中陆续提及。

除了进入与离开 EMACS 的方法必须知道外,还有一个指令非常用那就是 ``Ctrl-g''。 ``Ctrl-g'' 可用来取消键入的指令,如果不想执行所键入的指令,可以随时将其取消。

EMACS 键入指令的方法有二种:

  • Ctrl 

  • Meta 

  所有 EMACS 的指令都可以 Meta 键表示出来,键盘上若无 Meta键,则可以 ESC键来取而代之。常用的 EMACS 指令通常会有一个 Hotkey与之连结。Hotkey 的构成,通常是以Ctrl为开头的型态出现。例如 ``Ctrl-x Ctrl-c'' 这一个 Hotkey,则代表了 EMACS 指令的 ``save-buffers-kill-emacs'' 。若要使用 Meta 键来表达与 Ctrl-x Ctrl-c 相同的效果 ,则必须键入

``ESC-xsave-buffers-kill-emacs''

使用 Meta 键,可以利用 EMACS completion 的功能。因为 completion 可以让使用者键入最少的字,就可使系统唤起所欲执行的命令。以下就介绍 EMACS的 completion

EMACS completion的意思是,只要键入字串的部份, EMACS 会将其余的部份自动填入其应在的位置。如果所给予的字串不足以决定其余的部份,EMACS 会将所有可能的结果都列出来,以供使用者来决定所需要的字串名称。 completion 所适用的范围如下:

  • 指令

  • 特定目录下的档案

  • 缓冲区

  • EMACS 的变数

  至於何谓特定目录下的档案、缓冲区以及 EMACS 的变数,会在以的章节中陆续谈及。此处讨论completion ,只是为了使用 completion  EMACS 的线上辅助说明。

  使用EMACScompletion有三种方法:
  • TAB 尽可能将其余的字串填满。

  • SPACE 将 puncutation 字元之前的字填满,填充的字不会超过一个字以上。

  • 将所有可能的 completion选择都列出来。

  使用completion 的做法是将部份字串键入,再按下 TABSPACE ? 即可。例如,键入 ``M-x au TAB'' ,则萤幕的最下方会出现 ``键入 TAB 则萤幕会在另一个视窗出现:
        Possible completions are:
        auto-fill-mode                                   auto-lower-mode
        auto-raise-mode                                  auto-save-mode
  若键入 ``M-x au SPACE'',则萤幕的最下方也会出现 ``M-x auto-''。若键入 SPACE ,则萤幕的另一个视窗也会出现如下的命令:
        Possible completions are:
        auto-fill-mode                                  auto-lower-mode
        auto-raise-mode                                 auto-save-mode

  这似乎意味著 TAB SPACE 的功能一样,其实不然,二者的差异可从下一个例子看出。键入 ``M-x auto-f TAB'',可得 ``M-x auto-fill-mode'';但键入 ``M-x auto-f SPACE'',只能得到``M-x auto-fill-'' ,欲得到 ``M-x auto-fill-mode'',则必须再键入一次 SPACE。这就是前面所说的 ``SPACE'' 一次只填一个 ``puncutation''之前的一个字的意思;而 TAB 则是尽可能的将所有可以判断出来的字串呈现出来,其显示字串的长度并不以一个 ``puncutation'' 为限。
  键入 ? 的作用,是在 EMACS 的另一个视窗上显示所有可能的字串,此时使用者可根据视窗上的讯息键入适当的命令。例如键入 ``M-x au ?'' ,萤幕上出现另一个视窗显示如下的资讯:
        Possible completions are:
        auto-fill-mode                                     auto-lower-mode
        auto-raise-mode                                 auto-save-mode
  键入 ``M-x au ?'' 的地方,则不会执行  completion  的动作,这是 ? TAB SPACE 最大不同的地方。
  若视窗的内容太多无法一次穷尽,此时就必需卷动视窗。卷动视窗可以用 ``Ctrl-v'' ``Meta-v'' 二个指令来使视窗做上下的移动。

Emacs 的自学教材

想快速了解 EMACS 的人,可以参考 EMACS 的自学教材(tutorial)。使用 EMACS 自学教材的方法很简单,只要键入 ``Ctrl-ht'' (help-with-tutorial) 即可进入 EMACS 的自学的状态了。

EMACS 的自学教材可分成以下几部份:

  1. 介绍 EMACS 指令的键入方法,即介绍 Ctrl 与 Meta 键。

  2. viewingscreenfuls

  3. basiccursor control

  4. Ctrl-g 的用法

  5. EMACS 的 window 与 multiplewindows

  6. insertingand deleting

  7. undo

  8. EMACS 档案的处理

  9. EMACS 的 buffers

  10. extendingthe command set

  11. 简介 EMACS 的 modeline 与 echoarea

  12. searching

  13. recursiveediting levels

  14. gettingmore help

  15. leavingEMACS

  16. 有关 EMACS 的版权问题

  EMACS 的自学教材是以编辑功能的介绍为主。虽然 EMACS 的功能不只如此, 但编辑是 EMACS 的最基础的功能,要了解 EMACS当然要从它的基本著手。所以 EMACS的自学教材也以编辑的介绍为主,至於 EMACS 其它的工件环境,是无法从 此自学教材中得知。所以,本文会在第三章简介 EMACS 的工作环境。

Ctrl-h 的用法

EMACS 除了自学教材可供参考外,它还提供了其它的线上辅助说明功能,让使用者可以随时查阅需要的相关讯息。EMACS的线上辅助说明都是以``Ctrl-h''为开端,其种类有以下二种:

  • Ctrl-h

  • Ctrl-hCtrl-h

键入 Ctrl-h(help-command),萤幕的最下端会出现如下的讯息:C-hType? for further options此时的 ``Ctrl-h'' 只是用做前置字(prefixkey),它是用来等候使用者输入其它的指令。若输入 ``?'',则萤幕的下方会出现所有可使用的选择,使用者可根据需要来选择合适的选项。若键入两次的 ``Ctrl-h''Ctrl-h(felp-for-help),萤幕下方会出现: typeone of the options listed or Space toscroll 此时 EMACS 会另外开启一个视窗,将所有与求助的选项都列出来,且会做一简要的说明,要卷动此视窗则键入 Space。此新开启的视窗共有二十一个选项,包括: ab c f C-f i k C-k l m n p s t v w C-c C-d C-n C-pC-w. 使用这二十一个选择项的方法非常简单,只要在 ``Ctrl-h'' 之后输入任一个选择就可以了。例如,要选择``a'' ,则执行 ``Ctrl-ha'' 即可。

现在将 EMACS 常用的线上辅助说明一一作解释。EMACS 常用的线上辅助说明有:

  • Ctrl-hc

  • Ctrl-hk

  • Ctrl-hw

  • Ctrl-ha

  • Ctrl-hv

  • Ctrl-hi

  ``Ctrl-h c'' ``Ctrl-h k'' 的功能相似, 二者都是在寻求与 Hotkey有关的讯息。二者唯一的差别,就在於对指令的解释详细与否而已。
  `` Ctrl-h c'' 是简述与 Hotkey 连结的命令,而 ``Ctrl-h k''则详述连结Hotkey 的命令。二者都有一个前题的预设,那就是都是先知道 Hotkey 为何,而想进一步知道此 Hotkey 所使用命令的名称。今举 ``Ctrl-x Ctrl-c'' 的例子来说明二者的差别。

键入 ``Ctrl-hc RET'' (RET,亦即键盘上的 Enter 键。任何一个指令输入完毕时,必需紧跟著一个 Enter。此作用是用以告知系统,指令输入已经结束,可以开始执行相关的动作了。则萤幕下方会出现 Describekey briefly: - 在 ``:'' 的后面键入 ``Ctrl-xCtrl-c'',则在原先出现 Describekey briefly: - 的地方则出现 C-xC-c runs the command save-buffers-kill-emacs'' 键入 ``Ctrl-hk RET'',则萤幕下方出现 Describekey: - 在 ``:'' 的后面键入``Ctrl-xCtrl-c'',则 EMACS 会另以一个视窗显示如下的讯息: save-buffers-kill-emacs:Offer to save each buffer, then kill this emacs process. With prefixarg, silently save all file-visiting buffers, thenkill. 此讯息的第一行是 Hotkey 所连结命令的全名,以后的行数则是对此命令的详细说明。 ``Ctrl-h w''w (where-is) 的用法与 ``Ctrl-h c'' 和 ``Ctrl-h k'' 正好相反。 ``Ctrl-h w'' 是在知道EMACS 的命令而欲知是否有相对应的 Hotkey 时所使用的。例如键入 ``Ctrl-hw'',萤幕的下方会出现

whereis command:

在 ``:'' 之后键入 ``save-buffers-kill-emacs'',则在原处会出现

save-buffers-kill-emacsis on C-x C-c 所以想知道命令是否有相对应的 Hotkey,可以此方法查知。 ``Ctrl-hw'' 可以使用 EMACS 的 completion ,但其最大的不便处,就是必需给予指令的第一个字元。如 ``save-buffers-kill-emacs'',必需先给予以 开头的子字串,才能逐步使用 EMACS completion 。若不键入 开头的子串,而键入s之后的任何字串,则无法找到相对应的指令,所以使用 ``Ctrl-hw'' 必需要记著指令的第一个字。除此之外, EMACS 的线上辅助说明还提供了另一种帮助,可让使用者键入任意的子字串,都可以找到相对应的指令,那就是 ``Ctrl-h a''。键入 ``Ctrl-ha'' 则萤幕的下方会出现 command-apropos(regexp): 此时只要给予与命令相关的任一子字串或 ``regular expression'' 6.3 节会讨论何谓 regularexpression)再按下 RET, EMACS 会另开一个视窗,将所有涵盖此子字串或 regularexpression 的指令全列出来。此指令与 ``Ctrl-h w'' 最大不同处如下:

  1. 使用 ``Ctrl-h a'' 所键入的子字串,并不限於指令的第一个字元而 ``Ctrl-h w'' 则必需以指令的第一个字为起始字。

  2. 使用 ``Ctrl-h a'',可给予指令中任何位置的子字串。 

  3. ``Ctrl-h a'' 无法使用 completion,而 ``Ctrl-h w'' 可使用 completion

  4. ``Ctrl-h a'' 主要的目的是当使用者无法正确的键入指令的第一个字元时,可以借此将所有包含使用者记得的部份子字串的指令都列举出来。

EMACS 除了以上几个常用的线上辅助说明之外,还有一个非常实用的资料查阅中心,那就是 ``Ctrl-h i''。 ``Ctrl-h i'' 执行 ``Infoprogram'',它主要是用来浏 已建构成树状结构的文件档案。目前所有与 EMACS 有关的文件档案都可透过 Info 来阅览,最终所有与 GNU 有关的文件资料,将可以由此而窥得其文件档案全貌。
使用  info  模式( infomode )的方法很简单,只要键入  ``Ctrl-hi''  就可查阅所有与  EMACS  相关的文件资料。进入了  info  之后要如何有效的使用它呢?会在下一节详细讨论。
以上所谈的,就是较常使用的线上辅助说明种类。若线上辅助说明的讯息,是以另一个视窗显示出来,此时的讯息又无法一「幕」了然。想参考其它部份的资料,就必需卷动视窗。视窗卷动的指令,可参考如下的方法:
  • Ctrl-x1 delete-other-windows
  • (本文所有与 Hotkey 相对应的指令都放於括号中。保留游标所在的视窗,而将其它的视窗关闭。
  • Ctrl-xo other-window
  • 可使游标在不同的视窗间切换。换言之,如果游标在工作的视窗,可以此指令将游标移出显示线上辅助说明讯息的视窗,反之亦然。
  • Ctrl-v scroll-up
  • 将萤幕向上卷,如此则可看清萤幕下方的讯息。
  • Meta-v scroll-down)
  • 萤幕向下卷,如此可以重复参考已经看过的资料。

Emacs 的 info 使用说明

前已简略叙述 info 的使用法,现在就更进一步详述之。在 EMACS 的线上辅助说明功能中,info 的内容可说是最为丰富的。因为,任何线上辅助说明的文件都可在 info 模式中找到。因为,info 就是用来放置整个 EMACS 手册。

info 对於 EMACS 文件的安排是采取树状的结构,所以是以根部(root)为出发点。info 执行 infoprogram,使用 infoprogram 的方法有二:
  • Ctrl-hi
  • ESC-xinfo
info  对於档案的编排,是以  Hypertext  的方法来处理所有的相关文件。当键入  ``Ctrl-hi''  或  ``ESC-xinfo''  后,会先进入  info  树状( tree )结构的最顶端。如下就是进入  info  时的第一个画面:  -*-Text -*- This is the file .../info/dir, which contains the topmostnode of the Info hierarchy. The first time you invoke Info you startoff looking at that node, which is (dir)Top. ? File: dir Node: TopThis is the top of the INFO tree This (the Directory node) gives amenu of major topics. Typing "d" returns here, "q"exits, "?" lists all INFO commands, "h" gives aprimer for first-timers, "mTexinfo" visits Texinfo topic,etc. --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topicfirst.) --- * Menu: The list of major topics begins on the nextline. * Info: (info). Documentation browsing system. * Emacs:(emacs). The extensible self-documenting text editor. * VIP: (vip).A VI-emulation for Emacs. * Texinfo: (texi.info). With one sourcefile, make either a printed manual (through TeX) or an Info file(through texinfo). Full documentation in this menu item. * Termcap:(termcap). The termcap library, which enables application programsto handle all types of character-display terminals. * Regex:(regex). The GNU regular expression library. * Cpp: (cpp.info). Cpre-processor. * Gcc: (gcc.info). GNU C Compiler --- an ANSI CCompiler developed by FSF. * Gzip: (gzip.info). GNU zip program ---an compress package developed by FSF. * Ispell: (ispell.info). Aspelling checker. * Libg++: (libg++.info). G++ libraries. * Gmake:(make.info). A make utility developed by FSF. * Bison: (bison.info).GNU Yacc. * Gawk: (gawk.info). GNU awk --- pattern scanning andprocessing language. * Gdb: (gdb.info). GNU debugger. * Info-stnd:(info-stnd.info). Stand along GNU info. * Makeinfo: (makeinfo.info).Program for producing *.info file from *.texi file. * Graphics:(graphics.info). A set programs for producing plot files and displaythem on Tektronix 4010, PostScript, and X window system compatibleoutput devices. * m4: (m4.info). m4 is macro processor, in the sensethat it copies its input to the output, expending macros as it goes.GNU m4 is mostly compatible with system V, Release 3 version. *Hyperbole: (hypb.info). GNU Emacs-based everyday informationmanagement system. Use {C-h h d d} for a demo. Include Smart Keycontext-sensitive mouse or keyboard key support, a powerful rolodex,and extensible hypertext facilities including hyper-links in mailand news messages. * Standards Coding Style:(standards.info). GNUCoding Style.  此时,出现在萤幕的第一列是标头( header ),它包含此结点( node )的基本讯息。表头所提供的讯息,最多可有五件事情:
  1. 结点所在的档案(File
  2. 结点的名称(node
  3. 此结点的下一个结点(Next
  4. 此结点的上一个结点(Prev
  5. 此结点的上一层结点(up
此时的画面,只显示了二件事情,是因为此画面为 info 树状结构的最上层。
在表头之下的资讯,是用来告知如何用 info 。它提供了五件事情,现一一说明。
  • h
  • 不知如何使用  info  模式者,可在进入  info  模式后,使用  info  的线上辅助说明。欲使用  info  的线上辅助说明,只要在进入  info  模式后,键入  ``h''  即可。此不只是一个线上辅助说明,还是一个教学指引。跟随著它的说明,即可明了如何使用  info  模式 .
  • d
  • ``Ctrl-hi'' 指令,会先进入 info 树状结构的根部。任何情况下,可键入 ``d'' 回到此根部。
  • ?
  • 想知所有与 info 有关的指令,只要键入 ``?'',就可以得知所有指令的全貌。
  • q
  • 欲离开 info,只要键入 ``q'' ,就可以离开 info 而回到先前的缓冲区。
  • mTexinfo< Return >
  • 这一个指令是用来使用 info 的 MenuItem。使用的方法如下:
    1. 键入 ``m'' 
    2. 键入所欲参考的文件名称,也可使用 completion 的功能来简化输入的工作。
    3. 键入 RET
    何为 MenuItem 会再解释。
在这五个指令之下的是,此结点可以使用的 MenuItem。使用者可以直接至所要参考的 Menu 之下,键入 ``RET''。此时, info 会将此Menu 的相关文件显示在萤幕上。使用 info 除了以上的指令之外,还有几个必需知道的指令。现介绍如下:
  • n
  • 将结点移至下一个与此结点相连的结点。
  • p
  • 将结点移至上一个与此结点相连的结点。
  • u
  • 将结点移至上一层的结点。
  • m
  • 以上结点间移动的指令,必需结点间有相连接的关系。若想做跨越的移动,这几个指令是无法做到的。此时,必需透过 Menu 来做夸越结点的文件阅读。使用 Menu 的方式有二:
    • ``mTexinfo''
    • 这种使用 menu 的方法,在进入 info 的第一个画面就可以看到了。此方法由三件事共同组成:
      1. 键入 是使用 menu 的指令。
      2. Texinfo 键入 时,minibuffer 会出现
      3. menuitem:  此时,可在其后输入所欲阅 的文件名称。所以, Texinfo  意指文件的名称。此时,就可以键入画面上以  ``*'' 为开头的名称。如果是刚进入  info  ,可使用的  Texinfo  名称有:  Info 、  Emacs 、  VIP 、  Forms 、  GNUS 、  CL 、  Gcc Cpp 、  Makeinfo 、  Info-stnd 、  Texi 、  Hyperbole 、  Octave
      4. RET
      5. 待文件名称输入完毕后,要按下  RET  ,以告知系统文件名称已经输入完成了,可以开始执行的动作了。
    • 直接键入 ``RET''
    • 如果在阅 某一个结点时,文件中出现以 ``*Menu:'' 为首的文字,就表示此列以下若有以 ``*'' 为开头的列,均为一个可以使用的 MenuItem 。此时,可以直接键入 ``RET'' 参考另一个结点的文件。
    使用  Menu  有些条件,就是所要使用的  Menu ,必需在此结点的文件中有明列出来的才可以使用。要使用其它结点的  Menu ,必需先到有要使用的  Menu  的结点,才可以使用它的  Menu 。  Menu  有其一定的结构。所有  Menu  的第一列,都是以  ``Menu:''  为开端。如下所示:  *Menu: The list of major topics begins on the nextline.  此列之后的所有列,只要以  ``*''  为开始的列,就表示一个可以使用的  item 。  MenuItem  的表示法如下所述:  *Info: (info). Documentation browsing system.  它主要由四个部份主成:
    • *
    • 每一个 MenuItem 都是以 ``*'' 为开头。
    • Subtopic:
    • ``*''  之后就是  Subtopic  的名称,再加上一个  ``:'' 。  info  就是根据此  Subtopic  找到所对应的结点名。此例子的  Subtopic  的名称就是  ``Info'' 。如果要以指令  ``m''  的方式,使用 MenuItem  所要给予的  Texinfo  的名称就是此  Subtopic  的名称。
    • nodename
    • 在  Subtopic:  之后就是所使用的结点名。一般为了使用上的方便,会尽可能的使用相同的  Subtopic  和结点的名称。若二者的名字相同时,在 Subtopic  后的结点名会省略而以两个  ``:'' 表示之。如  ``*Info::''
    • nodedescription
    • 结点后面的内容是选择性,它主要是用来概略描述此结点。
  • l
  • 如果想要回到前一个(last)所参考过的结点,可以使用指令 一步一步的往回走。
  • b
  • 指令 可以使游标移至文件的最前端。
  • SPC
  • 若文件太长可键入空白键( SPC)来卷动萤幕。
  • Ctrl-g
  • 任何时候想要取消所键入的指令,可键入 Ctrl-g

3.Emacs 的整合环境

前面不断的强调,EMACS 不只提供一个编辑的环境,而提供一个整合的工作环境。所以,在未进入本文的正题- EMACS 的编辑环境之前,先对 EMACS 的工作环境做一个简介。

EMACS 所能提供的工作环境如下
  1. EMACS 可执行 Shell 的指令。
  2. EMACS 可做为 DirectoryEditorDired)。
  3. EMACS 可以编辑、编译及除错程式。
  4. EMACS 具有编辑其它 host 上档案的能力。
  5. EMACS 可以列印档案。
  6. EMACS 具有年历、日记的功能(CalendarDiary)。
  7. EMACS 具有读 ManPage 的能力。
  8. EMACS 可以收发电子邮件(MailRmail)。
  9. EMACS 可以阅读网路上的电子布告栏(GNUS)。
  10. EMACS 具有 versioncontrol 的功能。
  11. EMACS 对於档案的处理,具有 Outline 的能力。
  12. EMACS 具有资料库的处理能力。
  13. EMACS 可以提供电子计算机的功能。
  14. EMACS 提供了娱乐的环境(game),让工作者可以暂时放下工作的压力。
  由以上的分析可知,只要进入 EMACS  的工作环境,就可以在其下完成所有的工作。所以 EMACS 的理想,是离开 EMACS 就是离开电脑工作的时候,因为它的最终目标,就是要完成一个以编辑器为轴心的作业系统。
  EMACS 所提供的这些功能,都是先唤起代表此功能的模式modeEMACS 的模式,分成主要模式 major mode与次要模式minor mode。每一次只能使用一个主要模式,而且必须要的。但一个主要模式可以搭配一个以上的次要模式。现在就来简述 EMACS 工作环境的功能,至於如何使用这些 EMACS的工作环境,本文就不多做介绍。

如何在 Emacs 中执行 Shell 的指令

EMACS 中有两种执行 shell 指令的方法:一种是进入shellcommand mode,另一种是进入 shellmode。二者都可以执行 shell 的指令,其最大不同之处是,进入 shellmode 的状态,执行 shell 指令的同时,仍可以切换到其它模式处理别的工作,但如果使用 shellcommand mode,就必须等指令执行完才可以做其它的事。 使用 shellcommand mode 时,使用者在萤幕的最下方输入欲执行的指令, EMACS 会开启一个名为``*Shellcommand output*'' 的视窗,将 shell 指令执行的结果显示在此视窗中.shellmode 则是执行一个 subshell,其输入与输出都是透过同一个缓冲区,所以输入与输出是在同一个地方,它不似 shellcommand mode,指令输入与结果的显示在不同的地方。 shellcommand mode 又可以有两种模式,一种就是很单纯的执行一个 shell 的指令;另一种是对某一特定区域的资料执行 shell 的指令。 shellcommand mode 容许执行的结果,直接输入到目前所使用的工作区内。有了如此的功能,使用者可以很轻易的将 shell 指令执行的结果,直接放入适当的位置,而不需另外从事剪贴的工作。要如何使用 EMACS 所提供的 shell 功能呢?以下是最基本的方法,至於高阶的用法则请自行参考 GNUEMACS所提供的 ``GNUEmacs Manual'' 

  1. shellcommand mode
    • ESC-!shell-command
    • 唤起 shellcommand mode
    • ESC- shell-command-on-region
    • 针对某一特定区域执行shellcommand mode 的 shell 指令。
    • (特定区域,是指缓冲区的某一范围(region)而言,所以此指令只是针对缓冲区的某一部分运作的资料,)
    • Ctrl-uESC-! 与 Ctrl-uESC- 在 ESC 前加上 Ctrl-u ,可以将 shell 指令执行的结果,输出到游标所在的位置。
  2. shellmode
  3. ESC-xshell\indexESC-x shell 是唤起 shellmode的指令。

有关目录的编辑方法

Dired 是专门针对目录来运作的编辑功能。进入Diredmode , EMACS 会根据使用者所指定的目录来列出其下的档案及次目录,此时可根据需要EMACS 对这些档案及次目录作些运作。 EMACS 所提供可操作 Dired 的种类如下:

  1. 可阅读、编辑 Dired 所列举出来的档案
  2. 操作 Dired 下的档案
  3. (a)在 Dired 可以删除(delete)档案此功能可以很容易的将EMACS 的备份档(其档名以 ~结尾)、暂存档(档名在两个 中间)或具某一特殊档名模式的档案删除。
    (b) 档案的拷贝
    (c) 档名的更新
    (d) 改变档案的 mode
    (e) 改变 giduid
    (f) 档案的列印
    (g) 档案的压缩、解压缩
    (h) 载入、编绎 EMACS 的 LISPfile
    (i) 可产生 hardlinks 与 symboliclinks
    (j) 可将档名换成大写或小写的英文字母
  4. 可在 Dired 中执行 shell 的指令
  5. 可使用 UNIX 的 diff 指令比较档案间的异同
  6. 可隐藏次目录
  7. 可使用 find 的公用程式来寻找档案
  以上所列举的就是Dired的功能,有人说它类似 PC 上的 PCTOOLS,读者是否有相同的感觉呢?

  进入 Dired 模式的方法很简单,只要键入
``ESC-x dired''即可。此时的minibuffer 会显示出如下的文字:
Dired(directory):
``:''  之后是目前所在的目录,此时可以修改目录名。确定所要使用的目录,按下  RET  后,系统会另开启一个视窗来显示此目录下的所有档案。之后就可以对这些档案做运作。  Dired  所使用的缓冲区是一个唯读( read-only )的缓冲区,所以  modeline  会出现二个  %%  来表示其为唯读的状态。如果要缓冲区的唯读状态改为可读,可以键入 Ctrl-xCtrl-q  的指令,将缓冲区的状态改变。运作此缓冲区有其特别的方法,因此对此缓冲区做编辑并无实质上的作用。以下就介绍运作  Dired  的方法:
  • 在 Dired 中删除档案
  • Dired  最基本的指令,就是将要删除的档案做上旗标( flag )之后,再将有旗标的档案删除。
    • d
    • 将游标移至所欲删除的档案列,键入 d。此列的最前方会出现 D,这就是删除的旗标。此时的游标会移至此列的下一列。
    • u
    • 若想放弃已定好的旗标,可以键入 使萤幕上的 消失。
    • x
    • 键入指令 只是将要删除的档案先做上旗标,并未真正执行删除的动作。只有键入 才会将所有做上旗标的档案删除。执行删除档案之前,会先询问是否真要删除的意见。此时如果回答 ``yes''则执行删除的动作,若回答 ``no'' 不执行删除的动作,但旗标依然存在著。
  • 在 Dired 中将多个档案同时做上旗标
    • -#
    • 键入 #,系统会自动将所有的自动储存的档案(auto-savefile)做上删除的旗标。
    • ~
    • 键入 ~,系统会自动将所有的备份档(backupfile)做上删除的旗标。
    • %dregexp RET
    • 将所有适合的 regularexpression 档案做上删除的旗标。
    • 所有做上旗标的档案要执行删除的动作,都必需执行指令 x
  • 在 Dired 中访问档案
    • fdired-find-file
    • 如果想要访问目前游标所在列的档案,只要在此列上键入 即可。此时,档案的内容会显示在原先显示 Dired 缓冲区的视窗上。使用此方法访问档案,就如同以 Ctrl-xCtrl-f 访问档案一样。
    • odired-find-file-other-window
    • 此方法也是用来访问档案,但与键入  有些不同之处。键入  后,所访问的档案会出现在另一个视窗上而游标也会移至所访问的视窗,显示  Dired  缓冲区的视窗并未消失在萤幕上。
    • Ctrl-odired-display-file
    • 此方法与键入  雷同,二者不同之处在於键入  Ctrl-o  后所访问的档案会出现在另一个视窗上,但游标不会移至所访问档案的视窗,依然留在显示  Dired  缓冲区的视窗上。
    • vdired-view-file
    • 此指令仅供流 档案之用,因为以此而开启的档案是唯读档案。
  • 将 Dired 的档案做上标记
    • mdired-mark
    • 将目前游标所在的档案做上标记 ``*''。如果给予数值引数,则做上标记的档案数目会依所给予的数目而定。
    • *dired-mark-exectables
    • 将所有的可执行档(executablefiles)做上标记 ``*,若给予数值引数。则会将所有做上标记的可执行档的标记取消(unmark)。
    • @dired-mark-symlinks
    • 将所有的 symbolicfiles 做上标记 ``*,若给予数值引数。则会将所有做上标记的 symbolicfiles 档的标记取消(unmark)。
    • /dired-mark-directories
    • 将所有为目录的档名,但除了 ``.'' 与 ``..'' 之外,均做上标记 ``* 。若给予数值引数,则会将所有做上标记的目录名称的标记取消(unmark)。
    • ESC-DEL markchardired-unmark-all-files
    • 消除所有以字元(character)( markchar)做为标记的记号。 如果给予数值引号,则在消除每一个记号时,会询问是否要消除记号。 回答 ``y'' 则表示要将记号消除,回答 ``n'' 则表示不要消除已做好的记号。若此时键入 !,则表示消除其余的记号不再询问意见。
    • cold newdired-change-marks
    • 使用此指令,可将原本以 old 为标记的记号,换成以 new 为标记的记号。
    • %m regexp RETdired-mark-files-regexp
    • 可使用regularexpression ,将具有某一类型的档案做上标记。
  • 在 Dired 中的运作方式,有几件事情必需注意:
    • 如果给予指令数值引数  时,此时指令所运作的档案是从目前游标所在的档案起往后算  个档案(包括游标所在的档案)。如果给予负数的数值,则往游标所在处之前算  个档案(包括游标所在的档案)。
    • 如果不给予任何的数值引数,则指令的运作范围会以做了标记的档案为主。
    • 如果不给予数值引数也不对任何档案做标记,则指令只对目前游标所在列的档案运作。
    • 所有运作 Dired 缓冲区的指令都是大写的英文字母,所有的指令都是使用minibuffer 来接收所需的讯息。
  • 以下就是运作 Dired 缓冲区的指令:
    • Cnew RET dired-do-copy
    • 拷贝档案。若有多个档案同时要拷贝,则引数 new 代表档案所要拷贝到的目录。若只拷贝一个档案,可利用此引数 new 将档案从新命名。
    • Rnew RET dired-do-rename
    • 更换档名。若有多个档案同时要换档名,则引数  new  代表档案换名称后所要放置的目录。若只有一个档案,此引数  new  代表更换的档名。当档名更换完毕,  Dired  缓冲区的档案名称会自动跟著更换。
    • Hnew RET dired-do-hardlink
    • 将档案标上 hardlinks 的标记。引数 new 代表 hardlinks所要连接的目录。若只有一个连接时,此引数 new 代表连结的名称。
    • Snew RET dired-do-symlink
    • 将档案标上 symboliclinks 的标记。引数 new 代表 symboliclinks 所要连接的目录。若只有一个连接时,此引数 new 代表连结的名称。
    • Mmidespec RET dired-do-chmod
    • 更改特定档案的模式(modepermissionbits)。此程式使用 chmod 的程式,所以式适用的引数。
    • Gnewgroup RET dired-do-chgrp
    • 改变特定档案的团体(group)为新的团体( newgroup)。
    • Onewowner RET dired-do-chown
    • 改变特定档案的拥有者(owner)为新的拥有者( owner)。
    • Pcommand RET dired-do-print
    • 列印特定的档案,可利用 minibuffer 输入列印的指令 command
    • dired-do-compress
    • 压缩或反压缩特定的档案。如果档案已被压缩则将其反压缩,反之则将档案压缩。
    • dired-do-load
    • 载入特定的 EMACSLisp 档案。
    • dired-do-byte-compile
    • 位元编译(bytecompile)特定的 EMACSLisp 档案。
  • Dired 在编辑远方档案与使用 ftp 的用法使用 EMACS 的远方编辑或使用 EMACS 来做 ftp 时,若只给予目录名,系统会进入 Dired 的模式。此时可使用运作 Dired 缓冲区的指令来操作所要的档案。至於何为远方的编辑会在下一节中讨论。

如何编辑远方机器上的档案

EMACS 除了提供了一般编辑器所具有的功能之外,它还提供了一般编辑器所有的功能,那就是编辑远方 host 的档案。 EMACS 编辑远方host 的档案,是使用了 ftp 的技巧,将所欲编辑的档案 ftp 到目前的 host 上,待编辑完毕再以相同的技巧,把档案 ftp 传回远方的 host 而已。往昔要编辑远方的档案只有两种做法,一是签入(login)到档案所在的 host 去,另一种就是以 ftp 的方法将档案先传回目前所在的地方,修改完再 ftp 回去。 RemoteEditing 也可以用到 ``anonymousftp'' 上,它可以进入远方的目录下,使用者即可根据需要挑选要 ftp 的档案。使用 remoteediting 的方法非常简单,在键入 ``Ctrl-x Ctrl-f'' ,再根据语法给予适当档名, EMACS 就会处理自行 ftp 远方 host 上的档案,其语法如下: Findfile:/host:filename host 是指远方 host 的名称, filename 是指存放在远方 host 的档案。例如: Findfile:/[email protected]:.login 就是编辑 host 为 ``gate.sinica.edu.tw'' 的机器,而使用者为 ``user1'',档案的名称为 ``.login'' 的档案。


程式的编辑,编译与测试

EMACS 是一个整合的环境,在提供程式编辑的同时,自然会提供一个可供程式执行的环境。以下就要谈谈 EMACS 可以为程式撰写者提供那些服务。 EMACS 对於不同的语言提供不同的编辑模式。 EMACS 提供的服务有程式内缩的安排、括号对应的提示、程式注解的安排、游标移动的方式与程式的删除等等。基本上,EMACS 是提供一个撰写程式的格式,只是此格式可根据使用者的需要而自行设计。 EMACS 选择适合的语言模式,是根据所编辑的档案名称附名来判断的。如附名为 .c 的 语言程式,EMACS 会自动给予 语言模式,而不需使用者自行处理。EMACS 提供的程式语言模式有 LISPSCHEMECC++FORTRANMAKEFILEAWK、 PERLICON 与 MUDDLE等。编辑好的程式可以直接进入 EMACS 的编译模式,不需离开 EMACS 到 UNIX 的 shell 下进行编译的动作。进入 EMACS 的编译模式很简单,只要键入 ``ESC-xcompile'' 即可。 EMACS 预设的编译指令是 make ,执行 ESC-xcompile指令的结果如下所示:

compilecommand: make -k  若要使用其它的编译器,只需在  ``compilecommand :''  的后面给予适当的编译指令即可,此指令与在  UNIXshell 下使用编译的方法完全相同。除了编辑、编译之外,程式撰写者还需要的功能是  Debugger  的提供。 EMACS  也提供了此项的服务。  EMACS 提供了四种  debugger ,分别为  gdb dbx xdb  与  sdb ,使用者可根据需来选择合适的  debugger 。此处,只将使用  debugger  的指令列举如下:
  • ESC-xgdb RET file RET
  • ESC-xdbx RET file RET
  • ESC-xxdb RET file RET
  • ESC-xsdb RET file RET



如何在 Emacs 中列印文件

除了以上的功能外, EMACS 还提供了列印的功能。 EMACS 的列印可针对个整缓冲区或某部份的区域列印,其相关的指令如下:

  1. ESC-xprint-buffer
  2. 列印整个缓冲区的内容。 EMACS  处理此工作的方法是先使用  shell  的  pr  指令,而后再使用  shell  的  lpr  列印指令。
  3. ESC-xlpr-buffer
  4. 此指令与上一个指令相似,只是不透过 pr 而直接使用 lpr
  5. ESC-xprint-region
  6. 与 ESC-xprint-buffer 相似,唯一不同之处在於,此指令只列印部份的区域。
  7. ESC-xlpr-region
  8. 与 ESC-xlpr-buffer 相似,唯一不同之处在於此,指令只列印部份的区域。

在 Emacs 中如何收发信件

在 EMACS 众多的整合功能中,信件收发的功能自然是不可或缺的。 EMACS 对电子邮件的设计却与一般的电子邮件系统背道而驰,它是在以编辑为前提的条件下来提供电子邮件的子系统;换言之,电子邮件为以编辑器为主导的一个子功能。 EMACS 所提供的电子邮件系统分成二个部份,一部分为发送信件( mail),另一部为收取信件( rmail);收取信件的同时也能发送信件,它的作法是使用发送信件的功能将信件发送出去。 EMACS 读取电子邮件,是将作业系统存放电子邮件的档案拷贝至 EMACS 自己的档案中,此档案名为 RMAIL, EMACS 在读取信件时会至此档(RMAIL)中读取所要的信件。 EMACS 如此设计档案的读取有它的理由,其理由如下:

  1. 作业系统存放电子邮件的格式不一,读取电子邮件的软体也是变化万千。EMACS 的 RMAIL 就是要将如此复杂的事情简单化。
  2. RMAIL 记录了信件所有的相关资料,但作业系统所提供的信件档案,并未有做如此详细的记录。
  3. 一般作业系统为了要确保信件读取时的安全性,必需经由一套繁杂的方法来保障信件读取的安全以及资料的不流失。  EMACS  RMAIL  所采取的措失就是既安全又简单。  RMAIL  的方法是,先把存於系统内的信件读出后,再拷贝至  RMAIL  的档案内,待一切就绪才将存在系统内的信件删掉。如此作的好处是,即使系统当掉只会使信件多做一份拷贝,也不会有流失信件的事件发生。
EMACS 对於发送信件与读取信件提供了许多有用的操作功能,读者可自行参考相关手册,此处只告诉读者如何进入送信件与读信件的模式:
  • ESC-xmail (发送信件)
  • ESC-x rmail (读取信件)

其它与 Emacs 相关的工作环境

EMACS 除了提供以上种种的工作环境境,还有其它的环境可以运用,现在让我们一一道来。

  • TheCalendar and the Diary
  • EMACS  的  CalendAr 与一般的月历功能相似。  Diary  更可以适时提醒使用者该注意的事情。进入  Calendar  的方法如下:  ESC-xcalendar Diary  的使用可以在进入  calendar  的模式中后,再来设定相关的资料。
  • ReadingMan Page from EMACS
  • 阅读 manualpage 的方法非常简单,其用法如下: ESC-xmanual-entry RET unix-command-name RET
  • ReadingNews with GNUS
  • 读送网路新闻为现今交换电脑资讯的重要媒体与管道, GNUEMACS 也提供了此一子系统,称为 GNUS.EMACS 的 GNUS 是将``.newsrc'' 档的内容显示出来,它的内容包括所有被订阅的(subscribe)的 newsgroups,以及未被阅读的文章。在 GNUS 中还可以看到或隐藏未被订阅的 newsgroups,并可以再订阅未订阅的 newsgroup 或取消订阅某一个newsgroup。当然 GNUS 也提供了可游走於各 newsgroups 间的指令。在 EMACS 中使用 GNUS这一个子系统只需键入如下的指令即可。 ESC-xgnus RET
  • versioncontrol
  • 管理原始档案(sourcefiles)也是EMACS 所提供了服务项目之一。功能。 versioncontrol 是一个套装软体,它可以记录一个原始档案 (sourcefile)所有改变的版本(multipeversions),它保留所有改变的记录且存放於一个档案中,对於每一版本重复的部份只会保留一分记录。versioncontrol 也会记录每一版本被创造、谁创造了它等等的相关资料。目前 EMACS 是透过 VC,来使用作业系统所提供的 RCS 或 SCCS 的 versioncontrol 软体。若作业系统提供 RCS, EMACS 会先使用 RCS,若无 RCS 则会使用SCCS。 EMACS 允许使用者自行决定使用 RCS 或 SCCS 的 versioncontrol。透过 EMACS 的 VC,所能使用的 versioncontrol 的功能并不多,它只提供最基本的 versioncontrol 的功能,但确是最常为人使用的功能。若想使用 SCCS 或 RCS 所提供的所有功能,就必须进入 EMACS 的 shellmode 中了。以下就来简介 EMACSversion control 的功能。EMACS 的 VC 提供的功能如下:
    • 将档案注册於 versioncontrol 之下。
    • 可将注册的档案从 versioncontrol 的控制中取出与放入。
    • 放入 versioncontrol 的每一个版本都可以随时取出。
    • 可比较任一版本间的异同。
    • 可将一组相关的档案,置於 versioncontrol 之下。
    • 可自行设计标头(versionheader),此标头可置於 versioncontrol 下的档案中。
    至於其它的 versioncontrol 功能,则必需进入 EMACS 的 shell 中直接使用 RCS 或 SCCS。例如,将数个版本合并、使用 help 协助使用 versioncontrol 等的功能,就从 EMACS 所提供的 VC 得到解答。
  • OutlineMode
  • 以 editor 为基石的 EMACS 当然少不了制作文章大纲的功能。 EMACS 的大纲模式(outlinemode)可以使文章的部份主体暂时隐藏起来,只呈现文章的大纲部份。如此一来,吾人不需维护一套为本文,另一套为大纲部份的两套系统了。因为,制作本文的同时就已经隐含了大纲的部份了。
前面已经将 EMACS 可以做的事以及它的特质都做了简要的介绍。以下就开始讨论 EMACS 的基本要素- 编辑功能。


4. Emacs 有关的议题

上一章简介了EMACS的整合环境,在讨论编辑之前,先介绍如何启动 EMACS与离开EMACSEMACS对於萤幕的安排如何;以及缓冲区与视窗在 EMACS中角色定位等等的问题。EMACS可用在text-only的终端机与Xwindow System 的视窗环境,但本文只针对text-only的终端环境来说明任何有关EMACS的介绍。

如何起动Emacs

  启动 EMACS 的方法非常简单,只要在 shell 的提示下键入 ``emacs'' 五个英文字就可以启动 EMACS 了。例如:
        $ emacs RET
启动EMACS 做了如下的启始(initialize)动作:
  1. 清除目前的萤幕,开始一个全新的EMACS萤幕。
  2. EMACS会在这个全新的萤幕,显示一些与EMACS有关的基本讯息。其中包括,目前使用的 EMACS版本、基本的线上辅助说明讯息以及有关 EMACS版权的相关资讯等等。
  3. 此时若不输入任何指令, EMACS 会在一段时间之后(约二分钟 ) 自动将萤幕重新清除成一个空白的萤幕。
  4. 若在萤幕自动重新清除之前键入指令,EMACS会根据所给予的指令来做适当的运作。
启动EMACS的方法,不需要给予任何的档名,只要输入emacs。因为EMACS是要建立一个能同时开启多个档案的编辑环境;更进一步希望开启的档案,能彼此共享一些讯息。所以,在键入 ``emacs''的同时,给予所要编辑的档名,就变得不实际了。

如何离开Emacs

知道如何启动EMACS,接下来就要探讨如何离开EMACS了。离开 EMACS的方法有两种,一种是暂时离开EMACSsuspendingEMACS),另一种是永远离开 EMACSkillingEMACS)。其使用方法如下(为求统一,以的各章节都先列出EMACSHotkey,其相对应的命令则列举在小括号内,若无Hotkey则直接列出其命令。要使用EMACS的命令,通常要在每个命令前加上Meta-xESC-x):

  • Ctrl-zsuspend-emacs
  • 暂时离开EMACS回到其上一层的状态,一般是回到shell的状态。若想回到 EMACS的状态,只要键入''%emacs'',则可以回到EMACS了。
  • Ctrl-xCtrl-csave-buffers-kill-emacs
  • 永久离开EMACS。以此方法离开EMACS,除了重新启动EMACS方外(即在shell的提示下键入emacs),没有其它的方法可以再回 EMACS了。
暂时离开 EMACS 意思是回到上一层的状态( parentprocess ),一般是指 shell 。使用者可以随时回到原先所启动的 EMACS 下,对於所使用的缓冲区、 killring 以及 undohistory 等相关资讯,仍保持与离开前相同的状态 ( 有关 killring undohistory 等相关资料会在以后的各章陆续提及。以 Ctrl-z(suspend-emacs) 指令暂时离开的 EMACS ,可以在 shell 的提示下,以 ``%emacs'' 回到离开前的 EMACS 下。有些系统或 shell 并不提供这种暂时离开的功能,此时只能永远离开 EMACS 而无法暂时离开 EMACS 了。
要永远离开 EMACS 则必需键入 ``Ctrl-xCtrl-c''(save-buffers-kill-emacs) ``ESC-xsave-buffers-kill-emacs'' EMACS 接收此指令后会展开如下的动作:
  1. EMACS会主动提醒使用者,储存所有修改过的档案。
  2. 当使用者对需要储存的档案做了适当的处理后, EMACS 对於所有仍在执行的 subprocess ,也会主动提醒使用者是否要结束它们。因为离开 EMACS 的同时也就是结束这些 subprocess 的时侯。
在永久离开 EMACS 前, EMACS 会再三的提醒使用者有关档案的储存与仍在执行的程式等等。因为,一旦永久离开 EMACS 之后,所有未存档或尚在执行的 subprocess 都会随之消失。 EMACS 对於所有未储存的档案与仍在进行的程序,会利用  echoarea   一一提醒遗忘它们的使用者。  echoarea   会提示需要储存的档案,同时也提供可处理这些档案的方法。所以  echoarea   除了显示要存档的档案名称外,还会在档名之后出现如下的讯息:( y,n, !, ., q, C-r or C-h )这些讯息提供,就是要让使用者对於档案或程序有适当处理的机会。现在就对这些讯息做一讨论。
  1. y
  2. 同意对 echoarea 所显示的缓冲区存档,并徵询对於其它档案是否存档的意见。
  3. n
  4. 放弃对 echoarea 所显示的缓冲区存档,但徵询对於其它档案是否存档的意见。
  5. !
  6. 同意对 echoarea 所显示的缓冲区存档,且对其它的缓冲区也一并存档,不再徵询其它档案是否存档的意见。
  7. .
  8. 同意对 echoarea 所显示的缓冲区存档,但对其它的缓冲区则不再徵询是否存档的意见,直接放弃其它缓冲区的存档,且离开此存档的状态。
  9. q
  10. 放弃存档的状态而不执行任何存档的动作。
  11. C-r
  12. 此指令可用来流 目前所要储存的档案内容,当离开此流 状态即回复存档的模式,系统会再度询问与存档有关的讯息。
  13. C-h
    对於以上的选项若有不明白的地方,可以此功能查阅其意思。

EMACS的萤幕安排

text-only的终端机启动EMACS时,EMACS会占据整个萤幕,此时的萤幕称为 frame。再一次的强调,本文只讨论text-only的终端机,至於 XWindow 的环境则不在讨论的行列中。

text-only的 frame 又由数个window所组成。启动 EMACS时,会产生二个预设的视窗,一个视窗用来输入一般的文件,在未有文件输入前先用来展示前面提到的EMACS版本、线上辅助说明以及有关版权等讯息;另一个视窗用来输入指令或是用做讯息的回应,称为minibuffer或 echoarea
若终端机提供反白的功能,在反白区域以上的地方是用来输入文件的视窗;反白区域以下的地方则是 minibuffer 或 echoarea。此反白的长条型则称为 modeline,它是用来描述输入文件视窗的一些讯息。现在就来谈谈组成 EMACS frame 的这三个部份。
有关文字视窗的部份,因为还牵涉到缓冲区的问题,现在先略过不谈,下一节再行讨论。现在先讨论与其有关的 modeline和位於 modeline下的minibuffer 或 echoarea
modeline   出现在每一个文字视窗的最后一列,其描述此视窗的相关资讯。  modeline   所描述的讯息如下 :--ch-Emacs: buf majorminor --pos-------------- 现在则分别解释其所代表的意义。
  • rl-h代表缓冲区的状态(何谓缓冲区会在下一节讨论)。
    • --表示缓冲区未被修改过。
    • **表示缓冲区已被修改过。
    • %%表示缓冲区为read-only的缓冲区。
    • %*表示read-only的缓冲区被修改过。
  • buf
  • 表示此视窗缓冲区的名称,一般即为所编辑的档案名称。
  • majorminor
  • 此缓冲区所有使用的模式(mode)都列举在此括号内。其中包括一个主要模式 (majormode)和数个次要模式(minormode)。EMACS允许一个缓冲区有数个次要模式,但只能有一个主要模式。
  • pos
  • 表示文件在视窗显示的情形。其表示的种类如下:
    • All
    • 如果资料很少可以一「幕」了然,则会以All来表示。
    • Top
    • 若资料无法一「幕」了然,但出现的位置在最前面,则以Top来表示。
    • 无法一「幕」了然的资料,出现的位置是在最尾端,则以Bot来表示。
    • nn%
    • 若资料出现的位置不在第前端也不在最后端,则以百分比来表示资料出现的情形。
介绍完了  modeline   ,现在来谈谈  echoarea   与  minibuffer 。在  frame  的最后一列,也就是  modeline   的下一列就是  echoarea 或  minibuffer   出现的地方。二者使用同一区位但所代表的意思却不相同。 Echoing 的意思就是将键入的字元在萤幕上回应出来。 EMACS 对於只有一个字元的指令并不会把它 Echoing 出来,例如 ``Ctrl-e'' 。对於多个字元的指令,只要在键入指令的时候给予稍许的停顿,  echoarea   就会把键入的指令回应出来。等第一次的回应产生时,再输入的部份就不需要再给予停顿的时间,其回应会在键入的同时立即产生。  echoarea   除了回应键入的指令,也会将指令所产生的讯息显示出来;错误讯息的显示也是利用此区域。
minibuffer 所使用的地方与 echoarea 相同。它本身也是一个视窗,是用来输入执行指令所需的引数(argument)。使用 minibuffer 的同时也会使用 echoarea
minibuffer   输入引数的地方,是在  echoarea   回应字串的 `` '' 之后。因为  echoarea   的回应是以 `` '' 的出现做为结束。换言之, `` '' 冒号之后就是  minibuffer   输入引数的地方。
例如,要访问一个档案,键入指令 ``Ctrl-xCtrl-f'' 时,  echoarea   会出现 Findfile: ``Find file'' 就是  echoarea   的回应字,而此回应字串以 `` '' 做为结束。所以 `` '' 之后,就是  minibuffer   的地盘了,也就是  minibuffer   输入引数的地方。
使用  minibuffer   时,游标会自动移至  minibuffer   所在处,当游标在  minibuffer   时,就表示可以输入引数了。若游标因为某些原因不出现在 minibuffer   的位置,此时可以 ``Ctrl-x o other-window) 使游标在视窗间移动,直到游标出现在 minibuffer 所在的视窗为止。若已在 minibuffer   的状态,但不想输入任何引数,此时可以 ``Ctrl-g keyboard-quit ) 离开  minibuffer 。输入 ``Ctrl-g'' 后,游标会移至其它的视窗。
minibuffer 也是一个视窗,所以可以从别的视窗移至此视窗; ``Ctrl-x o'' 的指令就是用来使游标在各个视窗间移动的。一般的 minibuffer都只有一列的高度,但有时一列的高度无法将资料显示完毕,此时的 minibuffer 就需要调整其大小了。至於如何将 minibuffer 的视窗做调整,就是下一节所要讨论的重点之一了。

Emacs的缓冲区与视窗

EMACS的缓冲区与视窗的关系密不可分,缓冲区是用来存放编辑文件的,但视窗却是用来显示缓冲区的文件。现在就来谈谈缓冲区和视窗。 缓冲区(buffer)是EMACS编辑文件时,暂时存放文件的地方。这个地方只用来暂时存放文件,要想永久保留这些文件,必需将暂时存放的文件储存起来,一般是使用硬碟来安置缓冲区的文件。

EMACS 中所做的任何事情,都是先暂放於缓冲区内。 EMACS 处理档案的方式,也是先将档案从硬碟中取出后,再放於缓冲区内。所以不论是删减、修改与新增文件,都是在缓冲区内进行,除非将缓冲区内的文件存回硬碟,否则硬碟的内容都不会因缓冲区内容的改变而改变。
文件未存回硬碟而离开EMACSkillEMACS),将永远消失。但 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-xCtrl-f RET''
  2. Findfile: ~/ filename
  3. Findfile: 处输入所欲编辑的档案后后,  echoarea
  4. 会出现如下的讯息:Autosave file is newer: consider M-x recovery-file
  5. 键入``Meta-xrecovery-file RET''
  6. 此时echoarea 会自动出现相对应的自动储存的档案名称,若愿意执行恢复的动作,只要直接按下 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-xset-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-hv RET''
    1. echoarea 处会出现Describevariable
    2. Describevariable: 后键入 auto-save-visited-file-name
    3. 萤幕上会另开一个视窗,显示如下的讯息:
    4. auto-save-visited-file-name'svalue is nil Documentation: *Non-nil says auto-save a buffer in thefile it is visiting, when
      practical.Normally auto-save files are written under other names.
  2. 键入``Meta-xset-variable''
    1. echoarea 处会出现Setvaraible:
    2. Setvariable: 后键入 auto-save-visited-file-nameRET
    3. echoarea 处会出现Setauto-save-visisted-file-name to value
    4. 此时可以利用在 `` '' 之后的  minibuffer ,输入变数的值。此变数的值不是肯定就是否定的。目前的值是 nil ,要改其值为肯定的可以输入 t
  3. 再以``Ctrl-hv'' 来检视变数设定的情形。
上一个例子是设定肯定与否定值的例子,现在来看看设定变数值为数字的例子。 auto-save-interval实际执行的过程:
  1. 键入``Ctrl-hv RET''
    1. echoarea 处会出现Describevariable
    2. Describevariable: 后键入 auto-save-interval
    3. 萤幕上会另开一个视窗,显示如下的讯息:
    4. auto-save-interval'svalue is 300 Documentation:
      *Numberof keyboard input characters between auto-saves.
      Zeromeans disable autosaving due to number of characters typed.
  2. 键入``Meta-xset-variable''
    1. echoarea 处,会出现Setvaraible :
    2. Setvariable: 后键入 auto-save-intervalRET
    3. echoarea 处会出现Setauto-save-interval to value
    4. 此时可以利用 `` '' 之后的  minibuffer ,输入变数的值。此变数的值为数字。目前的值是 300 ,使用者可根据需要输入适当的数字。
  3. 再以``Ctrl-hv'' 来检视变数设定的情形。
EMACS执行过程中所设定的变数值,只对目前所执行的EMACS有用,一旦离开此EMACS,所有的设定就恢复成原来的预设值。要想永久保留此设定的变数值,就必需将所设定的变数值储存在档名为 ``.emacs''(.emacs 档为EMACS的启始档,进入EMACS时会先执行此档内的指令,EMACS的设定也是根处此档而来的的档案中。因为启动 EMACS时,EMACS会先执行.emacs档,所有存於此档案的变数会被重新设定一次。
.emacs档中设定变数``auto-save-visited-file-name''``auto-save-interval''的方法如下所示:(setqauto-save-visited-file-name t) (setq auto-save-interval 350) 前已述及EMACS可以容许多个缓冲区的同时存在,既然如此,自然有其处理每个缓冲区的方法。现在就来看看EMACS如何处理缓冲区。
  • Ctrl-xb buffer RET switch-to-buffer)此指令用来选择不同的缓冲区,其预选的缓冲区是目前所使用的缓冲区之外,最近被使用过的缓冲区。此指令可以使用completion。使用此指令, echoarea 会出现如下的讯息:Switchto buffer: (default filename)若所要选择的缓冲区不是系统所预设的,可以利用 minibuffer 将所要选择的缓冲区名称键入。
  • Ctrl-xk buffername RET kill-buffer)此指令是用来删除 minibuffer 所显示的缓冲区。若只键入RET,则删除目前的缓冲区,否则,删除所输入的缓冲区名称。同样的,此指令可以使用 completion
  • Ctrl-xCtrl-b list-buffer)将目前 EMACS所使用过的缓冲区显示出来。以下的就是执行 ``Ctrl-xCtrl-b'' 时,视窗所显示的资料:

    MRBuffer

    SizeMode

    File

     

    --------

    ----

    ----

    ----

    .*chap4.tex

    17460

    LaTeX

    /home/usr/hsko/work/chap4.tex

    *%RMAIL

    8788

    RMAIL

    /home/usr/hsko/RMAIL

    **Buffer List* 241

    BufferMenu

     

    *scratch*

    0

    lispInteraction

     

    diary

    928

    Fundamental

    /home/usr/hsko/diary

    %*man ls*

    15420

    Man

     

    *Help*

    64

    Fundamental

     
    以上资料的每一栏位各有其所代表的意思,详述如下:
    • 栏位MR,标记缓冲区的状态,其可能的状态如下所示:
      • ``*''
      • 表示此缓冲区被修改过。
      • ``.*''
      • ``.''表示此缓冲区为目前被选择的缓冲区,``.*''表示此选用的缓冲区被修改过。
      • ``%''
      • ``%''表示此缓冲区为read-only的缓冲区。
      • ``%*''
      • 表示此read-only的缓冲区被修改过。
    • 栏位Buffer,显示所使用的缓冲区名称。
      • Buffer中的资料若为档案名称时,则表示缓冲区所放置的资料为一个档案。
      • Buffer 中的资料前后加上了 ``*'' ,则表示此缓冲区不是任何被访问的档案。
    • 栏位Size,显示缓冲区的大小。
    • 栏位Mode,显示缓冲区所使用的主要模式。
    • 栏位 File ,表示所访问档案的绝对名称。若缓冲区的资料不是来自访问的档案,亦即栏位 Buffer 的名字前后加上 ``*'' 时,则以空白表示。
  • Meta-xbuffer-menu
  • 此指令好似Dired\indexdired的功能,应用在缓冲区上。此指令可对列出来的缓冲区各别做运作。其运作内容包括,储存缓冲区、删除缓冲区、显示缓冲区以及编辑缓冲区等等。其实运作於 ``Meta-x buffer-menu'' 的指令同样也可用在``Ctrl-x list-buffer'' 上,只是使用 ``Meta-x buffer-menu'' 指令时,echoarea 处会显示出可运用的选项。其可运用的选项内容如下所示:Command:d, s, x, u; f, o, 1, 2, m, v; ~, %; q to quit; ? for help.现举较常使用的选项说明,至於其余的选项,使用者可键入``?'',来使用其所提供的线上述助。
    • d
    • 标示所欲删除的缓冲区。在 MR栏位的最前方会出现D。此时并未真正删除缓冲区,只是将要删除的缓冲区做上标记,直到下达执行标记的命令时,才会真正将标示 D的缓冲区删除。此执行的指令为``x''
    • s
    • 标示所欲储存的缓冲区。在 MR栏位处标示上S。此时并未真正做储存的动作,只是在要储存的缓冲区做上标记,直到下达执行标记的命令时,才会真正将标示 S的缓冲区存档。
    • x
    • 对做好标记的缓冲区,下达执行的命令。也就是对标示有D S的缓冲区,做执行的动作。
    • u
    • 将设好的标记取消。
    • f
    • 选择目前游标所在处的缓冲区。此时的视窗会将此缓冲区的内容显示出来、
谈完了EMACS的缓冲区,现在来谈谈与其关系密切的视窗。前已略述,进入 text-onlyEMACS,即进入一个frame。一个 frame 由数个视窗组成,每一个视窗显示一个EMACS的缓冲区,且一次只显示一个缓冲区的内容。
EMACS在任何时候,总有一个视窗为选择的视窗( selectedwindow)。此视窗所显示的缓冲区,则称为目前的缓冲区( currentbuffer.point(或称为游标)所在的视窗,就是 EMACS的选择视窗。EMACS是透过游标来示point所在的位置。所以说,若想要知道目前的选择视窗,观察游标所在的位置就可知道。
至於什麽是point呢?point就是用来标示目前所使用的视窗或缓冲区所在的位置。EMACS的每一个视窗,各有其所专属的点位置( pointlocation.每一个缓冲区也有属於它自已的点位置。每一个缓冲区或视窗point的位置,并不会随著视窗或缓冲区的改变而变动。换言之,point的位置会随时被记录下来,当再次访问其它的视窗或缓冲区时,游标仍会回到离开前的位置。所以,任何移动 point的指令,只会对所选择的视窗产生影响,对於其它视窗的 point是不会有任何影响的。EMACS下的每个视窗除了有各自的point外,也各自有其相对应的 modeline
EMACS视窗的大小是容许重新调整的。除了大小是可以调整的,一个视窗也可以再分成两个视窗。其分割的方法,可以做水平或垂直的化分。视窗的操作,除了分割视窗之外,也可以使游标在不同的视窗间移动;当然,将不需要的视窗删除也是基本的功能。现在就来看看与视窗相关的指令。
  • Ctrl-x2split-window-vertically)
  • 将一个视窗分成上下两个视窗。此时化分出来的两个视窗,分享著化分前视窗的缓冲区。换言之,此时两个视窗的缓冲区内容是一样的。因为共享著同一个缓冲区,所以改变其中一个视窗缓冲区的内容,也会改变另一个视窗缓冲区的内容。分割成两个视窗的好处之一是,可以编辑一个缓冲区,将另一个缓冲区作为参考的依据。
    • Ctrl-x^ enlarge-window)将目前游标所在的视窗拉长一列。此指令,只有在 frame 存在一个以上的视窗时才有效果。若只有一个视窗,此视窗就占据了整个 frame,此时自然就无多余的空间可以放大了。
    • Ctrl-un Ctrl-x ^ enlarge-windownn)与 Ctrl-x^ 指令相似。不同之处在於,此指令可以将目前游标所在的视窗拉长 n列以上。
  • Ctrl-x3split-window-horizontally
  • 将视窗分成左右两个视窗。此时的两个视窗依然拥有相同的缓冲区,所以,改变一个视窗缓冲区的内容,同时也会改变另一个视窗缓冲区的内容。
    • Ctrl-xenlarge-window-horizontally
    • 将目前游标所在的视窗拉宽一行。对 frame 存有一个以上的视窗才有效。若只有一个视窗,此视窗已经占据整个 frame 了,即使想放大,恐怕也爱莫能助了。
    • Ctrl-un Ctrl-x enlarge-window-horizontallynn )与 Ctrl-u指令相似。此指令可以将目前游标所在的视窗拉宽n行。
  • UsingOther Windows and Deleting Windows
    • Ctrl-xoother-window
    • 此指令是用来选择所欲使用的视窗。注意,此``o'' 是英文字的``o'',而非数字的``0''
    • Ctrl-x0delete-window
    • 将目前游标所在的视窗删除。提醒大家注意,此``0'' 是阿拉伯数字的 ``0''
    • Ctrl-x1delete-other-window)
    • 保留目前游标所在的视窗,其余的视窗全部删除。
视窗的大小是有限的,但缓冲区的内容却经常超过视窗所能显示的范围。接下来就是要告诉各位,如何在有限的空间中,以窥缓冲区的全貌。 想要在视窗的局限下,洞悉缓冲区的全貌,其最基本动作就是卷动萤幕。所谓萤幕的卷动,就是萤幕上下左右的移动。除了卷动萤幕之外,还需考虑萤幕的清除。在那些情形之下要清除萤幕呢?例如,远方送来的 message,在萤幕的显示久久不退; 系统送来的讯息也在萤幕上不会消失。这些情况的发生,都值得将萤幕做清除且重新显示的动作。以下就来看看这些相关的指令。
  • Ctrl-lrecenter)(清除萤幕)
  • 清除萤幕且重新显示萤幕。
  • 使萤幕上下卷动
    • Ctrl-vscroll-up)(向上卷动萤幕一列)
    • 向上卷动萤幕,且将目前萤幕的最后二列做为卷动后萤幕的前二列。  point   出现在萤幕的第一列。
    • Ctrl-un Ctrl-v (向上卷动萤幕n 列)
    • 萤幕向上卷动 n 列。若指定卷动的列数 n ,不超过 point 在此萤幕上所在的列数,卷动后的 point 仍会留在原处不动,否则 point   移至萤幕的第一列。
    • Meta-vscroll-down)(向下卷动萤幕一列)
    • 向下卷动萤幕,且将目前萤幕的前二列做为卷动后萤幕的后二列, point 出现在萤幕的最后一列。
    • Ctrl-un Ctrl-v(向下卷动萤幕n 列)
    • 萤幕向下卷动 n 列。若向下卷动的列数 n ,不超过 point 在此萤幕所在位置以下的列数, 卷动后的 point 仍会留在原处不动,否则  point   移至萤幕的最后一列。
    • Meta< beginning-of-buffer)(萤幕卷至缓冲区的最前端)
    • (beginning-of-buffer)将萤幕卷至缓冲区的最前端,point也移至第一列。
    • Meta> end-of-buffer )(萤幕卷至缓冲区的最尾端)将萤幕卷至缓冲区的最尾端,  point  也移至最后一列。
    • Ctrl-ESC-vscroll-other-window
    • 前面六个卷动萤幕的指令,都是针对游标所在位置的视窗而言,若要卷动其它的视窗,则必需使用 ``Ctrl-ESC-v''``Ctrl-ESC-v'' 指令是用来卷动游标所在位置下一个视窗的萤幕。所以,如果开启了两个视窗,可以使用此指令来参考非游标所在位置的缓冲区资料。此指令方便之处在於,可以省略移动游标的步骤,就可以卷动其它的视窗。 如果今开启了 AB二个视窗,游标在视窗A处,以``Ctrl-ESC-v'' 可以卷动视窗B。如果开启二个以上的视窗,``Ctrl-ESC-v'' 指令所卷动的视窗,就必需看那一个视窗最接近游标所在的视窗了。
  • 使萤幕左右卷动
    • Ctrl-x<scroll-left)
    • 萤幕向左卷动。
    • Ctrl-x>scroll-right
    • 萤幕向右卷动。
  • 上下移动游标
    • Ctrl-p或↑(previous-line
    • Ctrl-p可以使游标向上移动一列。若有设定功能键,则可以用来移动游标。
    • Ctrl-un Ctrl-p
    • 使游标向上移动n 列。
    • Ctrl-n或↓next-lineCtrl-n可以使游标向下移动一列。若有设定功能键,则可以用↓ 来移动游标。
    • Ctrl-un Ctrl-n
    • 使游标向下移动n 列。






5.Emacs的基本编辑指令

前面的四个章节已经把EMACS的环境与架构做了扼要的介绍,现在开始讨论 EMACS做为编辑器(editor)所能提供的服务。

如何载入档案与储存档案

使用编辑器最基本的需求,就是要能载入档案以便编辑。现在就先来看看 EMACS是如何处理档案的载入。EMACS载入档案的方法很简单,只要在键入"Ctrl-xCtrl-f" ,再利用 minibuffer 输入所要编辑的档名即可。档名的输入可以与 completion 相互搭配。键入 ``Ctrl-xCtrl-f'' 命令之,在 mininbuffer 处输入已存在硬碟的档案, EMACS会执行如下的过程:

  1. 产生一个新的缓冲区。
  2. 将所欲编辑档案的内容,拷贝至缓冲区内。
  3. 将缓冲区的内容显示出来,以便编辑。
  这整个事件的过程,在 EMACS 的编辑系统中称为「访问档案」( visiting file )。虽然载入档案的方法很简单,但仍有几件事情值得讨论的,现说明如下:
  • 键入 ``Ctrl-xCtrl-f'' 后,  echoarea   会显示目前缓冲区的目录,此时若编辑档案的目录与  echoarea   所显示的目录相同,可迳在其后输入档名即可。
  • 若档案所在的目录与目前缓冲区的目录不同,输入档名的方法有如下几种:
    • 档案在同一个机器上的做法:
      • 无视 echoarea 所显示的目录,由使用者重新输入档名。
      • 键入新档名的方法,是在  echoarea   显示目录的最后方键入 ``/'',``/'' 代表,忽略 ``/'' 之前面的路径,新的路径从 `` 的路径必须键入绝对路径( absolutefile name )。现举一实例说明。 Findfile: ~/work/emacs/emacs.tex 所要编辑的档案在 ~/work/doc/text.tex 此时输入正确档名的做法如下所示: Findfile:~/work/emacs/emacs.tex//~/work/doc/text.tex
      • EMACS 提供的删除功能,将不必要的字删除之后,
      • 再输入正确的资料.除非显示的目录与所欲编辑的目录相差无几,使用删除的方法才有意义,否则不如放弃所显示目录,重新开始新的生涯才是正途。至於如何删字,会在 5.2.5一节中说明,此处就不赘言。
所欲编辑的档案,不在目前所在的机器上的做法,如下所示:前已述及 EMACS 可以 FTP 的方式来编辑远方的档案,但 EMACS 是如何以 FTP 的方法来编辑远方 档案呢?想要编辑远方的档案,只要给予正确的语法, EMACS 就会根据其语法来决定是否要使用 FTP 来编辑此档案了。其语法很简单,只有 /host:filename 而已。如何来使用其语法呢? 由其语法可知,其语法是由四组元素所组成的字串,包括二组子字串( host filename )以及二个符号( / : )。在  minibuffer   处输入 / 后,紧接给予档案所在的机器名称( host ),在其后立即给予 ``:'' ,在 ``:'' 后则输入所欲编辑档案,整个访问档案的过程就完成。注意此四组资料间,不可以留有任何的的空白。现举一实例子来说明之。 Findfile:~/work/emacs.tex//[email protected]:~/work/text.tex
    • 键入``Ctrl-xCtrl-f'' 当 echoarea 显示出目前缓冲区
    • 的目录后,只给予 RET 而别无它物时, EMACS 以目前缓冲区所使用的档案为预设档案。
    • 键入 ``Ctrl-xCtrl-f'' 后,突然改变心意,想知此目录以外其它目录的档名,除了使用 ``Ctrl-xd'' (使用目录的编辑指令- dired )指令外,还可以利用现有的目录名称来得到想要的讯息。其作法是直接修改  echoarea   所显示的目录,直到所要的目录出现后,键入 RET ,此时会另开启一个视窗来显示出此目录下的所有档名。若想操作这些档案,其操作方式与运作 Dired 的方式相同。若对 Dired 的印象已经模 的人,请参阅 3.2 节。
以上是介绍档名的输入方式。在编辑资料的同时,是否可以轻易查得目前所在的目录? "Meta-x pwd" 指令可以满足这种需求。键入 "Meta-x pwd" 后, EMACS 会假借  echoarea 将目前所在的目录显示出来。
以上谈的都是EMACS输入档案的方式,但EMACS又是如何为其缓冲区命名的呢?其实使用者并不需要为缓冲区命名,因为 EMACS会自动给予缓冲区合适的名称。EMACS为缓冲区的命名,可以从 modeline上得知。
EMACS 命名缓冲区的方式是根据所键入的档案名称而来,它舍弃了所有的目录名称只保留编辑档案的档名。所以若全名为 ``/user/work/emacs.tex'' 的档案,其缓冲区的名称则为 ``emacs.tex'' 。除了将档案从硬碟直接载入缓冲区外,在编辑档案的同时,有时需要参考其它的档案,甚至需要引进其它的档案到目前所使用的缓冲区内。 EMACS ``Ctrl-x i'' 指令,就是让使用者能随时引进其它的档案到目前的缓冲区内。 ``Ctrl-xi'' ``i'' insert 的意思,相信了解意思后,对於该指令应有较深刻的印象,否则怎有知已知彼,百战百胜之说呢? 以下是 EMACS 有关档案载入指令的整理:
    • Ctrl-xCtrl-ffind-file
    • Ctrl-xiinsert-file
    • Meta-xpwd
文件编辑完后,最重要的事情就是要能将其保留下来。以下就来谈谈文件储存的方法。档案储存不外乎将缓冲区的内容以原名或易名存回磁碟;此储存方式可以选择一次存一个档案或一次存数个档案;最后的考量是存完档案后是否要直接离开 EMACS 。下面就来看看 EMACS 所提供的相关指令。
    • 存档但不离开EMACS
      • Ctrl-xCtrl-ssave-buffer
      • 将目前缓冲区的内容,存回磁碟中。存回的档案名称与缓冲区的名称相同 。此指令只对目前所使用的缓冲区做存档的动作。若缓冲区的内容未有任何的变动则 echoarea 会显示如下的文字:(Nochanges need to be saved
      • Ctrl-xCtrl-wwrite-file
      • 此指令与上一个指令相似,不同之处在於可以使用与缓冲区不同的档案名称存档。。换言之,可另行指定存回磁碟的档名。键入 ``Ctrl-xCtrl-w'' 后,  echoarea   会显示出目前缓冲区所在的目录, 此时,使用者可根据需要输入档名。若不输入任何档名只键入 RET ,系统仍会将缓冲区内的资料存回原先访问的档案中。此指令也只对目前所使用的缓冲区做存档的动作。
      • Ctrl-xssave-some-buffers
      • 此指令可用来储存所有被修改过的缓冲区。使用此指令时,  echoarea   除了显示档案名称外,还会在档名之后出现 ( y,n, !, ., q, C-r or C-h )这些讯息是提供给使用者做参考的。现在就告诉使用者这些讯息所代表的意义。
        1. y
        2. 同意对 echoarea 所显示的缓冲区存档,进一步徵询其它档案是否存档的意见。
        3. n
        4. 放弃对 echoarea 所显示的缓冲区存档,但徵询其它档案是否 存档的意见。
        5. !
        6. 同意对 echoarea 所显示的缓冲区存档且一并对其它的缓冲区存档,此时不再一一徵询其它档案是否存档的意见。
        7. .
        8. 同意对 echoarea 所显示的缓冲区存档,但放弃对其它未存档的缓冲区存档,且直接离开此存档的状态。
        9. q
        10. 离开存档的状态而不执行任何存档的动作。
        11. C-r
        12. 可以此指令流 目前所要储存的档案内容,当离开此流 状态即回复存档的模式,系统会再度询问与存档有关的讯息。
        13. C-h
        14. 对於以上的选项若有不明白的地方,可以此功能查阅其意思。
    • 存档后直接离开 EMACS
    • Ctrl-xCtrl-c save-buffers-kill-emacs )此指令容许用者在决定是否将缓冲区的内容存档后,立即离开 EMACS 。此指令实际上是先执行 ``save-some-buufers'' 的动作再离开 EMACS
讨论完了载入与储存档案的功能之后,相信已经迫不急待想要知道如何编辑一份心目中想要的文件。现在就是介绍如何编辑档案的时候了。

Emacs的基础编辑指令

编辑器做些什麽事呢?现在先谈谈编辑器的基本功能,至於编辑器的进阶功能则在下一章讨论。此处所谈的基本或进阶的功能,所指的都是 EMACS可以提供的功能,所区分的基本和进阶也只是为了讨论上的方便而已。

    所谓的编辑器就是用来编辑文件的器具。一张纸与一支笔,就可以满足文件的编辑,这也是最简单且最原始的编辑器。将纸笔产生文件的动作以电脑来代步,就是电子编辑器(以下简称编辑器)主要的功能,也是本文所要讨论的编辑器。
    文件的编辑不外乎文件的键入、游标的移动、文件的搬移与删除以及文件资料的找寻与取代等等。现将 EMACS可提供的基本编辑功能简列如下,其详细的用法会在以下的各节中一一叙及。EMACS所能提供的基本编辑功能如下:
    • 字元输入与显示在萤幕上的方式
      • 字元的显示方式,可使用插入法(insert)或覆盖(overwrite)的方法。
      • 除了一般的字元(ASCIICharacter)外,还可以显示特殊字元
      • SpecialCharacter)以及任何八进位超过200的字元。
      • 文件在萤幕上所能显示的范围。
    • pointcursor)的移动方式(move point
      • point 能左右移动一个或数个字元(character
      • point 能左右移动一个或数个字(word
      • point 能移至一列的开头或结尾
      • point 能上下移动一列或数列(line
      • point 的设定,使游标能上下移动至指定的栏位
      • point 的移动能以页为单位(page
      • point 能至萤幕的前端或尾端
      • point 能移至缓冲区的前端或尾端
    • 显示缓冲区大小与 point 所在的位置
    • 删除萤幕上所显示的文件
      • 向左或向右删除一个字元(character
      • 向左或向右删除一个字(word
      • 删除游标所在位置以后的所有文件
      • 删除一个区块的文件(region
      • 删除的文件可以再使用(yank
    • 文件的搬移与拷贝(moveand copy
编辑器具备以上的功能,就可以编辑出想要的文件。现在就来看看如何在EMACS所提供的编辑环境,来编辑出想要的文件。

Emacs中如何加入与显示文件

EMACS允许输入文件时,将资料直接输入在 point 所在位置的正前方,此方法称为 insertmode;或将输入的资料以覆盖的方式取代 point 所在位置的字元,此方法则称为overwritemode。现举一实例来说明 insertmode overwritemode 的异同。

    • 字串food, point 所在位置为d处,此时的状态为insertmode
    • 在 point 所在的d处键入t,原字串变为footd
    • 字串food, point 所在位置为d处,此时的状态为overwritemode。在 point 所在的d处键入t,原字串变为foot
EMACS对输入模式的预设值是insertmode,若想将模式转换成overwritemode,指令 ``Meta-x overwrite-mode RET'' 可满足此一需求。若想恢复insertmode,只需再使用一次``Meta-x overwrite-mode RET''就可以了。当输入模式转为 overwritemode 时,萤幕下方的modeline 会显示``Ovwrt''的讯息,用以提示目前是使用overwrite的模式。指令 ``Meta-x overwrite-mode''是用来转换insertmode overwritemode。在此前提下,原为insertmode ,经转换则为 overwritemode。反之,若原为overwritemode 则转换成insertmode
EMACSoverwritemode 只针对从键盘输入的文件有效,若文件不是从键盘输入,而是以别的方式产生的,则一律失去overwrite的效用。例如,拷贝而来的文件或以``Ctrl-x i'' 得来的文件,EMACS一律使用insertmode
除了insertoverwrite的显示方法外,EMACS还允许使用者输入一些从键盘上无法输入的字,那就是一些控制码和八进位超过 200的字元。要输入这些特殊的文字时,只要在这些字的前方加上 ``Ctrl-q''即可。例如,要输入分页码(formfeedASCIICtrl-Loctalcode 014),则输入 ``Ctrl-qCtrl-l'' 即可。此时萤幕会出现C此时萤幕会出现^L的符号。当输入文件的长度,超过EMACS视窗宽度所能显示的范围,EMACS对此情形的处理如下所示:
    • 若文件太长需要换列时,在换列处键入 RET ,其后的文字会自动转到下一列且以第一个栏位为新列的起始点。若其后没有文件而键入 RET ,游标会会停在下一列的第一个栏位。
    • 不理会文件是否会超过视窗的宽度,也就是不键入 RET 而继续输入文字。 EMACS 会自动在视窗的最后加上 ``\'' ,而将其余的文字移至下一列;若下一列还是无法显示出所有的文字,会在此列的最后再加上一个 ``~ 续将多余的文字移至下一列。 EMACS 就是不断重复如此的动作,直到所有的文字都能完全显示出来为止。所代表的意思与键入 RET 并不相同。键入 RET 表示重新使用一个新列;不键入 RET 而令 EMACS 自动加入所产生的文件,仍代表著同一列,只是这一列太长, EMACS 无法以其视窗的宽度来一次穷尽,必须分为数次来表示。
    • 不键入 RET ,也不使 EMACS 自动产生,而使超过萤幕宽度 的部份暂时隐藏起来。 EMACS 处理这种情形,是在视窗的最后加上一个 ``$'' ``$'' 表示其后的内容在视窗上暂时看不到,但仍安在缓冲区内。 EMACS 的基本预设是自动加入 ``\'' 。要使多余的文字隐藏起来,必须设定 ``truncate-lines'' 变数的值为正值。变数设定的方法请参考 4.4 节。 4.4 节曾谈过一个视窗可以分成左右二个小视窗,此视窗可以做水平的卷动,此情形下的视窗在处理太长的列时,就是将 truncate-line 变数的值设成正值,使超过宽度的文件隐藏起来。
前面所谈的都是「文字」的插入方式,但如何插入一个「非文字」的空白列呢?在编辑的过程中,若想在某列之前加入一个新列,只需将游标移至此列的最前端 ,随后再按下 RET 即可。此时 EMACS 会在游标所在处的前一列,加入一空白列。 EMACS 为何要将空白列加在游标之前而不是游标之后呢?因为将空白列加在游标之前,有一个最大好处,就是可以很轻易的在缓冲区的最前端加入一个空白列。 此时所键入的 ``RET'' ,代表著 newline 。若不键入 RET ,也可以 使用 EMACS 所提供的 Hotkey ,也就是 Ctrl-j(tex-terminate-paragraph) 来获得新的一列。

point的移动

文字的键入及显示是编辑过程不可或缺的。除此之外,移动游标到适当的位置,也是编辑过程不可缺的功能。现在就来看看在EMACS下如何移动 point 或可称为如何移动游标。移动 point 也就是移动游标,因为 point 是透过游标来显示的。所以在本文会将游标与 point 交互使用。游标移动不外乎以固定的单位,将其做上下左右的移动。此固定的单位可能是字元(character)、字(word)、列(line)或页(page)。现在就来x看看如何将游标以这些单位来移动。

    • 左右移动一或数个「字元」(character
      • Ctrl-fforward-char
      • 游标往前(右)移动一个字元。
      • Ctrl-un Ctrl-f
      • (Ctrl-un Meta-x forward-char) 游标往前(右)移动n个字元。
      • Ctrl-bbackward-char
      • 游标往回(左)移动一个字元。
      • Ctrl-un Ctrl-b Ctrl-un Meta-x backward-char
      • 游标往回(左)移动n个字元。
    • 游标左右移动一或数个「字」(word
      • Meta-fforward-word
      • 游标往前(右)移动一个字。
      • Ctrl-un Meta-f Ctrl-un Meta-x forward-word
      • 游标往前(右)移动n个字。
      • Meta-bbackward-word
      • 游标往回(左)移动一个字。
      • Ctrl-un Meta-b Ctrl-un Meta-x backward-word
      • 游标往回(左)移动n个字。
    • 游标移至一列的「最前端」或「最尾端」
      • Ctrl-abeginning-of-line
      • 游标移至一列的最前端。
      • Ctrl-eend-of-line
      • 游标移至一列的最尾端。
    • 游标上下移动「一列」或「数列」(line
      • Ctrl-nnext-line)游标向下移动一列。
      • 下移一列的游标其所在的水平位置,与移动前的水平位置相同。若游标在文件的最后一列时, Ctrl-n 会自创新列再移到此新列的第一个栏位。
      • Ctrl-un Ctrl-n(Ctrl-u n Meta-x next-line)游标向下移动n列。
      • Ctrl-pprevious-line)游标向上移动一列。
      • 上移一列的游标其所在的水平位置,与移动前的水平位置相同。若游标已在文件的第一列时,再使用 ``Ctrl-p'' 时 echoarea 会显示如下的讯息:Beginningof buffer
      • Ctrl-un Ctrl-p Ctrl-un Meta-x previous-line)游标向上移动 n列。
    • 上下卷动缓冲区
      • Ctrl-vscroll-up
      • 向上卷动缓冲区,且将目前视窗所显示的最后二列,做为卷动后的前二列,  point   出现在视窗上的第一列。 EMACS 如此做只是让使用者有一个承先启后的感觉罢了。
      • Ctrl-un Ctrl-v
      • 缓冲区向上卷动 n 列。数字 n 若小於目前  point   在此视窗所在位置的列数,卷动后的  point   位置,仍留在卷动前的同一列上;否则  point   移至视窗的第一列。
      • Meta-vscroll-down
      • 向下卷动缓冲区,且将目前视窗上的前二列做为卷动后的后二列,此时的  point   出现在萤幕的最后一列。
      • Ctrl-un Ctrl-v
      • 缓冲区向下卷动 n 列,若数字 n 小於 point   在此视窗以下的列数,卷动后的  point   位置,仍留在卷动前的同一列处。否则  point   移至视窗的最后一列。
    • 左右卷动缓冲区
      • Ctrl-x<scroll-left)缓冲区向左卷动。
      • Ctrl-x>scroll-right)缓冲区向右卷动。
    • 游标移至缓冲区的前端尾端
      • Meta<beginning-of-buffer)
      • 将游标移至缓冲区的最前端, point 也移至视窗的第一列。
      • Meta>end-of-buffer
      • 将游标移至缓冲区的最尾端,  point   也移至视窗的最后一列。
    • 页数的移动
    • 还记得讨论``Ctrl-q'' (quoted-insert) 时,提过分页的控制码。有了分页的设定,自然会有以页数做为移动游标的单位了。
      • Ctrl-x[ backward-page
      • 将  point   移至上一页分页指标( ^L )之后且紧邻 ^L 。若 point   已紧邻在 ^L 之后了,则会略过此 F ^L 之后了,则会略过此 ^L 到上一个 ^L 之后。
      • Ctrl-x] forward-page
      • 将  point   移至下一页分页指标( ^L )之后且紧邻 ^L 。若 point   已紧邻在 ^L 之后了,则会略过此 F ^L 之后了,则会略过此 ^L 到下一个 ^L 之后。
      • Ctrl-xCtrl-p mark-page
      • 以页为单位做上记号之后,再配合其它的指令对此页做处理。此指令类似 markregion 5.4 节会讨论其意思)。例如 Ctrl-xCtrl-p Ctrl-w 是将游标所在的那一页删掉。此指令可以配合 numericarguments 5.3 节会讨论其意思)使用。
除了以移动游标的方法来游走缓冲区外,EMACS还提供一个可以直接将游标移到指定的行列。所要到达的目的地,不论是以字元数或列数为移动的单位,其起算点都是以缓冲区的第一列第一个栏位为起算的标准。以下就是此方法的介绍。
    • Meta-xgoto-char RET
    • 键入此指令后再按下 RET echoarea   会出现 `` 游标移动的总字元数即可。再一次的提醒各位,字元的计算是以缓冲区的第一列的第一个字元为起算点。例如,在 ``Gotochar:'' 给予 100 的数字,则游标会从缓冲区的第一字元移动到第 100 个字元。
    • Meta-xgoto-line RET 键入此指令再按下 RET 后, echoarea   会出现 `` ,在其后输入想要游标移动的列数即可。再一次的提醒各位,列数的计算是以缓冲区的第一列为起算列。例如,在 ``Gotoline:'' 给予 100 的数字,则游标会从缓冲区的第一列开始往下移动 10 列。

    何谓数值引数

在上一小节 point 移动一文中不断的看到Ctrl-un ,它是什麽呢?它是 EMACS的数值引数(numericargument),但数值引数又是什麽的呢?


数值引数适用於所有EMACS的指令。它的用途可分成以下数类:
    • 对某一指令做重复执行的动作
      • 用法:Ctrl-un command
      • Meta-n command
      • 说明:
        1. n代表重复的次数;command代表要重复执行的指令。
        2. 若键盘提供Meta键(个人电脑可以使用ESC键),则Meta键是使用数值引数最方便的方法。
        3. n若为负值的数字,则表示以反方向运行指令。
      • 例子:
        1. n为正值
        2. Ctrl-u5 Ctrl-f Meta-5Ctrl-f 表示游标往前(右)移动5个字元。
        3. n负值
        4. Ctrl-u-5 Ctrl-f Meta-5Ctrl-f 表示游标往回(左)移动5个字元。
      • 重复动作四次
      • 用法:
      • 说明:
        1. Ctrl-u 后面所接的不是数字而是字元,它代表著一个 Ctrl-u 重复指令的动作为一个四的倍数。换言之,一个 Ctrl-u 执行四次,二个 Ctrl-u 则执行 16 次,以此类推。
      • 例子:
        1. Ctrl-uCtrl-f
        2. 表示游标往前移动4个字元。
        3. Ctrl-uCtrl-u Ctrl-f
        4. 表示游标往前移动16个字元。
    • 利用引数变数自动键入相同的「字元」
      • 用法:Ctrl-un char
      • Meta-n char
      • 说明:省略n与否,代表不同的意义
        1. Ctrl-u 后紧接著数字与字元,表示重复字元 n 次。
        2. Ctrl-u 后面不接数字而紧接字元,表示重复字元四次。
      • 例子:
        1. Ctrl-u10 r Meta-10r 则萤幕上出现10r
        2. Ctrl-ur Meta-4r 则萤幕上出现4r
    • 使用引数变数自动产生相同的「数字」的方法
      • 用法:Ctrl-un Ctrl-u n Meta-n Ctrl-u n
      • 说明: Ctrl-u 后面有二个 n ,第一个 n 表重复的次数,第二个 n 表重复的数字。第二个 n 之前一定要再给予一次 Ctrl-u ,若不给第二个 Ctrl-u ,系统会以为重复 nn 次。
      • 例子:Ctrl-u5 Ctrl-u 4 Meta-5Ctrl-u 4 萤幕上出现5 4Ctrl-u5 4 ,则系统以为重复54次。
数值引数的用途很广,且适用任何一个EMACS的指令,当需要重复执行某一指令的动作时别忘了它。有人说电脑最强大的功能之一,就是能不厌其烦的执行重复的事情。以下有关EMACS指令的介绍,不再特别强调numericarguments,但并不表示它就此而消失了,因为数值引数适合所有的指令,所以没有必要每次都重复强调。只需记得,需要时可随时使用numericarguments

如何得到与 point 有关的讯息

前面谈过EMACS移动 point 的方法,现在介绍探知 point 位置的方法。point 所在的栏位、列数与页数等讯息,可从整个或部份的缓冲区而得知。现在就开始讨论 point 位置。

    • Meta-xwhat-page
    • 告知 point 所在的页数与列数。若缓冲区没有以分页(^L)符号分页,则 point 所在的页数永远为第一页。若 point 在第一页的第 200列,其显示的讯息如下:Page1, line 200
    • Ctrl-xl count-lines-page
    • ``Meta-x what-page'' 用来告知  point   所在位置的页数与列数,但无法从中得知此页的总列数。若想知道某一页的总列数,必需靠 Ctrl-xl 来得知。此指令除了得知某页的总列数外,同时还知道  point   所在位置之前与之后的尚有的列数。使用此指令时,  echoarea   会出现如下的讯息: Pagehas 23 lines 20+ 4 )  echoarea   出现的第一个数字为总列数,括号内的二个数字分别代表 point   所在处之前与之后的列数。括号内的两个数是以 point   为分界点而得来的。所以当  point   不出现在某一列的第一个栏位时,括号内二个列数的总和会比总列数多出一列,因为  point   所在的列被重复计算了两次 . 此指令在决定如何分页时可以帮上大忙,因为可以轻易得知  point   前后的列数。
    • Meta-xwhat-line
    • 告知 point 在缓冲区的列数。若此时 point 在第200列,则 echoarea 会出现如下的讯息:
    • Ctrl-x=
    • 指出游标所在栏位的字元资料。这些资料包括字元的八进位码、字元所在的位置占整个缓冲区的比例(此比例以字元为基本单位)以及字元所在的栏位。例如以此指令来得知此 ``a''字元的资料, echoarea 会出现如下的资讯:Char:a (0141)point=23905of 38784 (62) column 19 临时想知某一字元的八进位,也不妨试试此法。
    • Meta-=
    • 用来得知某特定区域(region)的总列数与总字元数。至於如何设定区域会在 5.3节讨论。以此指令得知的结果如下所示:Regionhas 200 lines, 2000 characters
    • Meta-xline-number-mode
    • 以上所讨论的指令,只在使用指令时才会显示想要的讯息,讯息的出现是无法长存的。 基於此,EMACS提供了一个可使讯息永久存在 line的方法,那就是使用``Meta-x line-number-mode''。此指令可以在 modeline 上显示 point 所在的列数,直到离开此状态或离开此视窗才会消失。若想使每次进入EMACS都能显示列数,最好的方法是在 ``.emacs''档加上如下的叙述:(setqline-number-mode t) 如此一来,只要进入EMACSmodeline 会自动将列数显现出来。至於自动显示栏位的方法,目前的 EMACS尚未提供此服务。

    文件的删减

修改文件不外乎将原有的文件删除,再加入新的内容;或将现有的资料做重新的排列组合。现先讨论文件的删除部份,文件的重组就留待 5.4节再进行讨论。

EMACS中的删除有两种形式,一种是指文件的 killing,另一种则指文件的deletion。在EMACS中所谓的 killing 是指将文件从目前的缓冲区移到一个称为kill-ring kill-ring 为一个变数的地方去。文件在缓冲区中是消失了,但却储存在 kill-ring,variable这一个变数中。EMACS可以有许多的缓冲区,但却只有一个 kill-ring 的储存变数。也就是说,多个缓冲区彼此共享一个 kill-ring,而且也只有一个 kill-ringEMACS所设计共享的killing-ring的用意是让被遗弃的文件可以找回,而且各缓冲区彼此也可借由 killing-ring来建立一个互通的管道。所谓的互通就是把甲缓冲区的东西给乙,反之,也可把乙缓冲区的东西给甲。此模式在 EMACS中就是透过 killing-ring 来完成。因此,想从甲缓冲区中得到某些文件给乙缓冲区,只要将甲缓冲区的文件放入 kill-ring 中,乙缓冲区就可以至此共享的 kill-ring 中将文件取出。如此一来,就可以共享资源了。
另一种模式的删除,在 EMACS 中称为  deletion 。此种删除,并不将删除后的资料放入  kill-ring   中,而是将删除的文件遗弃。此种情形的删除是无法失物复得的。以  deletion   删除的资料,可以键入
Ctrl-xuundo)来找回。使用一次``Ctrl-x u,恢复前一个指令的景象;使用二次 Ctrl-xu,则恢复前二个指令的容貌,如此周而复始的使用 Ctrl-xu ,可恢复更改前的全貌。至於``Ctrl-x u'' 更详细的说明会在 5.5节进一步讨论。
前已说过,不放入 kill-ring 的指令称为 deletion 的指令。EMACS删除字元、空白字元以及空白列的指令都不放入 kill-ring 中的。具体说来就是,Ctrl-dDELMeta-\Meta-SPCCtrl-xCtrl-o 等指令。现就为各位说明这些指令。
文件的修改不是重组资料就是删减与新增资料,新增资料已论述过了,而重组资料即将在 5.4节登埸,现在就开始谈文件的删减。删除文件也不外乎删除一个字元、一个字、一行或一个区块;删除的方向可以选择左右删除的方式。现在就来看看如何以EMACS所提供的指令,来做删除的工作。此处将删减的指令分成 deletion 和 killing而大类。
    • 属於 deletion 的指令集
      • 删除「字元」(character)的方法
        1. Ctrl-ddelete-char
        2. 删除 point 所在位置的字元。
        3. DELdelete-backward-char
        4. 删除 point 之前的字元。此指令与 Ctrl-d为最基本的删除指令,只要耐心够,任何的删除都可以此二个指令完成。
      • 删除spacestabs的方法
        1. Meta-\delete-horizontal-space
        2. 输入资料时,常会不自觉的输入无意的空白( space )和 tab 。当合并上下列而为一列时,也常会出现 space tab 从中作梗。为此 EMACS 提供了 Meta-\ 的指令,让使用者可以很容易将不必要的 space tab 删除。当然其它的删除指令,也可以将不需要的 space tab 删除,此指令只是更方便删除 space tab 而已。 Meta-\ 可删除  point   前后所有的 space tab 。例如: abcdef g ,此时的游标在 f g 之间。键入了 Meta-\ 其结果如下所示: abcdefg
        3. Meta-SPCjust-one-space
        4. 删除  point   前后的 space tab 时,若希望留下一个 space tab 做为彼此的分隔,就必须使用 ``Meta-SPC'' 来完成了。例如: abcdef g ,此时的游标在 f g 之间。键入了 ``Meta-SPC 其结果如下所示: abcdef g
    • 属於 killing的指令
      • 删除「字」(word)的方法
        1. Meta-dkill-word
        2. 此指令往前(右)删除  point   所在位置的字。其所删除字的范围端赖  point   所在的位置而有不同。若 point   在一个字的第一个字元,则会删除此字;若  point   在此字的其它位置,则删除  point   所在位置及其之后的所有字元,包括 point   所在位置的字元。 例(一): Thisis a test. 游标若在 test 这个字的 t 处,使用此指令的结果如下: Thisis a . 例(二): Thisis a test. 游标若在 test 这个字的 e 处,使用此指令的结果如下: Thisis a t. 若想删除一个以上的字,可以使用 numericargument
        3. Meta-DELbackward-kill-word
        4. 此指令往回删除 point 所在位置的字。其所删除字的范围端赖 point 所在的位置而有不同。若 point 在一个字的第一个字元,则会删除此字之前的字;若 point 在此字的其它位置,则删除 point 之前的所有字元,但不包括 point所在位置的字元。 例(一): Thisis a test. 游标若在test这个字的t处,使用此指令的结果如下:Thisis test. 例(二):Thisis a test. 游标若在test这个字的e处,使用此指令的结果如下:Thisis a est. 同样的,回想一下numericargument 吧。
      • 删除列的方法
        1. Ctrl-kkill-line
        2. 删除列的指令。所删除列的范围,以 point 所在的位置为准则, 以 point 所在位置为起始点,以此列的结束为终点。被删除掉的文件会在视窗上留下一空白,若想将空白列也一并删除,必需再使用一次 Ctrl-k。此时的Ctrl-k是用来删除换列指令的控制码。
        3. Ctrl-xCtrl-odelete-blank-lines
        4. 编辑的过程中会不经意的加入许多空白列,此种情形常发生在缓冲区的最尾端。每按下一个 RET ,就输入了一个新列,但在缓冲区的尾端按下 RET ,此时所加入的新列并不易为人查觉。此指令可以将 point 所在位置「前后」的空白列删除只留下一列。当然并非一定要以此指令来删除空白, Ctrl-k 自然也可以用来删除空白列,也可以将空白列以删除区块的方式删除之,提供此指令只是方便满足使用者的需求而已。
      • 删除区块的方法
        1. *Ctrl-w(Kill-region) EMACS 允许删除某一特定的区块。要删除区块,必需先标示区块,此标示的动作称为 mark\。如何标示区块,就是下一节的主题。
EMACS对於被 killing而删除的资料,都是放在 kill-ring 中。 kill-ring 其实只是一个变数而已,所有 killing删除掉的文件,就是此变数的值。其已述及查阅变数值的方法,现不厌其烦的再论述一次:
    • 键入 ``Ctrl-hv'' 后,  echoarea   处会出现:
    • Describevariable: 后输入变数的名称, EMACS 会另开一个视窗来显示此变数的值。此时所要键入的变数名为 `` kill-ring ''
此节讨论 EMACS 编辑的基本指令,有了这些指令之后,编辑的工作就不是难事了。接下来各节则讨论其它的编辑功能。

何谓Yanking

killring 的内容取出的动作,称为 yank。 yank 除了可 yank 最新killing的资料,也可 yank 早先 killing的内容。现在就以二种不同的 yank 做为讨论的对象。将最新 killing的文件从 kill-ring中取出的方法很简单,只要使用 ``Ctrl-y'' 即可。但在 yank 时,一定要确保在 killing-ring 中存有被删除的资料。想要 yank 最新 killing之前的文件,就较为复杂了。所谓的较为复杂,只是多了一个移动指向 kill-ring 变数值的程序而已。因为 yank 指令所要yank 的内容,全视指标指向 kill-ring 的位置而定。此指标一般都是指向最新放入的文件。若想 yank 其它的内容,就必需先移动指标了。

移动  kill-ring   指标的方法是使用 ``Meta-y'' ( yank -pop) ,但在使用 ``Meta-y'' 之前,一定要先使用 ``Ctrl-y'' 。换言之, ``Meta-y'' 的使用,一定要紧跟在 ``Ctrl-y'' 之后。
``Meta-y'' 的运作是将指向 kill-ring 入口的指标,向前移动,再将``Ctrl-y'' yank 出来的资料,以此时指标指向的文件取而代之。 这就是为何使用``Meta-y'' 指令之前,一定要先执行``Ctrl-y''。以 ``Meta-y'' 来移动指标,并不会影响 kill-ring 变数值的内容次序。

如何在文件中做上标记

前面有些指令是专门运作区块的,如``Ctrl-x Ctrl-p'' ``Ctrl-w'' 等等。但什麽是区块呢? EMACS所言的区块,是指从标记(mark)处到 point 所在位置间的范围,此范围就是区块(region)了。换言之,区块的范围是指,标记所在位置之(包括标记所在位置本身)到 point之前(不包括 point 所在的位置)的所有文件。知道区块的定义,接下来就介绍如何定义区块了。

既然区块是指从标记处到 point的范围,自然设定区块也意味著设定标记和 point。设定 point的方法很简单,只要移动 point至目的地即可。此时的 point代表著区块范围的终点。至於设定标记的方法也不难,只要在想要设定标记的地方,输入以下的任一个指令即可。
    • Ctrl-@set-mark-command
    • Ctrl-SPCset-mark-command
所以设定区块的步骤如下所示:
    • 设定区块的始位置,也就是所谓的标记(mark)。
    • 可使用``Ctrl-@'' ``Ctrl-SPC'' 任一个指令来设定标记。
    • 设定区块的终结位置,也就是移动游标至区块的尾端。
在标记与 point之间的范围就是所谓的区块。
为何会提供二个设定标记的Hotkey呢?Hotkey是用来连结EMACS的命令,EMACS会将常用的命令给予一个Hotkey与之连结。此连结的Hotkey,常会受所使用的终端机而不同。因此有的终端机可以使用 ``Ctrl-@'',但有的终端机则必需使用``Ctrl-SPC''。更甚者,有的终端机却二者都无法使用,例如笔者以个人电脑模拟成的终端机,却必需键入 ``Ctrl-2'' 才能达到设定标记的效果。EMACS可以允许使用者重新设定所使用的 Hotkey,但这已经超过本文讨论的范围。如果无法使用以上任何一个 Hotkey,就使用命令
``ESC-x set-mark-command''
使用EMACS的指令(command)永远可以达到目的的。
EMACS的 point,是透过视窗上的游标来显示的。text-only视窗只有一个游标,所无法同时表示标记及 point。若想观测区块的来龙去脉,可以 ``Ctrl-x Ctrl-x''
exchange-point-and-mark
将标记与point做交换,从交换的过程可以观察标记与 point的位置。``Ctrl-x Ctrl-x'' 所能做的事,只互换标记与 point而已。
那些指令是使用在区块上呢?以下指令就是适用在区块上的。有些是曾经提过的,有些是将要谈及的,有些可只能只是列举出来并不会在本文中被讨论。
  • Ctrl-wkill-region
  • Ctrl-xr scopy-to-register
  • Ctrl-xCtrl-pmark-page
  • Ctrl-xCtrl-ldowncase-region
  • Ctrl-xCtrl-uupcase-region
  • Meta-xfill-region
  • Meta-xprint-region
接下来讨论与编辑有切身关系的搬移与拷贝。

文件的移动与拷贝

变换文件在缓冲区出现的位置称为搬移(在缓冲区的其它地方重复出现称为拷贝( Copy)。

前已论及放於 kill-ring 的文件,可在需要时拿出来使用,此动作称为 yank\indexyank 。使用 yank 的方法很简单,只要键入 ``Ctrl-xy''即可。使用此方法可将某特定区块的文件做「搬移」的动作,只是所需的步骤比较烦琐而已。首先将要搬移的文件重复以 ``Ctrl-x k'' 的指令,将其放入 kill-ring 中,再将 point 移至文件欲搬移的位置,以``Ctrl-y'' 将其 yank 出来。
「拷贝」一个区块的方法与「搬移」一个区块的方法累同,唯一不同是要执行二次 yank 。第一次使用 yank,是将删除的原文件再放回被删除的位置,第二次使用 yank 是做拷贝的动作,也就是将 kill-ring 的文件放入要拷贝的地方。
以上的方法当然可以用来做搬移和拷贝之用,但如要搬移和拷贝的文件有数十甚至数百数千列,岂不要重复 ``Ctrl-k'' 的动作数十甚至数百数千次。因为 ``Ctrl-k'' 基本上是删除列的指令,当然删除列的指令,可以配合numericargument。但在使用数值引数之前还必需确定所欲搬移或拷贝的确实列数,如此一来岂不使事情愈来愈复杂呢?所以,要搬移与拷贝文件最好的方法,就是使用标记与区块。下面所谈的是针对区块的搬移与拷贝的方法。
不论搬移或拷贝,只要触及区块的使用,首要之事就是先把区块标示出。区块定好之后,要搬移就以 ``Ctrl-w'' ,将整个区块删除之后,再以 ``Ctrl-y'' 将其  yank   出来。要拷贝则以 ``Meta-w'' 将区块的内容拷贝一份放在  kill-ring   中,尔后再以 ``Ctrl-y'' 将其  yank 出来。现说明搬移与拷贝的实际操作过程。
  • 不设定区块,以删列的方式,将文件一列列先删除后 , 再  yank   出来。此法可搬移与拷贝  kill-ring   内的文件。
  • 重复执行``Ctrl-k''(删除文件,可使用numericargument
  • Ctrl-y(将放置在killring 中的文件,yank 至缓冲区内。)
  • 若做搬移的动作,只需使用一次 yank
  • 若做拷贝的动作,则要使用二次的 yank
  • 以设定区块的方式,「搬移」区块的文字。
      • Ctrl-@(设标记,也就是设定区块的起始值)
      • 移动游标以便设定 point的位置(设定区块的终点)
      • Ctrl-w(删除所标示的区块)
      • 移动游标至要搬移的位置(确定文件搬移处)
      • Ctrl-y(将放置在killring 中的文件,yank 至缓冲区内。)
  • 以设定区块的方式,「拷贝」区块的文字。
      • Ctrl-@(设标记(mark)
      • 移动游标以设定 point的位置(设定区块的终点)
      • Meta-w(不删除标示区块的内容,将此内容拷贝至 kill-ring 中)
      • 移动游标至要拷贝的位置(确定文件拷贝处)
      • Ctrl-y(将放置在 kill-ring 中的文件,
      • yank 至缓冲区内。)
    为了更清楚搬移与拷贝后的真实结果,现举实例来说明。
    实例:现有二段文件,第一段文字是做搬移与拷贝用的,第二段文字是用来接收搬移后的文字。 第一段:标记设在第一列的 A 处,而  point 设在 B 的地方。 1111111111A222222222223333333333333333333333 4444444444444444444444 55555B5555555555555555 第二段:  point Y 00000Y00000000000000000000000000000000000000 0000000000000000000000 结果一、将第一段的文件搬移至第二段,搬移后的游标仍在 Y 处。 1111111111B555555555555555500000A22222222222 3333333333333333333333 444444444444444444444455555Y0000000000000000 0000000000000000000000 0000000000000000000000 结果二、将第一段的文件拷贝至第二段,搬移后的游标仍在 Y 处。 1111111111A222222222223333333333333333333333 4444444444444444444444 55555B555555555555555500000A22222222222 3333333333333333333333 444444444444444444444455555Y0000000000000000 0000000000000000000000 0000000000000000000000 执行搬移与拷贝的动作时, EMACS 所采取的一律是 insert-mode 。此时,即使设定为覆盖( overwrite-mode ),覆盖的效果也会暂时失效。
    区块的范围以标记( mark )为起始值,以  point 所在位置之前的字元做结束。所以,从以上的实例可以很清础的看到,搬移或拷贝之后的文件会包括标记所在的字元,但不会包含  point 所在的字元。搬移或拷贝的文件会出现在  point 之前,原先所有的文件会向后移动,此时的  point 仍在移动前的字元处。
    区块是以标记为开始而以 point为终点所构成的。标记与 point所在的列,可能包含所在列的一部分,其它区块所包含的列都是完整的一列。若搬移或拷贝的范围,为文件中某一个长方形的区域,那该如何来设定其范围呢?设定好的范围又该如何来操作呢? EMACS对於这种形状的区域有其它的处理方式,称为长方形的区块 ( rectangleregion)。
    设定长方形( Rectangle) 的方法与设定区块( Region )的方法是一样的,只是在理解上有所不同。长方形设定的方法,也是设定二个标记,此两个标记位於长方形相对的两个直角上。所以,设定了左上角,另一个标记一定要设在右下角;反之,如果设定了右上角,另一个标记就一定要在左下角了。。此所设好的长方形, EMACS 称为 rectangle 。长方形与区块的设定方法是一样,所以单从设定标记与  point 的方式,是无法辨识二者的差别的。要知是使用区块或长方形,只有等到使用运作於此范围的指令时才会知道。若是以删除长方形的指令将长方形的区块删除时,此时删除掉的长方形文件并不放在 一般的  kill-ring   中,而是放於别的地方。因为删除长方形的运作方式与删除区块的方式不同,所以将长方形删除后的内容,与放置区块删除后的内容分隔,以便管理。长方形运作的种类与区块运作的种类累同,可分为二大类,一类为删除与插入,另一类则专门用来处理空白。删除长方形可以采取摒弃的方式 ( Ctrl-xr d )或将其储存於某处( Ctrl-xr k) ,以利事后的  yank  (Ctrl-x r y ( yank -rectangle) 。删除掉的长方形资料的保存,只能保留最新删除的资料,所以只有最新删除掉的长方形资料,才可以被  yank   出来。
    长方形区块的运作种类,除了能将资料做删除与搬移外,还可以在文件的某处加入固定区域的空白。因为从事编辑时,常需要在某一区域加入一些空白( Ctrl-xr o (open-rectangle) 。例如在文件加上空白做为边缘( margin );制作图表时留些空白;或将某一区域的文件以空白取代( Meta-xclear-rectangle )等等。长方形的运作与区块的运作最大不同处在於,无法直接做拷贝的动作,若要拷贝必需先删除后再执行二次的  yank 。现在就说明长方形区域的用法。
    • 长方形区域的 yank 方法
      • Ctrl-@(设定长方形区域的第一个对角)
      • 移动 point至第二个对角处(设定长方区域的第二个对角)
      • Ctrl-xr kkill-rectangle
      • 删除设定好的长方形,以便 yank 使用。
      • 移动 point到要 yank 的地方。
      • Ctrl-xr yyank-rectangle
      • 将删除的长方形,从储存处取出。
    • 永远删除长方形的内容
      • Ctrl-@(设定长方形区域的第一个对角)
      • 移动 point至第二个对角处(设定长方区域的第二个对角)
      • Ctrl-xr ddelete-rectangle
      • 删除设定好的长方形区域。此删除不会储存在某一定地方。换言之,一旦摒弃此区域,就无法将其唤回,除非使用 undo的指令。
    • 在长方形区域内插入空白,原文件向前(右)移动。
      • Ctrl-@(设定长方形区域的第一个对角)
      • 移动 point(设定长方区域第二个对角)
      • Ctrl-xr oopen-rectangle
      • 填入空白在设定好的长方形区域内。此时区块内的文字会自动往右移动。使用 overwritemode,原有的文件也不会被加入的空白覆盖。
    • 将设定的长方形区域以空白覆盖
      • Ctrl-@(设定长方形区域的第一个对角)
      • 移动 point至第二个对角处(设定长方区域第二个对角)
      • Meta-xclear-rectangle
      • 将此长方形区块内的文件以空白取代。
    • 在设定的长方形区域内填充某一类型的字串。
    • 此方法常可用在程式的撰写或测试上。例如,测试``.emacs''程式时,常因测试的过程中,需要将设定做增减的工夫,使用此方法可以随时将测试条件做增减。
      • Ctrl-@(设定要填充字串的起点)
      • 移动 point至第二个对角处(设定要填充字串的终点)
      • 键入Meta-xstring-rectangle RET ,此时 echoarea 会出现
      • Stringrectangle: 利用 minibuffer 键入要填充的字串,即可将字串填入长方形区内。值得注意的是,此时长方形的宽度由字串的宽度来决定,Ctrl-@与 point只用来决定长方形的长度。

何谓Undo

EMACS中想要将已经做过的动作放弃,以恢复旧观。EMACS将其称为 undo,以下就介绍如何 undo

    • Ctrl-xuundo
    • Ctrl-\_undo
    以上两个Hotkey都是用来执行 undo 的指令。提供二个 Hotkey,是因为有些键盘并无明显使用``Ctrl-\_''的方法,为了弥补无法以一个字元达到 undo 效果的键盘,故另行提供``Ctrl-x u'' 给无法使用``Ctrl-\_'' 的使用者。
    EMACS所提供的 undo,可以连续恢复最近使用过的指令。 undo 的顺序是最新使用过的指令最先被 undo ,第二次使用 undo 则恢复第二新的指令,任何指令的输入(除了 undo 本身之外)都会使指令输入的顺序 重整, 这也同时影响 undo 的顺序。
    使用  undo   有一个限制,就是  undo   只能  undo   对缓冲区内容造成改变的指令。对於只是改变游标动作的指令,是无法以  undo   来恢复旧观。若所有修改过内容的指令,都以  undo   恢复原状后,再一次使用  undo   的指令, echoarea   会出现如下的讯息: nofurter  undo information 当使用了  undo   之后,还想要在 redo 这个已被  undo   的动作时,有一个技巧可以达成如此的效果。
    • 首先键入一个不会改变缓冲区内容的指令(如游标移动的指令),使原来
    • 存放指令的顺序因新指令的加入而改变。
    • 再使用一次 undo 的指令,就可以达到redo的效果了。
    现举一实例来说明此>视窗上现有的资料为:Thisis a test.
  • 如下为所执行的一连串指令,括号内表示所用过的指令:
    • 执行四次DEL,视窗显示如下的讯息:
    • Thisis a 所使用的指令集如下:DELDEL DEL DEL
    • 将游标至字元``i''处,视窗显示的讯息并无改变:
    • Thisis a 所使用的指令集如下:DELDEL DEL DEL
    • 键入Meta-d,视窗显示如下的讯息:
    • Thisa 所使用的指令集如下:DELDEL DEL DEL Meta-d
    • 键入Ctrl-xu,视窗显示如下的讯:
    • Thisis a 此时恢复最新被使用过指令``Meta-d''前的状况(Ctrl-xu 不为恢复的对象),也就是步骤二的情形。此时使用的过指令集如下: DELDEL DEL DEL Meta-d Ctrl-x u
    • 键入Ctrl-f,视窗仍出现与先前相同的讯息:
    • Thisis a 所使用的指令集则增加如下:DELDEL DEL DEL Meta-d Ctrl-x u Ctrl-f
    • 此时可以Ctrl-xu 恢复第一次 undo 前的状况,即步骤三的状况。视窗出现:
    • Thisa 因为记录指令历史的指标,此时己在第二个Ctrl-xu 处,但Ctrl-xu Ctrl-f 均不在 undo 的行列中,所以此时可以再恢复一次 Meta-d前的状况。所使用的指令集如下: DELDEL DEL DEL Meta-d Ctrl-x u Ctrl-f Ctrl-x u
  一般而言,每一个使用过的编辑指令都有一个与之相对应的  undo 记录。每一个  undo 的记录,都只对目前的缓冲区有效。有的指令需要一个以上的  undo 记录来完成  undo 的动作;有的指令会先汇集一群 undo 的记录,当使用  undo 时,会将此汇集的结果一次展现出来。例如,单一字元运作的指令,若每次使用  undo ,只恢复一个字元则非常的不经济,所以遇到此种情形,以集合体的方式处理是比较合理的作法。




6.Emacs 进阶编辑指令

前面的章节谈论 EMACS 的基本用法,现在讨论 EMACS 进阶的用法。现在先谈 EMACS 的搜寻 search 与字串 string 的取代功能。

文件的搜寻

搜寻特定的字串,并非 EMACS 所特有的功能,相信大多数的编辑器都具有如此的功能。但 EMACS 所采取的搜寻方法是,每键入一个字元就展开搜寻,EMACS 称此种方式的搜寻为 IncrementalSearch 。当然, EMACS 也提供非 IncrementalSearch} ,称为 NonincrementalSearch。 EMACS 对於所要搜寻的字串,仍是利用 minibuffer 来输入所欲搜寻的字串。此时,输入 minibuffer 的搜寻字串,若全由小写的英文字母(lowercase)组成,则 EMACS 在展开搜寻的行动时,不论字母是否有大小写的差别,会将所有与 minibuffer 具有相同英文字母的字串都找寻出来。例如在 minibuffer 处输入 abc, EMACS 会找寻abc、 AbcaBc、 abCABcaBCABC 等字串。所以在 minibuffer 处输入小写的英文字母,就表示所要找寻的字串包括大写的字母在内。如何直接找寻上述例子的 ABC,而不需经过 abcAbcaBc、 abCABcABC 等字串呢?欲达如此的效果,必需在 minibuffer 处,给予大写字母(uppercase)的字串。例如,在 minibuffer 处,给予 ABC 的字串,此时,缓冲区的内容若为abc、 AbcaBc、 abCABcaBCABC ,则会直接搜寻 ABC 。所以在 minibuffer 处输入大写的英文字串时, EMACS 所找寻字串的大小写,就会与minibuffer 字串的大小写完全一样。 此种对大小写极度敏感的作法,称为 casesensitiveEMACS 对於大小写出现的位置也有差别,现在就先来讨论 casesensitive 的问题。

  • minibuffer 的字母都是小写,则可能找到的字串,包含所有大小写的字串。原始文件:abc、 AbcaBc、 abCABcaBCABC 输入minibuffer 的字串: abcsearch stringabc、 AbcaBc、 abCABcaBCABC
  • minibuffer中的字母,若有任一个以上的字母是大写,则可能找到的字串,就如同 minibuffer 所示的一样。原始文件:abc、 AbcaBcabCABcaBCABC
    • 输入 minibuffer 的字串: Abcsearch stringAbc
    • 输入 minibuffer 的字串: aBcsearch stringaBc
    • 输入 minibuffer 的字串: ABcsearch stringABc
    • 输入 minibuffer 的字串: ABCsearch stringABC
  如果希望  minibuffer 输入什麽,缓冲区就找到什麽时,例如,在 minibuffer中输入 abc,所要找寻的字串就是 abc。此时就必需修改 EMACS ``case-fold-search'' 变数的值为 ``nil''。因为EMACS 对此变数的预设值是 t,它的意思就是使搜寻成为case sensitive。若将此变数改成非 case sensitive 时,在minibuffer} 输入 abc,就只会找寻 abc

  知道了 EMACS 对大小写的处理程序,现在就来谈谈  incremental searchnoincremental search。键入第一个字母至minibuffer 时,搜寻的序幕就展开,是为 incremental search。使用  incremental search时,当  minibuffer 
收到第一个搜寻字母时,搜寻行动就从游标所在位置向下开始搜索。此时的游标,会从原先游标所在位置移至其下第一个出现此字母的地方;当 minibuffer 出现两个字元时,游标也移至其下出现此两个字元的地方。当然,这些都必需要以缓冲区中有这些文字为前题,若找不到任何合适的文字时, echo area 会出现 ``Failing I-search:'' 的警示语。在 EMACS 

你可能感兴趣的:(Emacs User's Guide)