mirror of
https://github.com/beyondx/Notes.git
synced 2026-02-06 03:44:12 +08:00
430 lines
29 KiB
Plaintext
430 lines
29 KiB
Plaintext
Content-Type: text/x-zim-wiki
|
||
Wiki-Format: zim 0.4
|
||
Creation-Date: 2011-04-01T22:15:46+08:00
|
||
|
||
===== emacs =====
|
||
Created Friday 01 April 2011
|
||
|
||
====== 生活在 Emacs 中 ======
|
||
|
||
http://www.ibm.com/developerworks/cn/education/linux/l-emacs/index.html
|
||
|
||
===== 起源概述 =====
|
||
|
||
在本教程中,我们将很快地讲述许多知识。首先我们要讲 Emacs 是什么和它的起源。然后,我们马上开始讲该编辑器的使用:击键、命令、Emacs 环境和您起步所需的一些基本命令。我将为您展示添加和删除文本、剪切(kill)和粘贴(yank)文本的各种方法。
|
||
|
||
下一步,我们将介绍 Emacs 的光标移动系统。然后将讲搜索和替换功能。接着,我将向您展示 Emacs 对文件和缓冲区的作用。在结束本教程前,我将粗略地讲述只有在 Emacs 中才能找到的高级功能和额外的特性,包括模式、代码编写、连接和游戏。
|
||
|
||
在学完本教程后,您将舒适地在 Emacs 环境中工作,感受到通过它您所能得到的力量。我们开始吧。
|
||
|
||
===== Emacs 是什么? =====
|
||
|
||
根据 GNU.org 的描述,**Emacs 是可扩展的、可定制的、自我编制文档实时显示的编辑器。它提供真正的 LISP ― 平滑地集成进编辑器 ― 用于编写扩展并提供 X Window 系统的一个界面。**
|
||
|
||
曾有人说(恐怕不是完全在开玩笑)Emacs 能很好地完成太多的不同工作,以至于它快成为**不错的操作系统** ― 就缺一个象样的文本编辑器。
|
||
|
||
但认真地说:**Emacs 是一个健壮的可扩展的文本编辑环境**。它在设计时被加入很多很多东西,包括编译和调试界面、电子邮件、游戏和 Eliza。特别对于那些以写作或/和写代码为生的人来说,可以很容易地在早上启动几个 Emacs 会话,开始工作,一整天不运行其它应用程序,本教程故此得名:生活在 Emacs 中。
|
||
|
||
===== 起源和其它选择 =====
|
||
|
||
最初的 Emacs 是由 Richard Stallman 在 20 世纪 70 年代为在 Massachusetts Institute for Technology 的 Incompatible Timesharing System(ITS)而写的。最早在 1984 年发布的 GNU Emacs 也是才华横溢的 Richard Stallman 的杰作。GNU Emacs 可从 GNU.org 得到,授权方式是自由软件基金会(Free Software Foundation)的 GNU GPL(请查阅参考资料找到链接)。
|
||
|
||
GNU Emacs 有一个主要的“竞争者”― XEmacs ― 它是 Emacs 代码库的一个分支的结果。这个分支发生在很久以前,虽然用户界面的主要部分相同或很相似,但是下层的扩展和 LISP 代码是不兼容的。然而,两者之间的移植是可能的。
|
||
|
||
许多 Linux 分发版有这两种版本的 Emacs,根据出版者的选择,其中一个版本的安装优先于另一个。例如在 Debian 中,如果您选择安装 Emacs,Debian 将安装 GNU Emacs,Red Hat 7.2 也是这样。上一次我安装 Caldera OpenLinux 时,它默认为 **XEmacs**.
|
||
|
||
===== 开始学用 Emacs =====
|
||
|
||
==== Emacs 击键约定 ====
|
||
|
||
Emacs 自身的文档有独特的方式来描述用于定义操作的击键,如下:
|
||
|
||
C-<chr> == Ctrl + 字符,同时按。
|
||
M-<chr> == Meta + 字符,同时按。
|
||
|
||
但是,什么是 Meta?Meta 可以是一个专用键(有时这样标记),它可能是 Alt 键,它也可能在您系统所用的键映射表(keymap)中根本不存在。那没关系;Meta 有替代键,就是先按 Esc 键,再按后面的字符键(而**不是一起按**)。这样产生的结果和 M-<chr> 相同。
|
||
|
||
现在启动您的 Emacs(或 XEmacs)副本,让我们快点取得进展。第一步,在终端或控制台中输入 emacs practice1.text 。
|
||
|
||
|
||
===== 命令和键绑定 =====
|
||
|
||
Emacs 实现了一个版本 LISP,一种**线程语言**,用于构建它的**命令和扩展**。**所有的命令都有名字**,例如 Buffer-menu-bury、backward-char 和 forward-paragraph。尽管它们被有逻辑地排列和命名,但是在我当前的安装中它们的数量超过 1800 个,那需要输入很多。
|
||
|
||
这就是为什么许多命令要**和以 Ctrl 和 Meta 键开头的键组合绑定**的原因。调用一个有名字的命令的方法是先输入 M-x,再输入命令名。得到键绑定列表的长格式命令是 M-x describe-bindings。幸运的是它有一个键绑定:**C-h b**。
|
||
|
||
切换到列表窗口按 C-x o,递增的搜索按 C-s,切换回您的工作窗口按__ C-x o__,关闭除当前缓冲区以外的所有窗口按 C-x 1。试一试这些命令,看一看其中的一些 ― 大约共有 600 个键绑定。不要担心我们在这次短途旅行中用到的命令,我们到时候将在本教程后半部重访所有这些命令。
|
||
|
||
===== 第一指示 =====
|
||
|
||
===== 退出 =====
|
||
:我第一次使用 Emacs 时,我发现我迷失在文档中的某处或肯定不是由我自己打开的混乱的缓冲区中或其它什么地方。在那时,所有我所想做的就是退出系统,这样我可以重新再来,找出我在哪里错了。您可以输入以下击键序列来退出 Emacs: __C-x C-c__ 。
|
||
|
||
根据您在前面一屏看到的击键约定,它的意思是按 Ctrl + x,再按 Ctrl + c。如果您更改了任何打开的文件,那么 Emacs 将提示您,例如:
|
||
|
||
Save file /home/bilbrey/practice1.txt? (y, n, !, ., q,
|
||
C-r or C-h)
|
||
|
||
如果我做了我在乎的修改,我将对这样的提示回答 y 。如果按 ! ,就直接退出了,什么也没保存。
|
||
|
||
Emacs 启动后,打开现有的文件的方法是按__ C-x C-f __来查找文件并把它装入缓冲区。
|
||
|
||
另一方面,我常常想保存我已完成的工作再继续输入。保存我的工作再继续的击键组合是__ C-x C-s__。
|
||
|
||
|
||
===== Emacs 视图,第 1 部分 =====
|
||
|
||
所有的 Emacs 和 XEmacs 屏幕有三个主要的部分:**缓冲区、状态栏和位于底部的小缓冲区**。本教程的 XML 格式的版本出现在下图中。
|
||
|
||
|
||
===== Emacs 视图,第 2 部分 =====
|
||
|
||
前面一屏中的抓屏来自 GNU Emacs 的可使用 X 的版本。在那张视图中与仅有文本模式的版本(例如在控制台或终端窗口中)无关的部分是上部的 GUI 按钮菜单和可使用鼠标的滚动条(在多数情况下)。
|
||
|
||
主要的编辑窗口可被分割成两个或更多个窗口,这些窗口可以是**同一个缓冲区(文件)的视图,也可以是不同的缓冲区的视图**。请参阅 Emacs 中的窗口这一屏获取更多信息。
|
||
|
||
在起初的配置中,编辑窗口的底部分界处有一个**状态栏(也被称为模式栏)**。有多个可见窗口的时候,**每个窗口有自己的状态栏**。状态栏中有缓冲区中的文本是否被更改的指示器、与名字关联的文件名、模式(显示在前面抓屏中的是 SGML)、当前的行号和用全部文本的百分比来表示的**光标位置**。模式指示的是 Emacs 所认为的它正在工作的**文本的类**型并相应地修改菜单和功能。
|
||
|
||
抓屏中包含 [Wrote...] 消息的底部那行被称为**小缓冲区**。它被用来**显示输入了一半的命令和命令的运行结果**,有时还显示一点点帮助。
|
||
|
||
===== 常用文本操作 =====
|
||
|
||
==== 插入文本 ====
|
||
|
||
从某种重要意义上说,Emacs 是很容易的。无需进入插入模式或从任何特别命令模式中退出 ― 直接输入,您就已经在插入文本了。让我们在这里重申一件事:使用“保存缓冲区”命令尽早地经常地保存您的工作:C-x C-s。
|
||
您喜欢这样吗?这是本教程中最短最容易的一屏。现在深呼吸一次,我们将进入删除文本。
|
||
|
||
==== 基本的删除和撤销 ====
|
||
|
||
删除文本的方法有两种。在这屏中,我们将讲第一种:**字符删除**。您很可能已经习惯了单独字符的删除方式:使用 Delete 键或 Backspace 键。
|
||
|
||
在 Emacs 中,至少有一个击键和 Delete 等同:__C-d __删除**光标下(处)**的字符。撤销字符删除的方法是使用 __C-x u__ 命令或真正的速写,__C-___。对于多次撤销来说,后者更方便。现在练习一下这些操作从而开始您的手指在 Emacs 中的训练。
|
||
|
||
注意:我读过的有些文档指出 Delete 键应该向后删除(backspace 或和 ^H 等同的击键)而** C-d 替代了 Delete**。这取决于您的操作设置和终端配置。
|
||
|
||
删除的字符被保存在缓冲区中,只是用于撤销,您只能通过撤销删除后的所有更改来得到那些修改。用于**多字符区域**的更“高级”形式的删除被同时保存到另一个不同的结构中,我们接下来将学习它。
|
||
|
||
==== Emacs 剪切和粘贴,第 1 部分 ====
|
||
|
||
下面是您删除比较大的块时需要用的命令(它被称为“杀死”):
|
||
|
||
键绑定 操作(命令)
|
||
C-d delete-char
|
||
M-d kill-word
|
||
C-k kill-line
|
||
M-k kill-sentence
|
||
|
||
M-Delete backward-kill-word
|
||
C-x Delete backward-kill-sentence
|
||
|
||
C-k 的使用有一点窍门。使用一次后,**它剪切该行的文本但不包括换行符**。那需要再按一次 C-k。剪切段落的命令也有:**kill-paragraph 和 backward-kill-paragraph**,但它们没有键绑定。
|
||
|
||
那么您删除的东西到哪里去了?当然在__剪切环(kill ring)__里。__多次顺序的删除(例如重复几次按 C-k)作为一块进入剪切环__,这样很有用。在下一屏中,我们将学习存取那些数据。
|
||
|
||
==== Emacs 剪切和粘贴,第 2 部分 ====
|
||
|
||
它被称作剪切环的原因是它**存储了大于一个字符**的已删除文本。还有,它能按顺序被存取,从位于最后的最新的,到编辑会话期间第一个被删除的,接着又回到最近的。所以,从拓扑结构上说,它是环。
|
||
|
||
输入 C-y,粘贴最近的块。重复按 C-y 粘贴出的还是那块。
|
||
|
||
得到更旧的“剪切”的方法是先输入 __C-y__,您将看到最近的块。然后,输入__ M-y__,一步步遍历剪切环。每一步替换前面的粘贴。现在试一下 ― 确实很有用。
|
||
|
||
==== 通用参数 ====
|
||
|
||
键绑定为 __C-u __的命令 __universal-argument__ 可被用作许多其它操作的前缀,包括我在前几屏中给您讲的许多删除命令。
|
||
|
||
例如,输入 C-u 3 C-k 可删除三行。
|
||
|
||
若没有数字参数,__universal-argument 缺省为 4 次__。
|
||
|
||
|
||
==== 复习基本操作 ====
|
||
|
||
下面的表格是这章讨论的所有命令和它们的键绑定。看一看它们,确认您知道它们是什么。很快地练习它们,以增加对这些操作的熟悉。在练习前,通过在主窗口中输入来插入文本。
|
||
键绑定 操作(命令)
|
||
C-g (Esc Esc Esc) keyboard-quit 用来退出已启动的命令
|
||
Backspace backward-delete-char
|
||
Delete (C-d) delete-char
|
||
C-x u (C-_) advertised-undo
|
||
M-d kill-word
|
||
M-Delete backward-kill-word
|
||
M-k kill-sentence
|
||
C-x Delete backward-kill-sentence
|
||
C-k kill-line
|
||
C-y yank 等同于粘贴
|
||
M-y 遍历剪切环,必须跟 C-y
|
||
C-u, C-u N universal-argument,在命令前加上次数前缀
|
||
|
||
===== Emacs 中的光标移动 =====
|
||
|
||
==== 移动光标 ====
|
||
|
||
在 GUI 环境中运行 Emacs 意味着您可以使用鼠标或方向键(例如向上和向下的箭头以及 Home 和 End 键)在文档中移动光标。然而,我将回顾 Emacs 自身的移动方式,因为这是唯一保证能用的方法,不管您是在拨号线上的终端,还是通过控制台或 SSH 连接访问一台机器,还是任何其它方法。
|
||
|
||
它自身的键移动方式还有其它好处,那就是使您的手总放在键盘上,在属于它们的地方,不仅为了效率,也为了人体工学。当我在 GUI 模式中使用工具时,我发现键盘和鼠标间的环境切换使我失去 10% 的效率。
|
||
|
||
像前面那样启动 Emacs(输入 emacs practice1.txt ),接着在呈现在您面前的初试窗口中输入几行(或复制这屏)。
|
||
|
||
==== 小步子 ====
|
||
|
||
Emacs 光标移动 ―
|
||
|
||
==== 字符 ====
|
||
|
||
Emacs 有时用字符助记符来帮助您,使您的手指学会这些命令而无需有意识的努力。只要记住 Previous(向上)、Next(向下)、Forward(向前) 和 Back(向后)。每个的第一个字母是您的移动键。
|
||
|
||
__C-f __使光标向前移动一个字符,而 __C-b__ 使光标向后移动一个字符。注意这**包括换行**。__C-n__ 移到下一行,而 __C-p __使光标向上移动一行。可能的话,__垂直移动保持列不变__。然而,如果下一行或上一行比当前光标所在的列短,光标将自动移到新行的末尾。如果您继续移到更长一行,光标将回到新行中的“原来”那列。
|
||
|
||
|
||
Emacs 光标移动 ―
|
||
|
||
==== 词、行和句 ====
|
||
|
||
从词移到词时,Forward 和 Back 仍然指引您,但要用 Meta 键而不是 Ctrl 键。注意__词的定义是连续的字母和数字__。在词与词之间移动时,__标点符号被算作空格__。在我们学习它们时,每个命令都试用几次。__M-f__ 使光标向前移动一个词,而 __M-b__ 向后移动一个词。
|
||
|
||
当我们学习更多行操作时,助记符的帮助不再那么有用:“a”和“e”键分别表示头和尾。__C-a __把您带到当前行的第一列而 __C-e__ 把您带到行末。
|
||
|
||
在一句句移动时,我们至少仍能用同样的字符。输入 __M-a__ 把我们带回当前句子的开头(或前一句,如果光标开始时就在句首)。__M-e__ 以同样的方式相对于句末向前移动。
|
||
|
||
句子由标点(!?.)和回车或**两个空格**来定义。根据文本,结果并不总是真的一句句地移动,但有点象段落。
|
||
|
||
|
||
===== 大步移动 =====
|
||
|
||
Emacs 光标移动 ―
|
||
|
||
==== 屏幕 ====
|
||
|
||
一次移动一个屏幕是很有用的操作,下面是完成它的命令。__C-v __使文本向前滚动一个屏幕而 __M-v__ 则相反。为了方便,有**两行重叠**,使您更容易记住上下文。另外,输入__ C-l__(这是小写“L”)可以移动窗口,使当前光标位置处于窗口的中央。还可以用__M-r__在窗口中移动光标
|
||
|
||
最后,移到缓冲区的开头和末尾的击键如下:__M-< __把您带到开头,而 __M->__ 把您带到末尾。它们确实是 < 和 >,所以您需用 Shift 键。
|
||
|
||
光标移动注解
|
||
键绑定 操作(命令)
|
||
C-f forward-char
|
||
C-b backward-char
|
||
C-n next-line
|
||
C-p previous-line
|
||
M-f forward-word
|
||
M-b backward-word
|
||
C-a beginning-of-line
|
||
C-e end-of-line
|
||
M-a backward-sentence
|
||
M-e forward-sentence
|
||
C-v scroll-up
|
||
M-v scroll-down
|
||
C-l re-center
|
||
M-r ??
|
||
M-{ 段首
|
||
M-} 段尾
|
||
|
||
在测试文档中练习这些击键并一直用下去。我发现我必须在一段时间内**强迫自己不用光标键和鼠标**。通过把我的手指总是放在键盘的中央一行(asdf jkl;)并有意识地使用这些命令,我很快能容易地浏览每个文件的缓冲区。
|
||
|
||
===== 搜索和替换 =====
|
||
|
||
==== 递增搜索,第 1 部分 ====
|
||
|
||
递增搜索是 Emacs 中我喜欢的特色之一。当您开始输入时,它们马上开始匹配文本。它的好处是您常常不需要输入整个词就可以完成搜索。
|
||
|
||
标准的向前递增搜索是由 __C-s__ 命令启动的。从光标位置向后搜索是由__ C-r__(isearch-backward)命令来完成。有各种内部搜索命令可使用;您可以输入以下命令来得到全部描述:
|
||
C-h d isearch-forward
|
||
|
||
突出显示的包括递增匹配:向前匹配用__ C-s __和向后匹配用 __C-r__。还有,当您到达您的目标时,按 __Enter 或 C-g __来终止搜索。
|
||
|
||
==== 递增搜索,第 2 部分 ====
|
||
|
||
现在试用递增搜索。把光标移到练习文档的开头,再输入 C-s。提示符出现在小缓冲区中 ― I-search:。然后,慢慢地输入您想搜索的词的字母。随着您增加每个字母,突出显示区域在您的缓冲区中行进,显示您已输入部分的第一个匹配。在下面的屏幕片段中,您可以看到**第一个匹配在紫红色中,下一个可能的匹配在淡绿色中**。
|
||
|
||
==== 正则表达式搜索 ====
|
||
|
||
正则表达式搜索也是递增的但使用正则表达式来提供更强大的搜索功能。我不准备在本教程中讲正则表达式,但您可以找到很多不错的印刷的或在线的参考资料(请参阅参考资料)。
|
||
|
||
启动向前正则表达式搜索的方法是输入__ ESC C-s__(也就是,Esc 键,然后 Ctrl 键加“s”键)。类似地,向后搜索的方法是使用 __ESC C-r__。
|
||
|
||
例如,让我们假定由于奇怪的原因我的文本中的某处有 bartok 和 footok。我想找到任一个的最接近的实例,为此我可以只用一次正则表达式搜索而不是搜索两个再记下行号等。
|
||
|
||
现在,我可能输入
|
||
|
||
ESC C-r bar\|foo
|
||
|
||
它先匹配上面的 bartok。然后,随着我加上表达式的“或 foo”部分,该命令从搜索点开始重新检查,发现 footok 才是真正最接近的。现在,我可以用 C-r 或 C-s 来分别向后或向前递增搜索缓冲区中的各种 foo 和 bar。
|
||
|
||
==== 替换文本 ====
|
||
|
||
Emacs 中,替换命令有两种基本类型。第一种是**无条件替换**,它基于字符串或正则表达式规范。没有缺省的键绑定(由此我不得不得出结论它并不被认为是重要的),但它的使用方法是输入__ M-X replace-string__(或 __M-x replace-regexp__)。跟在后面的是目标字符串/表达式和替换字符串。替换是无条件的并且**仅从光标位置开始**向前替换。
|
||
|
||
第二个命令__ query-replace __的绑定键是__ M-%__(另一个需按 Shift 的击键)。您在小缓冲区中的提示符后输入目标和替换字符串后,每个匹配按顺序被突出显示,您会收到该采取什么操作的提示。按 ? 将显示各种可能的回答的全部列表。最常见的是:“**y”表示替换并继续,“n”表示跳过并继续,“q”表示退出,还有 ! 表示无条件替换剩下的全部匹配**。
|
||
|
||
在练习缓冲区中试用这些命令。
|
||
|
||
==== 搜索和替换总结 ====
|
||
|
||
下面的表总结了我们已讲过的 Emacs 基本搜索和替换功能。记住,您可以得到任何命令的详细帮助,不管它有没有键绑定,方法是输入 C-h d command-name 。
|
||
键绑定 操作(命令)
|
||
C-s isearch-forward
|
||
C-r isearch-backward
|
||
<find> search-forward
|
||
Esc C-s isearch-forward-regexp
|
||
Esc C-r isearch-backward-regexp
|
||
n/a replace-string
|
||
M-% query-replace
|
||
|
||
===== 缓冲区和文件 =====
|
||
|
||
==== 查找文件 ====
|
||
|
||
在 Emacs 中,文件并不是在磁盘上编辑。相反,被指定文件的副本被放入缓冲区,**所有的编辑在缓冲区中进行**;写回磁盘文件是显式操作。当您要把文件装入缓冲区进行编辑时,您“查找”它。输入__ C-x C-f __后在小缓冲区中产生如下的缺省提示符:Find file: ~/。按几次 Tab 键,得到**目录列表**,这样您就可以浏览到想要的文件(如下图所示)。然后按 Enter,把该文件读入缓冲区。
|
||
|
||
|
||
==== 自动保存、保存和另存为 ====
|
||
|
||
好消息 ― Emacs 确实包含**自动保存**选项,通过配置该选项可以把您的文件保存到指定的位置。例如,在我的配置中,本教程的自动保存文件的名字是 #Living_In_Emacs.xml#,它位于和原始文件相同的目录。其它配置有不同的命名约定和保存位置(常常是 /var/tmp)。Emacs 自动保存的__缺省值是在 30 秒空闲时间或 300 个输入事件后。__
|
||
|
||
在本教程的开头,我介绍了 save-buffer 命令:C-x C-s。把缓冲区内容另存为不同文件名的对应键绑定是__ C-x C-w__。路径/文件名提示符出现在小缓冲区中,可通过一对 Tab 击键把它展开为目录列表,就象查找文件。
|
||
|
||
注意,__使用 write-file 命令来另存后,缓冲区和新文件名相关联__。如果您习惯于保持原文件名不变的编辑器,那么将要费点功夫来适应。
|
||
|
||
|
||
==== 启动时的缓冲区 ====
|
||
|
||
使用多个缓冲区是很容易的。然而,Emacs 本身是一个文本应用程序,所以有一组命令用于切换缓冲区和查看它们。当 Emacs 不带文件参数启动时,有两个叫__草稿(scratch__)和__消息(messages)的初始缓冲区__。为了编辑,您打开的其它**缓冲区的命名是根据包含它们内容的文件名**。
|
||
|
||
草稿缓冲区的命名是适当的。它被用于**临时存储和快速 Emacs LISP 宏的开发和测试**。Emacs 退出时,它没被保存,所以别把您在乎的东西留在那。消息缓冲区包含**命令和后台活动的“系统级”输出**,如下面的摘录所示。
|
||
|
||
Loading sgml-mode...done
|
||
Auto-saving...done
|
||
Wrote /home/bilbrey/Documents/IBM/LIE/Living_In_Emacs.xml
|
||
Auto-saving...done
|
||
|
||
===== Emacs 中的窗口 =====
|
||
|
||
接下来,考虑 Emacs 中的窗口。第一步,您可以通过输入__ C-x 2 __来水平分割,从而得到当前缓冲区的两个视图(而 __C-x 3 __垂直分割它们)。这并不打开新缓冲区**,**因为那将是数据的独立副本。相反,它是**同一缓冲区的窗口**。
|
||
|
||
在可见窗口之间切换的键绑定是__ C-x o__,它绑定的命令是 other-window。它在可见窗口间循环。在学 Emacs 时,我常用这个命令来切入和切出帮助窗口。当我在写代码时需要经常在模块和头文件间转来转去的时候,它也很有用。
|
||
|
||
把您的窗口数目减为一的方法是输入__ C-x 1__,这将最大化当前包含光标的窗口并关闭其它窗口。
|
||
|
||
===== 使用中的缓冲区 =====
|
||
|
||
试验缓冲区的方法是先打开多个测试文件。然后使用命令__ C-x C-b__ 来列出所有的缓冲区。您的列表应和这相似:
|
||
|
||
MR Buffer Size Mode File
|
||
-- ------ ---- ---- ----
|
||
.* practice1.txt 490 Text ~/practice1.txt
|
||
test2.txt 1 Text ~/test2.txt
|
||
test1.txt 0 Text ~/test1.txt
|
||
* *scratch* 191 Lisp Interaction
|
||
* *Messages* 501 Fundamental
|
||
|
||
|
||
MR 列反映每个缓冲区的“改过(Modified)”和“只读(Read-Only)”状态。Buffer(名)、Size 和 File 就不必解释了(分别是缓冲区、大小和文件),我们将在本教程末尾讲 modes。切换到缓冲区列表窗口(使用 C-x o),然后把光标移到您想打开的新缓冲区的那一行,再按 Enter 来选择它。缓冲区列表在窗口中被换成所选的缓冲区。如果您愿意,您可以最大化该窗口。
|
||
|
||
另外,**有各种与缓冲区菜单有关的命令和相应的键绑定**。通过输入 C-h d Buffer-menu- 在窗口中列出它们,然后按 Tab 键来得到命令列表。对我来说最有用的是用于退出的__“q”__。但是它并不关闭打开的窗口。您需要自己做。
|
||
|
||
==== 再谈缓冲区 ====
|
||
|
||
如果您知道您的目的缓冲区的名字(我常常是这种情况),那么缓冲区列表的使用就没必要。先在小缓冲区中输入__ C-x b__ 以得到提示符,然后输入目的缓冲区的名字 ― 或至少输入足够的多,以致于能用 Tab 键来完成。按 Enter,把那个缓冲区在当前窗口中打开。
|
||
|
||
关闭(kill)当前缓冲区的方法是输入 __C-x k__。出现在小缓冲区中的第一个提示符确认被关闭的缓冲区的名字。如果该缓冲区的内容没被更改过,按 Enter 来关闭该缓冲区。否则,将有第二个确认,用于丢弃更改过的缓冲区,只能回答“yes”或“no”。
|
||
|
||
==== 复习:文件、缓冲区和窗口 ====
|
||
|
||
这一章要掌握的主要概念如下。
|
||
|
||
文件是磁盘上的实体。
|
||
缓冲区是文件中的数据的副本,可被 Emacs 编辑。
|
||
**窗口是缓冲区的视图**。
|
||
|
||
下表总结了前几屏中出现的命令。
|
||
|
||
键绑定 操作(命令)
|
||
C-x C-f find-file
|
||
C-x C-s save-buffer
|
||
C-x C-w write-file
|
||
C-x 2 split-window-vertically
|
||
C-x 3 split-window-horizontally
|
||
C-x o other-window
|
||
C-x 1 delete-other-windows
|
||
C-x C-b list-buffers
|
||
C-x b switch-to-buffer
|
||
C-x k kill-buffer
|
||
|
||
===== 简短的深入学习 =====
|
||
|
||
==== 模式 ====
|
||
|
||
__模式是在特定的内容类型的环境下 Emacs 特性的表达方法__。也就是说,缩进的表现在 C 源代码文件和在 HTML 文件中是不同的,在给您的老板的信中的表现也是不同的。每个缓冲区的__主要模式__显示在状态行上缓冲区名字的右边的括弧中。
|
||
|
||
有两种不同的模式类型:**主要和次要**。每次只有一个主要模式被激活,但它们**修改次要模式的解释**。例如,在大多数的代码编写中,缩进参照的仅是上一行。在 .txt 文档中按 Tab 键(文本模式已被自动调用),一个制表符被插入并显示为 8 列。
|
||
|
||
而在这个 XML 文档中,Emacs 缺省地调用 SGML 模式。在这里,按 Tab 键有效果的前提是上一行的开头有空格,在这种情况下,光标被放在上一行第一个不是空格的匹配的那一列,距离由空格字符填充,而不是一个制表符。
|
||
|
||
**缩进表现是次要模式的一部分**,它的活动由当前调用的主要模式来修改。模式还可以直接表现为语法突出显示的区别和文本被自动填充的方式的区别。
|
||
|
||
==== 再谈模式 ====
|
||
|
||
主要模式通常由 Emacs 根据**文件名**或(有时)**文件内容**来正确设置。您可以明确地设置缓冲区的模式,方法是输入 M-x 加有效的模式名。
|
||
|
||
例如,如果我打开一个叫 bob.txt 的文件,缓冲区会以** text-mode **打开它。为了转入 c-mode,我输入 __M-x c-mode__。根据消息缓冲区,这实际上为我调用的是 cc-mode 并在状态栏上显示为 C Abbrev)。
|
||
|
||
列出 Emacs 自动识别的所有主要模式的方法是输入 M-x describe-variable,按 Enter,然后在小缓冲区的提示符后输入 **auto-mode-alist**。一些我常用的模式包括文本、c 和 SGML,有时还用 LISP。
|
||
|
||
|
||
==== 编译代码 ====
|
||
|
||
看了模式列表后,您显然可在 Emacs 中做很多事。然而最重要的是,__Emacs 是程序员的编辑器__。在 Emacs 环境中,您可以编写代码、编译、调试和测试软件,还可以做其它事。在这里,我不准备讲所有的这些主题,但让我们假设我已用 C 语言写了一个典型的 Hello World 之类的程序。
|
||
|
||
当我输入该程序并把缓冲区存到磁盘上后,我输入 __M-x compile__,于是,在小缓冲区中出现这样的提示符:Compile command:,后面可能还有缺省值。我输入 __gcc -o hello hello.c__ 并按 Enter。一个编译窗口被打开,它包含如下的文本:
|
||
|
||
cd /home/bilbrey/
|
||
gcc -o hello hello.c
|
||
|
||
Compilation finished at Sun Mar 17 16:18:55
|
||
|
||
|
||
为了查看我的程序能否运行,我从 Emacs 中运行它:__M-! ~/hello__。在小缓冲区中,我的输出是:“Hello, World!”
|
||
|
||
|
||
==== Emacs 和 LISP ====
|
||
|
||
Emacs 这个名字有点象 Editor MACroS 的缩写。所以,Emacs 中的另一经常的代码编写体验涉及**在 LISP 的 Emacs 版本中设置变量和写宏**。__LISP 被嘲讽为“Lots of Insane Stupid Parentheses(许多神经病的愚蠢的括弧)”的缩写__,但它在很多方面是一门成功的语言,尤其是 Emacs。
|
||
|
||
Emacs 变量可在命令行中设置(如果您知道它们的名字和适当的值),设置方法是输入 __M-x set-variable__ ,然后在提示符后输入变量名和它的新值。您也可以__直接通过求它们的值来设置变量__。为此,我建议使用草稿缓冲区。从“LinuxDoc Emacs Beginner HOWTO”中借用一个示例(请参阅参考资料),让我们修改自动填充模式(即词语自动换行)的宽度:
|
||
|
||
__(setq fill-column 20)__
|
||
|
||
|
||
输入后,把**光标留在行末**,输入 __C-x C-e __来求表达式的值。在小缓冲区中结果是 20。测试它的方法是使用 __M-q(fill-paragraph)__命令来重新格式化文本的一个段落。
|
||
|
||
随着您学习的深入,您还可以编写实现新功能的代码。通过试验找到您喜欢的设置。然后,您可以把它们放在您的 ~/.emacs 定制文件中,以便今后使用。
|
||
|
||
|
||
==== Emacs 中的连接 ====
|
||
|
||
电子邮件和 Web 浏览工具已被构建到 Emacs 中。发送新的电子邮件消息的第一步是输入 __C-x m__。当您写完后,用 __C-x C-s__ 保存并发送您的消息。阅读邮件要稍稍复杂些。 参考资料 at the end of the tutorial Web 浏览的实现是通过把 URL 发送到外部的浏览器或直接在 Emacs 中运行象 Lynx 这样的文本模式浏览器。输入 __M-x browse-url-lynx-emacs __来调用 Lynx,输入 URL,就可以了。下面运行的示例是在一个终端模式 Emacs 会话中的电子邮件撰写和浏览。
|
||
|
||
==== 不停地工作,不能玩…… ====
|
||
|
||
当然,游戏已被构建到 Emacs 中,有“Towers of Hanoi”和“Life through a variant of Tetris”(tm),还有古老的“Adventure”的另一版本,如下面的清单所演示的:
|
||
|
||
E/W Dirt road
|
||
You are on the continuation of a dirt road. There are more trees on
|
||
both sides of you. The road continues to the east and west.
|
||
There is a large boulder here.
|
||
>look at boulder
|
||
It is just a boulder. It cannot be moved.
|
||
>climb boulder
|
||
You can't climb that.
|
||
...
|
||
|
||
|
||
甚至还有著名的 Rogerian 心理程序,Eliza,在早上三点,无论您怎样做都无法编译时,它能让您通过难关。输入__ M-x doctor __。它比任何 900 号码都便宜得多,是吗?
|
||
|
||
总结、参考资料和反馈
|
||
|
||
===== 把叉子插入其中…… =====
|
||
|
||
我们已完成!祝贺您漂亮地完成任务。我在很多年前学用 Emacs 时,我发现它有点……恐怖。我已尽力为您打下一个好的基础,使您掌握这个强大的编辑工具的概念和使用。
|
||
|
||
__使用 Emacs。在其中生活一段时间,学会喜欢它。像所有的复杂程序,您得花些时间才能完全理解它,但这种努力是值得的:您将熟练掌握一个最常见的 UNIX 编程实用程序并学会肯定适应市场的技能。__
|