摘要: *quickref.txt*    For Vim version 7.1.  最近更新: 2007年5月          VIM REFERENCE MANUAL    by Bram Moolenaar     &...  阅读全文
posted @ 2007-11-23 11:37 Dr.Magic 阅读(711) | 评论 (0)编辑 收藏
Emacs 快速指南.(查看版权声明请至本文末尾)

【注意:位于【】之间的内容是译注,比如本行,下同。】

Emacs 键盘命令通常包含 CONTROL 键(有时候以 CTRL 或 CTL 来标示)和
META 键(有时候用 EDIT 或 ALT 来标示)。为了避免每次都要写出全名,我们
约定使用下述缩写:

 C-<chr>  表示当输入字符 <chr> 时按住 CONTROL 键。
          因此 C-f 就表示:按住 CONTROL 键再输入 f。

 M-<chr>  表示当输入字符 <chr> 时按住 META(或 EDIT 或 ALT)键。
          如果你的键盘上没有 META 、EDIT 或 ALT 键,用下述方法也等效:
          先按一下 ESC 键然后放开,再输入 <chr>。我们用 <ESC> 来表示
          ESC 键。

重要提示:要退出 Emacs,请用 C-x C-c(两个连续的组合键)。下文中左边顶
行的“>>”字样用来提示你尝试键盘命令。比如:







>> 现在输入 C-v (查看下一屏文字)移动到下一屏。
   (别紧张,在输入字符 v 的同时注意要按住 CONTROL 键)
   从现在开始,每读完当前一屏你都需要这样做一次。

值得注意的是,当你从上一屏滚到下一屏时,中间会有两行的重复;这样做是为
了维持滚屏的连续性,方便你顺畅、连续地阅读。

用编辑器,开门第一件事就是学会在文字中移动。你已经知道了 C-v 可以向下移
动一屏,要往上移,请用 M-v (也就是按住 META 键,然后输入v,如果你没有
META、EDIT 或 ALT 键那么就先按 <ESC> 再按 v)。

>>  试试 M-v,然后再试试 C-v,来回遛几次。


* 小结(SUMMARY)
-----------------

以下命令在翻页浏览时相当有用:

        C-v     向前移动一屏
        M-v     向后移动一屏
        C-l     重绘屏幕,并将光标所在行置于屏幕的中央
                (注意是 CONTROL-L,不是 CONTROL-1)

>> 找到光标,留意其附近的文字,然后输入 C-l。
   找找光标在哪里,你会发现其附近的文字并没有变化。

如果你的键盘上有 PageUp 和 PageDn,也可以用这两个键来滚屏。不过使用
C-v 和 M-v 的效率要更高一些。


* 基本的光标控制(BASIC CURSOR CONTROL)
----------------------------------------

整屏的移动很有用,但是如何在文字中精确定位呢?

有几种方式可以选择。用方向键当然可以,不过更有效率的方法是保持双手位于
主键盘区,然后使用 C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方
向键是一样的,如下图所示:

                             上一行 C-p
                           n       :
                                  :
            向左移 C-b .... 目前光标位置 .... 向右移 C-f
                                  :
                                  :
                             下一行 C-n
n
>> 用 C-n 或 C-p 将光标移到上图的中央。
   按 C-l,整幅图会被显示在屏幕的中央。

“P N B F”四个字母分别代表了四个词,用这四个词记忆这些组合键会更容易:
P 代表 previous(上一行),N 代表 next(下一行),B 代表 backward(回
退),而 F 则代表 forward(前进)。这些组合键今后将与你形影不离。

>> 按几次 C-n 把光标往下挪到这里。

>> 用 C-f 把光标移动到这一行,然后再用 C-p 往上挪。
   注意观察当光标在一行的中央时 C-p 命令的行为。

每行文字都以一个“换行符”结束,“换行符”把行与行区分开来。文件的最后
一行也应该也有一个换行符(不过 Emacs 并不强制要求这一点)。

>> 在一行的行头输入 C-b。
   光标应该会移动到前一行的行尾,因为光标在回退过程中越过了换行符。

同样 C-f 也可以像 C-b 一样越过换行符。

>> 连按几次 C-b,感受一下光标的移动。
   然后按几次 C-f 回到本行的行尾。
   再按一次 C-f,光标会移动到下一行。

当你移动光标穿越屏幕的上下边界时,在边界外的文字会移动到屏幕内,这称为
“滚动”(scrolling)。滚动使得光标可以被移动到文字中的任何位置,并且还
不会让光标跑到屏幕外边去。

>> 用 C-n 将光标下移,一直越过屏幕边界,同时观察发生了什么变化。

如果你嫌一个字符一个字符地挪光标太慢,你还可以一个词一个词地跳。M-f
(META-f) 可以将光标往前移动一个词,而 M-b 则是往后移。【这里的“词”指
英文单词,对中文来说,则是指移动到下一个标点符号。】

>> 试试 M-f 和 M-b。

如果光标停在一个词的中间,M-f 会移动到这个词的末尾。如果光标处于词与词
之间的空白处,M-f 会移动到下一个词的末尾。M-b 的功能类似,只是方向相反。

>> 按几次 M-f 和 M-b,中间夹杂一些 C-f 和 C-b。
   你可以观察到 M-f 和 M-b 在不同位置上所表现出来的不同行为。

请注意 C-f 、C-b 和 M-f 、M-b 两对之间的类比关系。通常的惯例是:META 系
列组合键用来操作“由语言定义的单位(比如词、句子、段落)”,而 CONTROL
系列组合键用来操作“与语言无关的基本单位(比如字符、行等等)”。

类似的惯例在“行”与“句子”之间也同样适用:C-a 和 C-e 可以将光标移动到
“一行”的头部和尾部;而 M-a 和 M-e 则将光标移动到“一句”的头部和尾部。

>> 按两次 C-a,再按两次 C-e。
   按两次 M-a,再按两次 M-e。

想一想为什么重复的 C-a 命令会没有作用,而重复的 M-a 命令则会让光标不断
地回退到上一个句子。虽然这个类比规律并不严格,但是很自然。

光标停留的位置也可以称作“点位”(point)。或者干脆说,光标指示出了屏幕
上“点位”在文本中的位置。

这里对简单的光标移动命令做一个总结,其中也包括了整词和整句的移动:

        C-f     向右移动一个字符
        C-b     向左移动一个字符

        M-f     向右移动一个词【对中文是移动到下一个标点符号】
        M-b     向左移动一个词【对中文是移动到上一个标点符号】

        C-n     移动到下一行
        C-p     移动到上一行

        C-a     移动到行首
        C-e     移动到行尾

        M-a     移动到句首
        M-e     移动到句尾

>> 把上面所有的命令都练习几次,这些可都是最常用的命令。

这里还要介绍两个重要的光标移动命令:M-< (META 小于号)可以将光标移动到
所有文字的最开头;M-> (META 大于号)可以将光标移动到所有文字的最末尾。

注意,在大部分键盘上,小于号(<)需要用上档键(Shift)来输入,所以在这
些键盘上你应该用 Shift 键来输入 M-<,如果不按 Shift 键,你输入的会是
M-comma(META 逗号)。

>> 试一试 M-< ,移到本快速指南的最开始。
   然后再按几次 C-v 回到这里。

>> 试一试 M-> ,移到本快速指南的最末尾。
   然后再按几次 M-v 回到这里。

如果你的键盘上有方向键的话,也可以用它们来移动光标。不过我们有三个理由
推荐你学习 C-b 、C-f 、C-n 、和 C-p:(1)它们在任何键盘上都能用。(2)
当你熟练使用 Emacs 之后,你会发现用这些组合键比用方向键要快得多,因为你
的手不需要离开打字区。(3)一旦你习惯了使用这些组合键,你也可以很容易地
适应其它更高级的光标移动命令。

大部分的 Emacs 命令接受数字参数,并且对于多数命令而言,这些数字参数的作
用是指定命令的重复次数。为一个命令指定数字参数(也就是重复次数)的方法
是:先输入 C-u,然后输入数字作为参数,最后再输入命令。如果你有META (或
EDIT 或 ALT)键,那么还有另一种办法:按住 META 键不放,然后输入数字。不
过我们还是建议你用 C-u,因为它在任何终端机上都能用。这种数字参数也称为
“前缀参数”,意思是说这个参数是先于使用它的命令而输入的。

举例来说, C-u 8 C-f 会向前移动 8 个字符。

>> 为 C-n 或者 C-p 指定一个数字参数,这样你可以只用一个命令就把光标移动
   到本行的附近。

虽然大部分命令把数字参数解释为其重复次数,但是也有些命令例外,它们将数
字参数另做它用。比如有些命令(我们目前还没学到)仅仅将前缀参数作为一个
标志――只要给出有一个前缀参数,不管其值为何,它都会改变命令的功能。

而 C-v 和 M-v 则属于另一种类型的例外。当给定一个参数时,它们将滚动你指
定的“行数”,而不是“屏数”。举例来说,C-u 8 C-v 将屏幕向下滚动 8 行,
而不是 8 屏。


>> 现在试试看,输入 C-u 8 C-v。

这个命令应该已经将文字向上滚动了 8 行。如果你想将它再次地向下滚动,你可
以给定一个参数然后执行 M-v。


如果你正在使用一个窗口系统,比如 X11 或者微软的 Windows,那么在 Emacs
窗口的边缘应该有一个长方形的区域叫“滚动条”,你可以用鼠标操纵滚动条来
滚动文字。

>> 试着在“滚动条内的反白区域”上按一下鼠标中键。
   文字应该会滚动到鼠标所指示的位置。

>> 当按住中键时,试着将鼠标上下移动。
   你会看到文字随着鼠标的移动而上下滚动。
   【Windows 版本符合 Windows 程序的传统操作习惯,上述操作不适用。】


* 在 EMACS 失去响应的时候(WHEN EMACS IS HUNG)
-----------------------------------------------

如果 Emacs 对你的命令失去响应,你可以用 C-g 来安全地终止这条命令。C-g
也可以终止一条执行过久的命令。

C-g 还可以取消数字参数和只输入到一半的命令。

>> 输入 C-u 100 设定一个值为 100 的数字参数,然后按 C-g。
   现在再按 C-f,光标应该只会移动一个字符,因为你已经用 C-g 取消了参数。

如果你不小心按了一下 <ESC>,你也可以用 C-g 来取消它。
【这个说法似乎有问题,因为按照这个按键顺序输入的应该是 C-M-g。
  取消 <ESC> 的正确做法是再连按两次 <ESC>。】


* 被禁用的命令(DISABLED COMMANDS)
-----------------------------------

有一些 Emacs 命令被“禁用”了,以避免初学者在不了解其确切功能的情况下误
用而造成麻烦。

如果你用到了一个被禁用的命令,Emacs 会显示一个提示消息,告诉你这个命令
到底是干什么的,询问你是否要继续,并在得到你的肯定之后再执行这命令。

如果你真的想用这条命令,在 Emacs 询问你的时候应该按空格。一般来说,如果
你不想用,就按“n”。

>> 试试 C-x C-l (这是一个被禁用的命令)
   然后用 n 来回答询问。


* 窗格(WINDOWS)
-----------------

Emacs 可以有多个窗格,每个窗格显示不同的文字。后面会介绍怎么对付多个窗
格,现在我们先学会如何关掉多余的窗格。其实也很简单:

        C-x 1   只保留一个窗格(也就是关掉其它所有窗格)。

也就是先按 CONTROL-x 然后再按 1。C-x 1 会保留光标所在的窗格,并将其扩大
到整个屏幕,同时关掉所有其它的窗格。

>> 把光标移到本行然后输入 C-u 0 C-l。

>> 输入 CONTROL-h k CONTROL-f。观察当一个新窗格出现时当前窗格(用来显示
   CONTROL-f 命令的文档)是如何缩小的。

>> 输入 C-x 1 关掉文档窗格。

这个命令跟先前学过的命令不太一样,因为它包含了两个字符,以 CONTROL-x 开
始。有一系列命令都是以 CONTROL-x 开始的,这些命令许多都跟“窗格、文件、
缓冲区【缓冲区(buffer)会在后文详细介绍】”等等诸如此类的东西有关,其
中有些命令可能包含了 2 个、3 个或者 4 个字符。


* 插入与删除(INSERTING AND DELETING)
--------------------------------------

插入文字很简单,直接敲键盘就可以了。你能看到的字符,比如 A、7、* 等等,
都被 Emacs 视为文字并且可以直接插入。敲 <Return>(回车键)会插入一个换
 v行符。

你可以用 <Delback> 来删除最后输入的一个字符,这个跟你在 Emacs 之外的用
法应该一样。一般来说 <Delback> 就是位于 <Return> 键上方某处的一个大块头
的键,通常被标示为“Delete”、“Del”或者“Backspace”。

如果你找到了“Backspace”键,那么它应该就是 <Delback>;这时哪怕你又在别
的地方找到了一个“Del”键,那么它也应该不是 <Delback>。

一种更通用的说法是,<Delback> 将删除位于光标前的一个字符。

>> 现在就来试试――敲点字,然后按几下 <Delback> 删除它们。
   不用担心文件被修改,你做什么都没关系,这里就是专给你练习用的。

如果一行文字很长、超出了窗格的宽度,显示不下的部分会在紧邻的下一行继续
显示。这时会有一个反斜线(在控制台下是反斜线,如果你用图形窗口系统,则
应该是一个小小的转弯箭头)显示在右边沿,表明这是某一行的接续显示。

>> 输入文字,一直到屏幕的右边界,然后继续,你会看到一个接续行出现。

>> 用 <Delback> 删掉一些文字,直到此行长度小于窗格宽度,接续行就消失了。

换行符跟其它字符一样可以被删除。两行中间的换行符被删除后,这两行将会合
并成一行。如果合并后的这一行太长,超出了窗格宽度,它就会以一个接续行来
显示。

>> 移动光标到某行的开头并输入 <Delback>。
   这时该行将与其前一行一起被合并为一行。

>> 输入 <Return> 重新插入你刚才删除的换行符。

前面讲过,大部分的 Emacs 命令都可以指定重复次数,这其中也包括输入字符的
命令。重复执行输入字符的命令实际上就是输入多个相同的字符。

>>  试试 C-u 8 *,这将会插入 ********。

好,现在你应该已经掌握了最基本的的文本插入和修改功能,其实删除还可以
“以词为单位”进行,下面是一个关于“删除”操作的小结:

        <Delback>    删除光标前的一个字符
        C-d          删除光标后的一个字符

        M-<Delback>  移除光标前的一个词
        M-d          移除光标后的一个词

        C-k          移除从光标到“行尾”间的字符
        M-k          移除从光标到“句尾”间的字符

【可能你已经注意到了“删除(delete)”和“移除(kill)”的用词区别,后
文会有详细说明。】

注意“<Delback> 和 C-d”还有“M-<Delback> 和 M-d”是根据前述惯例从 C-f
和 M-f 衍生出来的(其实<Delback>不是控制字符,我们先忽略这一点)。C-k
和 M-k 的关系在某种程度上与 C-e 和 M-e 一样――如果把“一行”和“一句”
作一个类比的话。

你也可以用一种通用的办法来移除缓冲区里的任何一部分:首先把光标移动到你
想要移除的区域的一端,然后按 C-@ 或 C-SPC(任一即可,SPC指空格)【注意,
C-SPC 往往被中文用户设定成输入法热键,如果这样,C-SPC 就被系统拦截而无
法传递给 Emacs 了,因此这里还是推荐使用C-@。】,然后将光标移动到另一端,
再按 C-w 就可以把位于这两点之间的所有文字移除了。

>> 移动光标到上一段开头的“你”字。
>> 输入 C-@ 。Emacs 应该会在屏幕的下方显示一个“Mark set”的消息。
>> 移动光标到第二行中的“端”字。
>> 输入 C-w,从“你”开始到“端”之前的文字被全部移除。

注意,“移除(kill)”和“删除(delete)”的不同在于被移除的东西可以找回
来,而被删除的就不行了。【实际上,移除掉的东西虽然看起来“消失”了,但
实际上被 Emacs 记录了下来,因此还可以找回来;而删除掉的东西虽然也可能还
在内存里,但是已经被 Emacs“抛弃”了,所以就找不回来了。】重新插入被移
除的文字称为“召回(yank)”。一般而言,那些可能消除很多文字的命令会把
消除掉的文字记录下来(它们被设定成了“可召回”),而那些只消除一个字符
或者只消除空白的命令就不会记录被消除的内容(自然你也就无法召回了)。

>> 移动光标到一非空白行的行头,然后输入 C-k 移除那一行上的文字。

>> 再次 C-k,你可以看到它移除了跟在那一行后面的换行符。

注意,单独的 C-k 会把一行的内容移除,而第二个 C-k 则会移除换行符,并使
其后所有的行都向上移动。C-k 处理数字参数的方式很特别,它会把参数指定的
那么多行连同其后的换行符一起移除,而不仅仅是重复 C-k 而已。比如 C-u 2
C-k 会把两行以及它们的换行符移除;而如果只是输入 C-k 两次显然不是这个结
果。

将被移除的文字恢复的动作称为“召回(yanking)”。(就好像把别人从你身边
移走的东西又猛力地拉回来。)你可以在你删除文字的地方召回,也可以在别的
地方召回,还可以多次召回同样的文字以得到它的多个拷贝。

召回的命令是 C-y。它会在光标所在处插入你最后移除的文字。

>> 试试看,输入 C-y 将文字召回。

如果你一次连按了好几下 C-k,那么所有被移除的行会被存储在一起,只要一个
C-y 就可以把它们都召回。

>> 在这里试试,连续按几次 C-k。

现在再来恢复刚刚被我们移除的文字:

>> 按 C-y。然后把光标往下移动几行,再按一次 C-y。
   现在你应该知道怎么复制文字了。

C-y 可以召回最近一次移除的内容,那如何召回前几次移除的内容呢?它们当然
没有丢,你可以用 M-y 来召回它们。在用 C-y 召回最近移除的文字之后,紧接
着再按 M-y 就可以召回再前一次被移除的内容,再按一次 M-y 又可以召回再上
一次的……连续使用 M-y 直到找到你想要召回的东西,然后什么也不用做,继续
编辑就行了。

如果连续按 M-y 很多次,你可能会回到起始点,也就是最近移除的文字。
【看得出这实际上是一个环。】

>> 移除一行,移动一下光标,然后再移除另外一行。
   按 C-y 将第二次移除的那行召回来。
   紧接着再按 M-y,它将会被第一次移除的那行取代。
   试着再按几下 M-y 看看会发生什么。
   再继续,直到第二行被召回来,然后再做个几次。
   如果感兴趣,你可以试着给 M-y 指定一个正的或负的参数。


* 撤销(UNDO)
--------------

如果你修改了一段文字,又觉得改得不好,可以用 undo 命令进行撤销:
C-x u。

通常 C-x u 会消除一个命令所造成的所有改变;如果你在一行中连续多次地使用
C-x u,你会把以前的命令也依次撤销。

但是有两个例外:
1) 没有改变文字的命令不算(包括光标移动命令和滚动命令)
2) 从键盘输入的字符以组为单位――每组 20 个字符――来进行处理。
    (这是为了减少你在撤销“插入文字”动作时需要输入 C-x u 的次数)

>> 用 C-k 将这一行移除,然后输入 C-x u ,它会再次出现。

C-_ 也是撤销命令;它的作用跟 C-x u 一样,但是它比较容易多次输入。C-_ 的
缺点是在某些键盘上可能不太容易按,这也正是我们同时提供 C-x u 的原因。在
某些终端上,你可以按住 CONTROL 再按“/”来输入 C-_。

数字参数对于 C-_ 和 C-x u 的意义是执行撤销的重复次数。


* 文件(FILE)
--------------

想保存工作成果就要记得存盘,否则一旦退出 Emacs 你编辑的文字就会丢失。要
存盘,就要在编辑前“寻找”到一个存盘文件。(这个过程通常也被称为“访问”
文件。)

寻找到一个文件意味着你可以在 Emacs 里查看这个文件的内容。从许多角度看,
这就等于你在直接编辑这个文件,只是你所做的修改只有在“存盘”的时候才会
被写入文件。也正因为如此,你可以丢弃一个写到一半的文件而不必把这个残缺
文件也保存到计算机上。在存盘的时候,Emacs 会把存盘前的文件重命名保存,
以防你改完之后又想反悔。

在屏幕的下方,你应该能够看到头尾都是短线“-”的一行,行首通常是一些诸如
“--:-- TUTORIAL.cn”的文字,这些文字代表了你当前正在访问的文件。比如你
现在正在访问的文件叫“TUTORIAL.cn”,它只是一个给你临时使用的拷贝。每当
Emacs 寻找到一个文件,文件名就会出现在这个位置。

寻找文件的命令有一个特点,那就是你必须给出文件名。我们称这个命令“从终
端读入了一个参数”(在这里,这个参数显然就是文件名)。在你输入这条命令
之后:

        C-x C-f   寻找一个文件

Emacs 会提示你输入文件名。你输入的文件名会出现在屏幕最底端的一行,这一
行被称为小缓冲(minibuffer),在小缓冲里你可以使用通常的 Emacs 编辑命令
来编辑文件名。

在小缓冲里输入文件名(其实输入其它东西也一样)时可以用 C-g 取消。

>> 输入 C-x C-f,然后输入 C-g
   这会关掉小缓冲,同时也会取消使用小缓冲的 C-x C-f 命令。
   当然了,你也没有找任何文件。

用 <Return> 结束文件名的输入。这之后 C-x C-f 命令开始工作并找到你指定的
文件。小缓冲在 C-x C-f 命令结束之后也会消失。

眨眼间文件就被显示在屏幕上,你可以开始编辑了。存盘用这条命令:

        C-x C-s   储存这个文件

这条命令把 Emacs 中的文字存储到文件中。第一次存盘的时候 Emacs 会将原文
件重命名以备份。重命名的规则通常是在原文件名之后添加一个“~”字符。
【对许多人来说,这是一个烦人的特性,关掉文件备份可以用如下命令:
  M-x customize-variable <Return> make-backup-files <Return>】

存盘结束后,Emacs 会显示写入文件的文件名。你最好养成经常存盘的习惯,这
可以减少系统崩溃和死机给你带来的损失。

>> 输入 C-x C-s 把本快速指南存下来。
   你会在屏幕的下方看到一条消息:“Wrote ...TUTORIAL.cn”。

注意:在某些终端下,输入 C-x C-s 会冻结屏幕【屏幕没有任何输出】,使你看
不到 Emacs 的任何变化。其原因是操作系统的“流量控制”功能拦截了 C-s 并
冻结了屏幕。用 C-q 可以解除屏幕冻结。要解决这个问题,请参考 Emacs 手册
里的“Spontaneous Entry to Incremental Search”一节【Emacs 手册可能还没
有中文翻译】,那里提供了一些有用的建议。

你不但可以寻找一个已有的文件来查看或编辑,还可以寻找一个不存在的文件。
实际上这正是 Emacs 创建新文件的方法:找到不存在的新文件。只有在存盘的时
候,Emacs 才会真正创建这个文件。而在这之后的一切就跟编辑一个已有文件没
有区别了。


* 缓冲区(BUFFER)
------------------

你可以用 C-x C-f 找到并打开第二个文件,但第一个文件仍然在 Emacs 中。要
切回第一个文件,一种办法是再用一次 C-x C-f。这样,你就可以在 Emacs 中同
时打开多个文件。

>> 用 C-x C-f foo <Return> 的方式建立一个名为“foo”的文件。
   输入一些文字,再用 C-x C-s 保存文件“foo”。
   最后,输入 C-x C-f TUTORIAL.cn <Return> 回到这里。

Emacs 把每个编辑中的文件都放在一个称为“缓冲区(buffer)”的地方。每寻
找到一个文件,Emacs 就在其内部开辟一个缓冲区。用下面的命令可以列出当前
所有的缓冲区:

        C-x C-b   列出缓冲区

>> 现在就试一下 C-x C-b

观察一下缓冲区是如何被命名的,它很可能跟与其对应的文件同名。实际上,一
个 Emacs 窗格里的任何文字都是某个缓冲区的一部分。

>> 输入 C-x 1 离开缓冲区列表

不管存在多少缓冲区,任何时候都只能有一个“当前”缓冲区,也就是你正在编
辑的这个。如果你想编辑其它的缓冲区,就必须“切换”过去。上面讲过,用
C-x C-f 是一种办法。不过还有一个更简单的办法,那就是用 C-x b。用这条命
令,你必须输入缓冲区的名称。

>> 输入 C-x b foo <Return> 以回到文件“foo”的缓冲区。
   然后输入 C-x b TUTORIAL.cn <Return> 回到这里。

大多数情况下,缓冲区与跟其对应的文件是同名的(不包括目录名),不过这也
不是绝对的。用 C-x C-b 得到的缓冲区列表总是显示缓冲区名。

你在 Emacs 窗格里看到的“任何”文字都一定属于某个缓冲区。然而,缓冲区未
必有对应文件:比如显示缓冲区列表的缓冲区就是这样。再比如“*Messages*”
缓冲区也没有对应文件,这个缓冲区里存放的都是在 Emacs 底部出现的消息。

>> 输入 C-x b *Messages* <Return> 瞅瞅消息缓冲区里都有什么东西。
   然后再输入 C-x b TUTORIAL.cn <Return> 回到这里。

如果你对某个文件做了些修改,然后切换到另一个文件,这个动作并不会帮你把
前一个文件存盘。对第一个文件的修改仍然仅存在于 Emacs 中,也就是在它对应
的缓冲区里。并且,对第二个文件的修改也不会影响到第一个文件。这很有用,
但是也挺麻烦:因为如果你想要存储第一个文件,还需要先 C-x C-f 切换回去再
用 C-x C-s 存盘。你需要一个更简便的方法,而 Emacs 已经为你准备好了:

        C-x s   保存多个缓冲区

C-x s 会找出所有已被修改但尚未存盘的缓冲区,然后向你逐个询问:是否需要
存盘?

>> 插入一行文字,然后输入 C-x s。
   它应该会问你,是否要储存名为 TUTORIAL.cn 的缓冲区?
   按“y”告诉它你想存盘。


* 命令集扩展(EXTENDING THE COMMAND SET)
-----------------------------------------

Emacs 的命令就像天上的星星,数也数不清。把它们都对应到 CONTROL 和 META
组合键上显然是不可能的。Emacs 用扩展(eXtend)命令来解决这个问题,扩展
命令有两种风格:

        C-x     字符扩展。  C-x 之后输入另一个字符或者组合键。
        M-x     命令名扩展。M-x 之后输入一个命令名。

很多扩展命令都相当有用,虽然与你已经学过的命令比起来,他们可能不那么常
用。我们早已经见过一些扩展命令了,比如用 C-x C-f 寻找文件和用 C-x C-s
保存文件;退出 Emacs 用的 C-x C-c 也是扩展命令。(不用担心退出 Emacs 会
给你带来什么损失,Emacs 会在退出之前提醒你存盘的)

在控制台下,C-z 可以暂时离开 Emacs――当然,你还可以再回来。

在允许 C-z 的系统中,C-z 会把 Emacs“挂起”,也就是说,它会回到 shell
但不退出 Emacs。在常用的 shell 中,通常可以用“fg”或者“%emacs”命令再
次回到 Emacs 中。

在没有提供挂起功能的系统中,C-z 会在 Emacs 之下创建一个子 shell 来让你
运行其它程序,并且再次“回到”Emacs 中――虽然我们并没有真正离开过。这
种情况下,通常用 shell 命令“exit”从子 shell 回到 Emacs。

你最好在打算退出登陆的时候再用 C-x C-c。在 Emacs 被诸如邮件处理程序之类
的外部程序调用之后,也可以用 C-x C-c 退出。不过一般来讲,如果你不想退出
登录,最好还是把 Emacs 挂起而不是退出。

C-x 的扩展命令有很多,下面列出的是你已经学过的:

        C-x C-f         寻找文件。
        C-x C-s         保存文件。
        C-x C-b         列出缓冲区。
        C-x C-c         离开 Emacs。
        C-x 1           关掉其它所有窗格,只保留一个。
        C-x u           撤销。

用命令名扩展的命令通常并不常用,或只用在部分模式下。比如 replace-string
(字符串替换)这个命令,它会在全文范围内把一个字符串替换成另一个。在输
入 M-x 之后,Emacs 会在屏幕底端向你询问并等待你输入命令名。如果你想输入
“replace-string”,其实只需要敲“repl s<TAB>”就行了,Emacs 会帮你自动
补齐。输入完之后按 <Return> 。

字符串替换命令需要两个参数――被替换的字符串和用来替换它的字符串。每个
参数的输入都以换行符来结束。

>> 将光标移到本行下面第二行的空白处,然后输入
   M-x repl s<Return>changed<Return>altered<Return>。

   【以下保留一行原文,以应练习之需:】
   Notice how this line has changed: you've replaced...

请注意这一行的变化:在光标之后的范围内,你已经将“changed”这个词――不
论它在哪里出现――全部用“altered”替换掉了。


* 自动保存(AUTO SAVE)
-----------------------

如果你已经修改了一个文件,但是还没来得及存盘你的计算机就罢工了,那么你
所做的修改就很可能会丢失。为了避免这样的不幸发生,Emacs 会定期将正在编
辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个
“#”字符,比如你正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫
“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。

所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保
存文件)然后输入 M-x recover file<Return> 来恢复你的自动保存文件。在提
示确认的时候,输入 yes<Return>。


* 回显区(ECHO AREA)
---------------------

如果 Emacs 发现你输入多字符命令的节奏很慢,它会在窗格的下方称为“回显区”
的地方给你提示。回显区位于屏幕的最下面一行。


* 状态栏(MODE LINE)
---------------------

位于回显区正上方的一行被称为“状态栏”。状态栏上会显示一些信息,比如:

--:**  TUTORIAL.cn       (Fundamental)--L670--54%----------------

状态栏显示了 Emacs 的状态和你正在编辑的文字的一些信息。

你应该知道文件名的意思吧?就是你找到的那个文件嘛。-NN%-- 显示的是光标在
全文中的位置。如果位于文件的开头,那么就显示 --Top-- 而不是 --00%--;如
果位于文件的末尾,就显示 --Bot--。如果文件很小,一屏就足以显示全部内容,
那么状态栏会显示 --All--。

“L” 和其后的数字给出了光标所在行的行号。

最开头的星号(*)表示你已经对文字做过改动。刚刚打开的文件肯定没有被改动
过,所以状态栏上显示的不是星号而是短线(-)。

状态栏上小括号里的内容告诉你当前正在使用的编辑模式。缺省的模式是
Fundamental,就是你现在正在使用的这个。它是一种“主模式”。

Emacs 的主模式林林总总。有用来编辑程序代码的――比如 Lisp 模式;也有用
来编辑各种自然语言文本的――比如 Text 模式。任何情况下只能应用一个主模
式,其名称会显示在状态栏上,也就是现在显示“Fundamental”的地方。

主模式通常会改变一些命令的行为。比方说,不管编辑什么语言的程序代码,你
都可以用一个相同的命令来添加注释。但是在不同的语言中注释的语法往往是不
同的,这时不同的主模式就会用各自不同的语法规则来添加注释。主模式都是可
以用 M-x 启动的扩展命令,M-x fundamental-mode 就可以切换到 Fundamental
模式。

编辑自然语言文本――比如现在――应该用 Text 模式。

>> 输入 M-x text mode<Return>。

别担心,什么都没变。不过细心一些可以发现,M-f 和 M-b 现在把单引号(')
视为词的一部分了。而在先前的 Fundamental 模式中,M-f 和 M-b 都将单引号
视为分隔单词的符号。

主模式通常都会搞一些类似的小动作,因为很多命令其实完成的是“相同的工
作”,只是在不同环境下会有不同的工作方式而已。【所谓“求同存异”,在
Emacs 里得到了很好的体现】

用 C-h m 可以查看当前主模式的文档。

>> 用 C-u C-v 将本行带到屏幕的最上方。
>> 输入 C-h m,看看 Text 模式与 Fundamental 模式有哪些不同。
>> 输入 C-x 1 关掉文档窗格。

主模式之所以称之为“主(major)”模式,是因为同时还有“辅模式”(minor
mode)存在。辅模式并不能替代主模式,而是提供一些辅助的功能。每个辅模式
都可以独立地开启和关闭,跟其它辅模式无关,跟主模式也无关。所以你可以不
使用辅模式,也可以只使用一个或同时使用多个辅模式。

有一个叫做自动折行(Auto Fill)的辅模式很有用,特别是在编辑自然语言文本
的时候。启用自动折行后,Emacs 会在你打字超出一行边界时自动替你换行。

用 M-x auto fill mode<Return> 启动自动折行模式。再用一次这条命令,自动
折行模式会被关闭。也就是说,如果自动折行模式没有被开启,这个命令会开启
它;如果已经开启了,这个命令会关闭它。所以我们说,这个命令可以用来“开
关(toggle)”模式。

>> 现在输入 M-x auto fill mode<Return>。然后随便敲点什么,直到你看到它
   分成两行。你必须敲一些空格,因为 Auto Fill 只在空白处进行断行。
   【输入空格对英文来说是必须的,而对中文则不必。】

行边界通常被设定为 70 个字符【这里指英文字符】,你可以用 C-x f 命令配合
数字参数来重新设定它。

>> 输入 C-x f 并传递参数 20: C-u 2 0 C-x f。
   然后输入一些文字,观察 Emacs 的自动折行动作
   最后再用 C-x f 将边界设回 70。

如果你在段落的中间做了一些修改,那么自动折行模式不会替你把整个段落重新
折行,你需要用 M-q 手动折行。注意,光标必须位于你需要折行的那一段里。

>> 移动光标到前一段中,然后输入 M-q。


* 搜索(SEARCHING)
-------------------

Emacs 可以向前或向后搜索字符串。搜索命令是一个移动光标的命令:搜索成功
后,光标会停留在搜索目标出现的地方。

Emacs 的搜索命令的独特之处在于,它是“渐进的(incremental)”。意思是搜
索与输入同时进行:你在键盘上一字一句地输入搜索词的过程中,Emacs 就已经
开始替你搜索了。

C-s 是向前搜索,C-r 是向后搜索。不过手别这么快!别着急试。

在按下 C-s 之后,回显区里会有“I-search”字样出现,表明目前 Emacs 正处
于“渐进搜索”状态,并等待你输入搜索字串。按 <Return> 可以结束搜索。

>> 输入 C-s 开始一个搜索。注意敲慢一点,一次输入一个字符。
   慢慢输入“cursor”这个词,每敲一个字都停顿一下并观察光标。
   现在你应该已曾经找到“cursor”这个词了。
>> 再按一次 C-s,搜索下一个“cursor”出现的位置。
>> 现在按四次退格键,看看光标是如何移动的。
>> 敲 <Return> 结束搜索。

看仔细了么?在一次渐进式搜索中,Emacs 会尝试跳到搜索目标出现的位置。要
跳到下一个命中位置,就再按一次 C-s。如果找不到目标,Emacs 会发出“哔”
的一声,告诉你搜索失败。在整个过程中,都可以用 C-g 来终止搜索。【你会发
现 C-g 会让光标回到搜索开始的位置,而 <Return> 则让光标留在搜索结果上,
这是很有用的功能。】

注意:在某些终端下,输入 C-x C-s 会冻结屏幕【屏幕没有任何输出】,使你看
不到 Emacs 的任何变化。其原因是操作系统的“流量控制”功能拦截了 C-s 并
冻结了屏幕。用 C-q 可以解除屏幕冻结。要解决这个问题,请参考 Emacs 手册
里的“Spontaneous Entry to Incremental Search”一节【Emacs 手册可能还没
有中文翻译】,那里提供了一些有用的建议。

在渐进式搜索中,按退格键会删除目标字符串的最后一个字符,并且光标会回到
最近一次搜索的命中位置。比如你已经输入了“c”,光标就停在“c”第一次出
现的位置,再输入“u”,光标停在“cu”第一次出现的位置,这时再按退格键,
“u”就从搜索字串中消失了,然后光标会回到“c”第一次出现的位置。

另外,如果你在搜索的时候输入了 CONTROL 或者 META 组合键的话,搜索可能会
结束。(也有例外,比如 C-s 和 M-r 这些用于搜索的命令。)

前面说的都是“向下”搜索,如果想“向上”搜索,可以用 C-r。C-r 与 C-s
相比除了搜索方向相反之外,其余的操作都一样。


* 多窗格(MULTIPLE WINDOWS)
----------------------------

Emacs 的迷人之处很多,能够在屏幕上同时显示多个窗格就是其中之一。

>> 移动光标到这一行,然后输入 C-u 0 C-l。

>> 现在输入 C-x 2,它会将屏幕划分成两个窗格。
   这两个窗格里显示的都是本篇快速指南,而光标则停留在上方的窗格里。

>> 试试用 C-M-v 滚动下方的窗格。
   (如果你并没有 META 键,用 ESC C-v 也可以。)
   【向上滚动是 C-M-S-v,也就是同时按住 CONTROL、META 和 SHIFT 再按 v】

>> 输入 C-x o(“o”指的是“其它(other)”),
   将光标转移到下方的窗格。

>> 在下方的窗格中,用 C-v 和 M-v 来滚动。
   同时继续在上方的窗格里阅读这些指导。

>> 再输入 C-x o 将光标移回到上方的窗格里。
   光标会回到它在上方窗格中原本所在的位置。

连续使用 C-x o 可以遍历所有窗格。每一个窗格都有它自己的光标位置,但是只
有一个窗格会真正显示这个光标。【其它窗格在控制台下不会显示光标,在图形
窗口下缺省显示为镂空光标。】一般所有的编辑命令都作用于这个光标所在的窗
格,我们称这个窗格为“被选中的窗格”。

当你在一个窗格中编辑,但用另一个窗格作为参考的时候,C-M-v 是很有用的命
令。你可以始终处于编辑窗格中,然后用 C-M-v 命令滚动另外一个窗格。【比如
翻译和校对就很适合用这种方式进行。】

C-M-v 是一个 CONTROL-META 组合键。如果你有 META 键的话,可以同时按住
CONTROL 和 META 键并输入 v。CONTROL 和 META 键先按哪个都可以,因为它们
只是用来“修饰(modify)”你输入的字符的。

如果你并没有 META 键,你也可以用 ESC 来代替,不过这样的话就要注意按键顺
序了:你必须先输入 ESC ,然后再输入 CONTROL-v。CONTROL-ESC v 是没用的,
因为 ESC 本身是一个字符键,而不是一个修饰键(modifier key)。

>> (在上方窗格里)输入 C-x 1 关掉下方窗格。

(如果你在下方的窗格里输入 C-x 1,那么就会关掉上方的窗格。你可以把这个
命令看成是“只保留一个窗格”――就是我们正在编辑的这个。)

不同的窗格可以显示不同的缓冲区。如果你在一个窗格里用 C-x C-f 打开了一个
文件,另一个窗格并不会发生什么变化。任何一个窗格里都可以用来打开文件。

用下面的方法可以在一个新开窗格里打开文件:

>> 输入 C-x 4 C-f,紧跟着输入一个文件名,再用 <Return> 结束。
   可以看到你指定的文件出现在下方的窗格中,同时光标也跳到了那里。

>> 输入 C-x o 回到上方的窗格,然后再用 C-x 1 关掉下方窗格。


* 递归编辑(RECURSIVE EDITING LEVELS)
--------------------------------------

有时候你会进入所谓的“递归编辑”。递归编辑状态由位于状态栏的方括号所指
示,其中包含了用小括号来指明的模式名称。比如说,你有时可能会看到
[(Fundamental)],而不是 (Fundamental)。【比如在用 M-% 进行交互式替换的
时候你又用了 C-s 进行搜索,这时替换模式并没有结束,但你又进入了搜索模式,
这就是所谓的递归编辑。】

离开递归编辑可以用 ESC ESC ESC。这是一个最通用的“离开”命令,你甚至可
以使用它来关掉多余的窗格,或者离开小缓冲。

>> 输入 M-x 进入小缓冲;然后输入 ESC ESC ESC 离开。

你不能用 C-g 退出递归编辑,因为 C-g 的作用是取消“本层递归编辑之内”的
命令和其参数(arguments)。


* 获得更多帮助(GETTING MORE HELP)
-----------------------------------

本快速指南的目的仅仅是帮助你在 Emacs 的海洋里下水,不至于束手无策望洋兴
叹。有关 Emacs 的话题可谓汗牛充栋,这里自然是难尽万一。不过 Emacs 很理
解你求知若渴的心情,因为它提供的强大功能实在是太多了。为此,Emacs 提供
了一些命令来查看 Emacs 的命令文档,这些命令都以 CONTROL-h 开头,这个字
符也因此被称为“帮助(Help)字符”。

要使用帮助(Help)功能,请先输入 C-h,然后再输入一个字符以说明你需要什
么帮助。如果你连自己到底需要什么帮助都不知道,那么就输入 C-h ?,Emacs
会告诉你它能提供了哪些帮助。如果你按了 C-h 又想反悔,可以用 C-g 取消。

(有些主机改变了 C-h 的意义,这种以己度人外加一刀切的做法确实不太好,不
过倒是让你可以义正辞严地抱怨他们的系统管理员。话说回来,如果你按 C-h 之
后没有任何帮助信息显示出来,那么试试 F1 键或者 M-x help <Return> 。)

最基本的帮助功能是 C-h c。输入 C-h c 之后再输入一个组合键,Emacs 会给出
这个命令的简要说明。

>> 输入 C-h c C-p。

显示的消息应该会是这样:

        C-p runs the command previous-line

这条消息显示了 C-p 命令对应的函数名,函数名主要用来定制和扩展 Emacs。命
令的功能由函数完成,所以函数名本身也可以被看成是最简单的文档――至少对
于你已经学过的命令来说,它们的函数名足以解释它们的功能了。

多字符命令一样可以用 C-h c 来查看。

想得到更多的信息,请把 C-h c 换成 C-h k 试试看。

>> 输入 C-h k C-p。

上面的命令会新打开一个 Emacs 窗格以显示函数的名称及其文档。你读完之后可
以用 C-x 1 关掉这个帮助窗格。当然你并不需要立即这样做,你完全可以先在编
辑窗格里做点别的事情,然后再关掉帮助窗格。

还有一些其它有用的 C-h 命令:

   C-h f        解释一个函数。需要输入函数名。

>> 试试看,输入 C-h f previous-line<Return>。
   Emacs 会给出它所知道的所有有关“实现 C-p 命令功能的函数”的信息。

C-h v 用来显示 Emacs 变量的文档。Emacs 变量可以被用来“定制 Emacs 的行
为”。同样,你需要输入变量的名称。

   C-h a        相关命令搜索(Command Apropos)。
                输入一个关键词然后 Emacs 会列出所有命令名中包含此关键词
                的命令。这些命令全都可以用 M-x 来启动。对于某些命令来说,
                相关命令搜索还会列出一两个组合键。

>> 输入 C-h a file<Return>。

Emacs 会在另一个窗格里显示一个 M-x 命令列表,这个列表包含了所有名称中含
有“file”的命令。你可以看到像“C-x C-f”这样的组合键显示在“find-file”
这样的命令名的旁边。

>> 用 C-M-v 来回滚动 help 窗格,多试几次。

>> 输入 C-x 1 来删除 help 窗格。

   C-h i        阅读联机手册(也就是通常讲的 Info)。
                这个命令会打开一个称为“*info*”的特殊缓冲区,在那里,
                你可以阅读安装在系统里的软件包使用手册。要读 Emacs 的使
                用手册,按 m emacs <Return> 就可以了。如果你之前从没用
                过 Info 系统,那么请按“?”,Emacs 会带你进入 Info 的使
                用指南。在看完本快速指南之后,Emacs Info 会成为你的主要
                参考文档。


* 更多精彩(MORE FEATURES)
---------------------------

想学习更多的使用技巧,Emacs 使用手册(manual)值得一读。你可以读纸版的
书,也可以看电子版的联机手册(可以从 Help 菜单进入或者按 F10 h r)。提
两个你可能会很感兴趣的功能吧,一个是可以帮你少敲键盘的 completion(自动
补全),另一个是方便文件处理的 dired(目录编辑)。

Completion 可以替你节省不必要的键盘输入。比如说你想切换到 *Message* 缓
冲区,你就可以用 C-x b *M<Tab> 来完成。只要 Emacs 能够根据你已经输入的
文字确定你想要输入的内容,它就会自动帮你补齐。有关 Completion 的详细说
明可以在 Emacs Info 中的“Completion”一节里找到。

Dired 能够在一个缓冲区里列出一个目录下的所有文件(可以选择是否也列出子
目录),然后你可以在这个文件列表上完成对文件的移动、访问、重命名或删除
等等操作。Dired 也在 Emacs Info 中有详细介绍,参见“Dired”一节。

Emacs 使用手册里还有许许多多的精彩功能等着你来了解。


* 总结(CONCLUSION)
--------------------

记住,要退出 Emacs 请用 C-x C-c。要暂时切换到 shell 并且稍后再回到
Emacs 里来,请用 C-z。【切换到 shell 仅对控制台下的 Emacs 有效】

本文完全是为零起点新手所写的起步教程。如果你觉得哪里还看不明白,千万不
要怀疑自己,那一定是我们没有写好。我们永远欢迎你的不满和抱怨。


* 翻译(TRANSLATION)
---------------------

翻译:孙一江 <sunyijiang@gmail.com>
校对:水木社区(www.newsmth.net)Emacs 板众多网友及众多 Emacs 中文用户

Emacs 快速指南(Tutorial)早有两个刘昭宏的中文译本,繁简各一。其简体版本
(TUTORIAL.cn)基本由繁体版本(TUTORIAL.zh)经词语替换而得。然而繁简中文
不仅在用词习惯上有所不同,更有诸多表达方式与句法方面的差异,因此一直以来
用户使用 TUTORIAL.cn 都会略觉生硬和晦涩。这次重新翻译 TUTORIAL.cn 的动机
正是源于这种体验,希望我们的工作能够让本文更好地发挥其作用。TUTORIAL.zh
的译文质量很高,在翻译过程中给予过我们许多借鉴和参考,在此对刘昭宏的工作
表示感谢。

翻译过程中最大的挑战莫过于术语译词的选择了。经过水木社区 Emacs 板热心网
友小范围内的讨论,我们选择了现在的译法。用户的广泛参与是自由软件生命力
的源泉,所以如果你有任何建议、勘误或想法,请用你喜欢的方式向我们提出。
你可以通过电子邮件直接联系译者,也可以放到 GNU Emacs 的开发邮件列表或者
水木社区的 Emacs 板上进行讨论。

下面列出主要术语的译词对照,并给出注释说明:

    command               命令
    cursor                光标
    scrolling             滚动
    numeric argument      数字参数
    window                窗格 [1]
    insert                插入
    delete                删除 [2]
    kill                  移除 [2]
    yank                  召回 [2]
    undo                  撤销
    file                  文件
    buffer                缓冲区
    minibuffer            小缓冲
    echo area             回显区
    mode line             状态栏
    search                搜索
    incremental search    渐进式搜索 [3]

[1] “window”一词在计算机相关的领域一般都被译为“窗口”。但是在 Emacs
    中,还有一个“frame”的概念。在被广泛使用的 X 窗口系统和微软的视窗
    (Windows)系列操作系统中,Emacs 的一个“frame”就是一个“窗口”,因
    此把 Emacs 中的“frame”译成“窗口”更加符合通常的习惯。这样,Emacs
    中的“window”就只能译成“窗格”了。我们认为 Emacs 中 window 和
    frame 的关系用窗格和窗口来类比是十分形象的。

    《学习GNU Emacs》(第二版)一书对“window”和“frame”的翻译与本教程
    刚好相反(分别译作“窗口”和“窗格”)。在此特别注明,以消除可能产生
    的疑惑。(感谢李旭章 <lixuzhang@gmail.com> 指出)

[2] 对于“delete”和“kill”的区别,正文已经给出了详细的说明。“删除”和
    “移除”相比较起来,前者更多地隐含着“破坏”和“不可恢复”的意思,而
    后者更多地隐含着“被转移”和“可恢复”的意思。因此分别选择它们作为上
    述两词的译词,希望能够体现出区别。“yank”在中文文档中鲜有对应译词出
    现,翻译的困难较大。究其本意是:“a strong sudden pull”(参见韦氏词
    典),即“猛然拉回”。在原文档中 yank 被引申为“将先前移除的东西再移
    回来”这个意思,所以我们选择了“召回”一词与其对应。

[3] “incremental”一词在计算机著作中广泛出现,被广泛接受的中文译词有两
    个:“增量的”和“渐进的”。“incremental search”翻译成“增量式搜索
    ”或者“渐进式搜索”都讲得通,且都有各自的形象之处。还是参考原文对其
    的解释:“... means that the search happens while you type in the
    string to search for”。意思是之所以称其为“incremental search”,是
    因为“在你输入搜索字符串的过程中,搜索就已经在进行了”。我们认为“增
    量的”更加强调在现有基础上的变化(比如“增量备份”,“增量编译”);
    而“渐进的”更加强调过程的逐渐发展,也更加符合原文的意思。因此我们选
    择将“incremental search”译作“渐进式搜索”。


* 版权声明(COPYING)
---------------------

This tutorial descends from a long line of Emacs tutorials
starting with the one written by Stuart Cracraft for the original Emacs.

This version of the tutorial, like GNU Emacs, is copyrighted, and
comes with permission to distribute copies on certain conditions:

Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004,
   2005, 2006, 2007  Free Software Foundation, Inc.

   Permission is granted to anyone to make or distribute verbatim copies
   of this document as received, in any medium, provided that the
   copyright notice and permission notice are preserved,
   and that the distributor grants the recipient permission
   for further redistribution as permitted by this notice.

   Permission is granted to distribute modified versions
   of this document, or of portions of it,
   under the above conditions, provided also that they
   carry prominent notices stating who last altered them.

The conditions for copying Emacs itself are more complex, but in the
same spirit.  Please read the file COPYING and then do give copies of
GNU Emacs to your friends.  Help stamp out software obstructionism
("ownership") by using, writing, and sharing free software!

【下面为版权声明的译文,仅供参考。实际法律效力以英文原文为准。】

本快速指南沿袭自历史悠久的 Emacs 快速指南,可上溯至 Stuart Cracraft 为最
初的 Emacs 所作的版本。

本篇文档与 GNU Emacs 一样拥有版权,并允许在下列条件的约束下发行其拷贝:

   Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
   2007  Free Software Foundation, Inc.

   本文档允许在不变更文档内容的情况下由任何人发布在任何媒体上,同时必须
   完整保留版权和许可声明,且需给予受众与发行者完全相同的、如本声明所允
   许的再次发行本文档的权利。

   本声明允许在与上述条件相同的情况下发布经过修改的全部或部分文档,同时
l   必须附带显要的文字以申明文档的最后修改者。

Emacs 自身的版权问题虽比本文档要复杂一些,但也基于相同的精神。敬请阅读文
件“COPYING”,然后向你的朋友们分发 GNU Emacs 拷贝。让我们以使用、编写和
分享自由软件的实际行动来共同祛除软件障碍主义(所谓的“所有权”)!

;;; Local Variables:
;;; coding: chinese-iso-8bit
;;; End:

;;; arch-tag: 46a53d82-a85a-46b6-bdc7-583aca063578


posted @ 2007-11-22 17:53 Dr.Magic 阅读(115) | 评论 (0)编辑 收藏
花了点时间翻译出来,有些地方还不是很清晰明了,主要是有些功能还尚未使用。下载 project中文帮助(也 可以将下文保存成project.txt文件)放到vim的doc目录中,覆盖原来的英文帮助。如果你不想覆盖,你可以把原来的帮助文件移动到上层目录或 其他地方,注意不要重命名放在doc目录下,不然在使用helptags doc目录产生tags时会提示tag重复的警告信息。以后使用: help project 出来的就是中文手册了。时间仓促,翻译的不好,不当或错误之处敬请各位看官指出来。

*project.txt*     一个用来管理多个项目及项目源代码的插件
        支持版本: Vim 6.x 及 Vim7.x
        最后更新: 2006 年 10 月 13 日 星期五
        翻译更新: 2007 年 08 月 16 日 星期五

                作者:Aric Blumer
                译者:Denven

                              *project* *project-plugin*

    目录:

        1.命令..............调出插件.............|project-invoking|
        2.继承...........项目层层关系.........|project-inheritance|
        3.映射.............插件映射..............|project-mappings|
        4.添加映射.......为插件添加映射...|project-adding-mappings|
        5.设置..............项目设置.............|project-settings|
        6.样例文件..........项目样例..............|project-example|
        7.技巧..............使用技巧.................|project-tips|
 

使用这个插件的基本功能可以为你经常访问的文件提供方便的浏览. 文件会在 Vim 左侧
窗口列出来, 在文件名上按 <Return> 或者双击鼠标就可以打开相应的文件. 这比使用
|file-explorer| 去浏览多层目录要更为便捷.

也可在选择一个文件时候去让插件更改目录, 执行指定都 Vim 脚本. 这些脚本可以通过
修改 $PATH 来设定编译器等的环境. 这在进行多项目开发时可以让 quickfix 工作在不
同的环境中.

其他特性:
    o 在项目中实时加载或卸载文件(\l, \L, \w, and \W)
    o 在项目中所有文件进行全局搜索(\g and \G)
    o 对某一个文件单独执行用户指定的脚本(可以利用这个特写来关联一个文件到
      某一个外部程序) (使用\1 到 \9)
    o 对所有文件执行某个用户指定的脚本(使用\f1-\f9 和 \F1-\F9)
    o 用户高可定制性
    o 可以配合 |netrw| 插件使用 XXXX://... 管理远程项目. XXXX 代表 ftp,
      rcp, scp, or http.

可以在一个单独的纯本文件中或在 vimrc 中设置几个全局量变进行配置.

必须在 |vimrc| 文件中 set 'nocompatible' 才能使用这个插件. 也可以通过设置变量
"loaded_project" 来禁止插件被加载: >
    :let loaded_project = 1


==============================================================================
COMMANDS                        *project-invoking*

要使用本插件, 只需将其放置到 Vim 的插件目录(~/.vim/plugin)即可. 参见
"|add-global-plugin|", 在下次打开 Vim 时, 输入如下命令 >
    :Project
或者 >
    :Project {file}

如果没有指定具体的项目文件, 那么会默认使用$HOME/.vimprojects文件.

命令: [g]vim +Project 可在 Vim 启动时同时自动载入project插件窗口.

调出项目窗口时每次只能使用某一个文件, 如果想更改项目, 在项目窗口中运行:bwipe
删除项目缓冲, 然后用 :Project {file} 重新载入新的项目.


可以在同一个文件中保留和显示多个项目, 通过 {} (c参见 |fold.txt|) 来分隔. 在项目
中可以有任意多个嵌套的折叠. {} 中的每一行被当作一个文件名. 空行和 # 号后面的内
容将被忽略.

插件使用 Vim 标准的折叠方式, 支持所有的 |fold-commands| . 例如双击折叠的首行可
以打开或关闭该折叠. 通过光标定位到一个文件名后按回车键或者双击即可打开该文件,
插件会为在右侧打开一个新窗口来显示(如果映射了 |CTRL-W_p|, 也是等价的).

                                  *project-syntax*
                                           *语法*
项目入口描述形式:
project_entry ::=
    <Description>={projpath} [{options}] {
    [ filename ]
    [ project_entry ]
    }

{options} 可以是下面的一项或者几项, 但必须放在同一行上.
    CD={path}
    in={filename}
    out={filename}
    filter="{pat}"
    flags={flag}

注意: 一个项目入口可以包含在另一个项目入口里面,    这意味着可以在项目中设置层次关系.

<Description> 项目描述. 不能含有"="字符. 在 =. 的两边不能有空字符. 它会显示在折叠
行上.

{projpath} 项目路径. 它指向项目文件所在目录, 可以在里面使用环境变量. 如果是一个相
对路径, 插件会根据项目的父目录及其上层目录等层次建立路径, 但最外层的项目入口必须
是一个绝对路径. 参见下面 |project-inheritance|的例子.可以在该项中使用空格, 但是要
转义. 下面的两个例子是针对同一个目录的:
>
    Example=/my/directory/with\ spaces {
    }
    Example="/my/directory/with spaces" {
    }

推荐在 Windows 上这样使用: >

    Example="c:\My Documents" {
    }

而 Vim 很聪明, 这样做也是可以的: >

    Example=c:\My\ Documents {
    }

CD= 表示在项目中选定一个文件时 Vim 将要进入的目录(相当于使用|:cd|). 这对在需要
使用本地 Makefile 文件进行编译时, 如|:make| 非常有用. 使用 CD=. 表示 Vim 将
{projpath} 及其等价路径设为当前工作目录. 如果不设置 CD 的值将无法中在项目中进
行目录都切换, 注意 "=" 的两边没有空格. CD 参数也可以是来自其父目录下都一个相对
路径. 参考 |project-inheritance| 中的例子. 在使用 |netrw| 浏览项目时该指令将被
忽略. 在 {projpath} 中可以使用空格.

in= 和 out= 用来在进入或者退出文件缓冲时执行特定的 Vim 脚本. (参考 |BufEnter|
和 |BufLeave| 自动命令事件). 它可以使用 Vim 脚本来为项目设定或取消一定的环境.
例如:

in.vim: >
    let $PROJECT_HOME='~/my_project'
    " Put the compiler in $PATH
    if $PATH !~ '/path/to/my/compiler'
        let $PATH=$PATH.':/path/to/my/compiler'
    endif

out.vim: >
    " Remove compiler from $PATH
    if $PATH =~ '/path/to/my/compiler'
        let $PATH=substitute($PATH, ':/path/to/my/compiler', '', 'g')
    endif

在这种情况下, 在合适的环境下可以使用 :make 进行编译你正在编辑的文件. 如果脚本中
使用的是相对路径,  If the path to the script is relative, then it is
relative from {projpath}.
如果子项目没有另行设定, 这些指令会被子项目继承. 当配合 |netrw| 插件使用时, in=
和 out= 中的路径必须是绝对路径.

filter= 过滤符. 它指定一个全局的 |glob()| 文件匹配模式. 用于在使用 \r 时更新项目
窗口中的文件列表. 由于可能含有多个文件匹配模式, 必须使用双引号将过滤符号串扩起
来. 如果不设置过滤符号, 插件默认使用通配符 * 来当做过滤符.注意"="前后不能含有空
格. 如果子项目没有指定具体的过滤符, 子项目将会继承父项目的过滤符.

flags= 标识位 为某个折叠设置(启用/取消)具体的特性. 为了记忆方便, 通常使用小写
的表示关闭某一特性, 大写则表示开启某一特性. {flag} 参数可以使用下面的字符标志位:

      标志位      描述 ~

    l    关闭由 \L 的递归. 对于子折叠的同样也被关闭.

    r    关闭更新. 当对折叠使用了\r or \R 后不要进行更新.
            它不影响子目录的递归.

    S    为刷新和创建项目开启排序功能.

    s    关闭刷新和创建项目的排序功能.

    T    开启更新项目时折叠处于当前折叠的正下方. 跟在全局变量
        g:proj_flags 中使用标志位等效, 但是不能针对多个折叠而言.

    t    关闭更新项目时折叠至当前折叠区域的最顶部功能. 强制折叠到底部.

    w    关闭 \W 的递归. 对于子折叠的同样也被关闭.


在子项目不能沿用父项目中设定的这些标志.

只对当前折叠生效, 折叠外的文字不受其影响.


==============================================================================
INHERITANCE                         *project-inheritance*

通过下面两个项目文件的对比来理解层次的含义:
>
    Parent=~/my_project CD=. filter="Make* *.mk" flags=r {
     Child1=c_code {
     }
     Child2=include CD=. filter="*.h" {
     }
    }

Child1 的路径是 "~/my_project/c_code", 因为 Child1 继承了 ~/my_project. 它还
继承了 CD. 因为父层的 CD=., 所以对于父层的当前工作路径是 "~/my_project". 那么
Child1 继承过来的 CD 也是"~/my_project". 最后, Child1 从父层继承过来过滤符.
而标志位则是不能继承的,除非单独设置.

Child2 只将 "~/my_project" 从父层继承过来.

所以上述例子跟下面的展开是等价的:
>
    Parent=~/my_project CD=. filter="Make* *.mk" flags=r {
     Child1=~/my_project/c_code CD=~/my_project filter="Make* *.mk" {
     }
     Child2=~/my_project/include CD=~/my_project/include filter="*.h" {
     }
    }

(在一个实际的项目中, Child1 一般不会希望从父层继承过滤符号, 该例子只是为了说明
 这个概念而已), 使用 \i 可以显示当前光标下项目的层次关系.


==============================================================================
MAPPINGS                            *project-mappings*

映射    动作 ~

\r    根据过滤符更新光标处的项目.  更新项目, 每深入一层折叠缩进一个空格.

    如果在一行最后使用了 "# pragma keep" (不含双引号), 那么该行将保留,
    不会被在更新时被删除. 当使用 . 作为一个入口时, 进入当前目录进行浏览
    相当方便, 通常对于这个有用的入口你肯定想在更新时被保留.
 
    注意这个映射是 <LocalLeader>r, Vim 默认使用 \ 作为|<LocalLeader>|.

    对于使用 |netrw| 浏览的项目不适用.

\R    递归执行 \r.
    对于使用 |netrw| 浏览的项目不适用.

\c    创建一个项目. 要求用户输入 项目描述, 文件路径, CD 参数, 文件名匹配表达
        式 |glob()|. 插件会根据这些信息在光标下面建立一个项目的入口.

    对于使用 |netrw| 浏览的项目不适用.

\C    为目录及其子目录下的文件递归创建一个项目.

<Return>
    在前一窗口或者另外一个新窗口中打开光标处的文件. 如果光标位于折叠上,
    按此键打开或关闭折叠.

<S-Return>
\s
    跟 <Return> 一样, 但会水平分割目标窗口.   
    使用 <LocalLeader>s 主要是为那些不能识别 <S-Return> 的终端而提供的.

\S
    加载所有文件到当前窗口, 当前窗口会被水平分割显示所有文件.

<C-Return>
\o
    同 <Return> 在一个窗口中打开当前文件, 同时关闭其他所有打开的窗口.
    该映射保证该文件是除项目窗口以外其他唯一的窗口.
           <LocalLeader>o 主要是为那些不能识别 <C-Return> 的终端而提供的.

<M-Return>
\v
    同 <Return> 仅仅显示文件内容, 而光标依然停留在项目窗口中.

<2-LeftMouse>
    (Double-click) 双击鼠标左键, 如果当前光标下是一个已经展开的折叠则关闭
    该折叠, 反之打开该折叠. 如果当前光标下为一个文件名, 则在|CTRL-W_p|(前
    一窗口)或项目右侧新窗口中打开该文件.

<S-2-LeftMouse>
    同 <S-Return>.

<C-2-LeftMouse>
    同 <C-Return>.

<RightMouse>
    根据变量的值 g:proj_window_increment 增加项目窗口的宽度, 反复点击则为
    在原宽度
            g:proj_window_width
    和增加后的宽度
            g:proj_window_width + g:proj_window_increment
    之间切换.

    是否能够切换原窗口和宽窗口, 或手动改变窗口宽度均取决于全局变量
    g:proj_flags 中的标志位 't' 是否设置. (参见|project-flags|).

    注意在其他窗口中单击鼠标时右键并不能自动将光标定位到项目窗口.
    在离开项目窗口后, 项目窗口宽度会变回到原宽度 g:proj_window_width.

<space> 同 <RightMouse>

<CTRL-Up>
\<Up>
    移动文本或者折叠到当前光标的上一行. 在有的终端中可能无法识别此绑定而失效.
    <LocalLeader><Up> 主要是为那些不能识别 <C-Up> 的终端而提供的.

<CTRL-Down>
\<Down>
    移动文本或者折叠到当前光标的下一行. 在有的终端中可能无法识别此绑定而失效.
    <LocalLeader><Down> 主要是为那些不能识别 <C-Down>.

\i    在状态栏中显示光标所在折叠完全解析和继承的参数. 
    这是专门为手动进入项目时进行相对路径和继承参数的调试而映射的.

\I    在状态栏显示光标下文件名的全名(含路径). 此功能是插件调用
    Project_GetFname(line('.'))函数来实现的.

\1 - \9
    执行在 g:proj_run{x} 指定的命令, {x} 是执行命令入口的编号.
    参考下文中的 g:proj_run1.

\f1-\f9
    执行 g:proj_run_fold{x} 中指定的命令, {x} 执行命令入口的编号, 命令只针
    对当前项目层的文件. 参考下文中的|project-settings|.

\F1-\F9
    执行 g:proj_run_fold{x} 中指定的命令, {x} 是执行命令入口的编号. 对当前
    项目层及其所有子项目的所有文件执行命令. 参考下文中的 |project-settings|

\0    显示由 \1 到 \9 定义的命令.

\f0    显示由 \f1 到 \f9 和 \F1 到 \F9 所定义的命令. \F0 作用与此相同.

\l    加载当前项目中的所有文件到 Vim 中, 在加载过程中按任何键可以停止加载.

\L    加载当前项目及其子项目中的所有文件到 Vim 中. 请谨慎使用这个映射, 作者并
        不建议在项目中含有成千上万的文件时使用该映射. (顺便提一句, 我的项目中有
    5,300 多个文件!) 在加载过程中按任何键可以停止加载.

\w    删除当前项目层次中的所有文件. (并非真正删除文件, 只针对该项目组织而言.
    如果文件被修改, 会先保存文件.) 擦除过程中按任意键可以停止此操作.

\W    删除当前项目层及其子层次中的所有文件. (并非真正删除文件, 只针对该项目组
    织而言.    如果文件被修改, 会先保存文件.) 擦除过程中按任意键可以停止此操作.

\g    搜索当前项目层所有文件.

\G    搜索项目所有层所有文件.

\e    为先通过 <Return> 选择的项目文件设置环境变量. 例如在 \e 设定环境变量后,
    无需打开项目中的任何文件便可用 :make 来进行编译.

\E    使用 |file-explorer| 浏览光标处目录内的文件. 不支持 netrw 时的项目管理.

<F12>    当在变量 g:proj_flags (参考 |project-flags|)中使用了标志位 'g' 时, 该键
        用来切换打开和关闭项目窗口. 可以在 vimrc 中进行重新绑定. 例如将其映射到
        <Leader>P:

        nmap <silent> <Leader>P <Plug>ToggleProject

注意由于使用 :help 时帮助窗口跟项目窗口有所冲突, 该插件通过重新映射 :help避免了
这个问题(在使用时你可能无法感觉出来).

==============================================================================
ADDING MAPPINGS                      *project-adding-mappings*
添加映射

也可单独在 $HOME/.vimproject_mappings 文件中设置自己需要的映射. 如果这个文件存
在, 插件每次启动时候会执行(source)它. 下例中定义了统计项目中入口数量功能的映射
当按下 \K (Kount, 这因为 C 与 K 谐音 :-):时候会显示统计结果 >

    function! s:Wc()
        let b:loadcount=0
        function! SpawnExec(infoline, fname, lineno, data)
        let b:loadcount = b:loadcount + 1
        if getchar(0) != 0 | let b:stop_everything=1 | endif
        endfunction
        call Project_ForEach(1, line('.'), "*SpawnExec", 0, '')
        delfunction SpawnExec
        echon b:loadcount." Files\r"
        unlet b:loadcount
        if exists("b:stop_everything")
        unlet b:stop_everything
        echon "Aborted.\r"
    endif
    endfunction

    nnoremap <buffer> <silent> <LocalLeader>K :call <SID>Wc()<CR>

下例在 $HOME/.vimproject_mappings 中实现了插件对perforce的整合:
>
    function! s:DoP4(cmd)
       let name=Project_GetFname(line('.'))
       let dir=substitute(name, '\(.*\)/.*', '\1', 'g')
       exec 'cd '.dir
       exec "!".a:cmd.' '.Project_GetFname(line('.'))
       cd -
    endfunction

    nmap <buffer> <silent> \pa :call <SID>DoP4("p4add")<CR>
    nmap <buffer> <silent> \pe :call <SID>DoP4("p4edit")<CR>
<
(注意我进入文件所在目录后才可以使用 $P4CONFIG 文件. 请参考关于 perforce 的文档.)

这就建立了使用映射 \pe 来检查用于编辑的文件, 用 \pa 来将文件存储.


下例中为 <Return> 在打开某种特定文件时映射到一个外部程序来. (该例中它调
用 ee 来浏览jpg文件). 尽管看起来有些刻意, 但它还是有点用的.
>
    let s:sid = substitute(maparg('<Return>', 'n'), '.*\(<SNR>.\{-}\)_.*', '\1', '')
    function! s:LaunchOrWhat()
        let fname=Project_GetFname(line('.'))
        if fname =~ '\.jpg$'
        exec 'silent! !ee "'.fname.'"&'
        else
        call {s:sid}_DoFoldOrOpenEntry('', 'e')
        endif
    endfunction
    nnoremap <buffer> <silent> <Return>   \|:call <SID>LaunchOrWhat()<CR>
<
该例中调用外部程序来查看后缀名为jpg的文件, 对其他文件则仍以原 <Return> 处理.

==============================================================================
SETTINGS                            *project-settings*

在 vimrc 文件中设定下述变量后, Vim 会在加载插件前先使用这些属性从而不按照插
件的默认属性进行加载.

g:proj_window_width
    插件项目窗口宽度.    默认值: 24

    尽管插件不能完全成功地按照我预想的方式设定窗口的大小,但是这个变量在
    设定窗口大小时还是会起到很大的作用.

g:proj_window_increment
    当按空格键 <space> 或者单击鼠标左键 <LeftMouse >时项目窗口宽度增加量
    默认值: 100 (参见 |project-mappings|)

                                   *project-flags*
g:proj_flags
    默认值: "imst"
    这些标志位可以用来控制插件的行为, 具体如下:

       标志位    描述 ~

    b    设置后将使用 |browse()| 通过浏览目录来为 \c 和 \C 设定目录.
        默认关闭, 因为窗口浏览器本身不允许进行目录的选择.

    c    设置后, 在项目窗口中打开文件后会自动关闭项目窗口.

    F    显示浮动项目窗口. 关闭窗口的自动调整大小和窗口替换.
        This allows placement between other windows that wish to share
        similar placement at the side of the screen. 
        在使用外部窗口管理器的时候很有用.

    g    设置后会将切换打开和关闭项目窗口映射到 <F12> 上.

    i    设置后, 当选择打开一个文件时会在命令行显示文件名和当前工作路径.

    l    设置后, 项目插件在选择一个要打开的文件时,使用命令 |:lcd| 替换默
        认的 |:cd| 命令去改变目录. 在有了下面的 L 标志位后, 此标志已经
        用处不大.

    L    与标志位 l 很相似. 不管缓冲是否被使用, 它通过安装一个进入/离开
        缓冲的自动命令|:autocommand| 来确保当前工作目录更改到 CD 参数
        指定的目录.(|:lcd| 命令只能为窗口而不能为缓冲改变当前工作目录)

    m    在常规模式下开启 |CTRL-W_o| 和 |CTRL-W_CTRL_O| 映射, 使得当前
        缓冲区成为唯一可见的缓冲区, 但是项目窗口仍然可见.

    n    设置后将在项目窗口中显示行号.

    s    设置后将在项目窗口中使用语法高亮.

    S    设置后将在更新和创建项目时启用排序.

    t    设置后将在按空格 <space> 或鼠标右击 <RightMouse> 时候进行原窗口
        和加宽窗口之间的切换. 参见 See the entry for  in |project-mappings|.

    T    设置后,    子项目的折叠在更新时会紧跟在当前折叠下方显示(而不是其底
        部).

    v    设置后将, 按 \G 搜索时用 :vimgrep 取代 :grep.

g:proj_run1 ...  g:proj_run9
        包含一个作用于文件的 Vim 命令, 参考前文中关于 \1 to \9 的映射.
 
          %f 替换文件的全路径和文件名
          %F 替换文件的全路径和文件名
          is 替换文件的全路径和包含空格的文件
          %n 只替换文件名
          %N 只替换包含空格的文件名
          %h 替换项目主目录
          %H 替换包含空格的项目主目录
          %r 替换与 CD 目录相关联的路径
          %R 替换与包含空格的 CD 目录相关联的路径
          %d 替换 CD 目录.
          %D 替换包含空格的 CD 目录
          %% 未使用

        例如, 如果在 vimrc 中做了如下设置, 在当前光标下按下 \3 时将调
        出 gvim : >
         let g:proj_run3='silent !gvim %f'
<        其他的几个例子: >
         let g:proj_run1='!p4 edit %f'
         let g:proj_run2='!p4 add %f'
         let g:proj_run4="echo 'Viewing %f'|sil !xterm -e less %f &"
<
        在 Windows 系统中应用单引号括住 %f, %h, %d 以避免 \ 引起的转义.

g:proj_run_fold1 ...  g:proj_run_fold9
        包含一个作用于折叠内文件的 Vim 命令. 参考前文中关于 \f1 to \f9
            和 \F1 to \F9 的映射部分.$HOME/.vimproject_mappings
 
        %f 替换文件名, %h 替换项目的主目录, %d 替换 CD 目录.
        对应多个文件名有两种处理方式:

        第一种(默认的)处理方式使用 %f 替换所有的绝对文件名, 让命令只执
        行一次;    第二种是让命令针对每个非绝对文件名执行一次, %f 每次只
        替换一个文件名. 使用第二种方式时, 须在变量 g:proj_run_fold{x}
        的开头加上一个通配符 '*' (通配符 '*' 在运行时将被自动去掉.)

        例如, 注意以下两种方式的差异: >
         let g:proj_run_fold3="*echo '%h/%f'"
         let g:proj_run_fold4="echo '%f'"
<
        注意在Windows系统中, 需要用 '' 将 %f, %h, %c 括起来, 否则路径中
        使用的 \ 会出问题. 另一种办法是把它们放在 |escape()| 函数中.


==============================================================================
PROJECT EXAMPLE FILE                         *project-example*

例子: 项目文件(~/.vimprojects): >

  1    My Project=~/c/project CD=. in=in.vim out=out.vim flags=r {
  2     Makefile
  3      in.vim
  4      out.vim
  5     GUI Files=. filter="gui*.c gui*.h" {
  6      gui_window.c
  7      gui_dialog.c
  8      gui_list.c
  9      gui.h           # Header file
 10     }
 11     Database Files=. filter="data*.c data*.h" {
 12      data_read.c
 13      data_write.c
 14      data.h
 15     }
 16     OS-Specific Files {
 17      Win32=. filter="os_win32*.c os_win32*.h" {
 18       os_win32_gui.c
 19       os_win32_io.c
 20      }
 21      Unix=. filter="os_unix*.c os_unix*.h" {
 22       os_unix_gui.c
 23       os_unix_io.c
 24      }
 25     }
 26    }

(注意左侧的行号不是文件内容.)


==============================================================================
插件技巧                             *project-tips*

1.  先为项目创建一个入口: >

    Label=~/wherever CD=. filter="*.c *.h" {
    }
<
    然后将光标定位在折叠上按 \r, 脚本会自动添加对应目录下所有 C 文件(本例中)
    到项目之中. 这与 \c 是等效的, 只是没有对话框显示.

2.  可以在项目列表里随时添加,删除或排序项目文件.

3.  当项目窗口没有打开时, 输入 >
    :Project
<   可以将其打开. (插件有自动记忆功能, 而无需输入具体的项目名称.) 如果在
    g:proj_flags 变量中设定了 'm' 标志位, 通过组合键 |CTRL-W_o| 可以重新打开
    项目窗口. 毫无疑问, 这会关闭除当前窗口之外的其他所有打开的窗口.

4.  往项目中添加新的文件. 例如添加 'more.c' 到项目中去, 只需在项目入口之中插
    入文件名后按 <Return> 键即可.

5.  当使用 |quickfix| 时候, 在文件名上按回车键 <Return> 并不会有效, 这样的话,
    将无法更改目录, 运行脚本. 解决办法是在使用 |quickfix| 前用 \L 将所有文件
    载入到项目中去.

6.  当项目窗口因为或开或闭的折叠显得凌乱时, 使用 |zM| 可以关闭所有的展开折叠,
    让项目窗口重新变得整洁如初.

7.  对于高级用户, 可以尝试插件提供如下几个函数:
    Project_GetAllFnames()
    返回一个折叠及其子项目(可选)下的所有文件名. 
    Project_ForEach()
    在为项目中的每个文件提供一个调用函数的接口.如何使用请参考上面的例子以
    及源代码.
    Project_GetFname(line_number)
    在编写自己的映射时用来获取文件名.

8.  将光标定位到项目插件窗口的键映射, 在 vimrc 文件中添加:
>
        nmap <silent> <Leader>P :Project<CR>
<
9.  项目入口中使用符号"."会调出|file-explorer|插件. 为了防止在更新时候删除,
    在项目入口中加入:
>
     . # pragma keep
<
==============================================================================
致谢

    感谢下列朋友为我在此插件开发过程中提供一些补丁:

        Tomas Zellerin
        Lawrence Kesteloot
        Dave Eggum
        A Harrison
        Thomas Link
        Richard Bair
        Eric Arnold
        Peter Jones
        Eric Van Dewoestine

 vim:ts=8 sw=8 noexpandtab tw=80 ft=help:

posted @ 2007-11-19 19:11 Dr.Magic 阅读(7481) | 评论 (0)编辑 收藏
点击这里给我发消息
posted @ 2007-04-25 18:48 Dr.Magic 阅读(114) | 评论 (0)编辑 收藏
     摘要: WTL Makes UI Programming a Joy,  Part 1: The Basics     The Windows Template Library (WTL) is availab...  阅读全文
posted @ 2006-03-27 15:47 Dr.Magic 阅读(2674) | 评论 (0)编辑 收藏
     摘要: Event Programming in C++ (Part I) Q:微软的.NET框架让我们能够为托管类定义事件并通过代理和”+=”操作符对其进行处理.那么在本地C++中有没有同样的方法呢,它看起来很有用.       某些读者   A:事实上确实有! Visual C++® .NET有种称为”统一事件模型”的东西能...  阅读全文
posted @ 2006-03-16 11:08 Dr.Magic 阅读(894) | 评论 (2)编辑 收藏
仅列出标题