BBS水木清华站∶精华区

 
文件的搜寻 
 
搜寻特定的字串,并非 EMACS 所特有的功能,相信大多数的 
编辑器都具有如此的功能。但 EMACS 所采取的搜寻方法是, 
每键入一个字元就展开搜寻,EMACS 称此种方式的搜寻为 
Incremental Search 。 
当然, EMACS 
也提供非  Incremental Search} ,称为  Nonincremental Search。 
     EMACS 对於所要搜寻的字串,仍是利用  minibuffer 
来输入所欲搜寻的字串。 
此时,输入  minibuffer 的搜寻字串,若全由小写的英文字母 
(lower case)组成,则 EMACS 在展开搜寻的行动时,不论字母 
是否有大小写的差别,会将所有与  minibuffer 具有相同 
英文字母的字串都找寻出来。例如在  minibuffer 处输入 abc, 
EMACS 会找寻abc、 Abc、aBc、 abC、ABc、aBC、ABC 等字串。 
所以在  minibuffer 处输入小写的英文字母,就表示所要找寻 
的字串包括大写的字母在内。 
 
     如何直接找寻上述例子的 ABC,而不需经过 
abc、Abc、aBc、 abC、 ABc、ABC 等字串呢?欲达如此的效果, 
必需在  minibuffer 处,给予大写字母(upper case)的字串。 
例如,在  minibuffer 处,给予 ABC 的字串,此时,缓冲区 
的内容若为abc、 Abc、aBc、 abC、ABc、aBC、ABC  ,则会 
直接搜寻 ABC 。所以在  minibuffer 处输入大写的英文字串时, 
EMACS 所找寻字串的大小写,就会与minibuffer 字串的大小写 
完全一样。 此种对大小写极度敏感的作法,称为  case sensitive。 
EMACS 对於大小写出现的位置也有差别,现在就先来讨论 
case sensitive 的问题。 
 
   * minibuffer 的字母都是小写,则可能找到的字串,包含 
     所有大小写的字串。 
     原始文件:abc、 Abc、aBc、 abC、ABc、aBC、ABC 
     输入  minibuffer 的字串: abc 
           search string:abc、 Abc、aBc、 abC、ABc、aBC、ABC 
   * minibuffer中的字母,若有任一个以上的字母是大写,则可能 
     找到的字串,就如同  minibuffer 所示的一样。 
     原始文件:abc、 Abc、aBc、 abC、ABc、aBC、ABC 
 
        o  输入 minibuffer 的字串: Abc 
                      search string:Abc 
        o  输入 minibuffer 的字串: aBc 
                      search string:aBc 
        o  输入 minibuffer 的字串: ABc 
                      search string:ABc 
        o  输入 minibuffer 的字串: ABC 
                      search string:ABC 
 
如果希望  minibuffer 输入什麽,缓冲区就找到什麽时, 
例如,在 minibuffer中输入 abc,所要找寻的字串就是 abc。 
此时就必需修改 EMACS ``case-fold-search'' 变数的值为 ``nil''。 
因为EMACS 对此变数的预设值是 t,它的意思就是使搜寻成为 
case sensitive。若将此变数改成非 case sensitive 时,在 
minibuffer} 输入 abc,就只会找寻 abc。 
 
     知道了 EMACS 对大小写的处理程序後,现在就来谈谈 
 incremental search和noincremental search。键入 
第一个字母至minibuffer 时,搜寻的序幕就展开,是为 
incremental search。 
     使用  incremental search时,当  minibuffer 
收到第一个搜寻字母时,搜寻行动就从游标所在位置向下开始搜索。 
此时的游标,会从原先游标所在位置移至其下第一个出现此字母的 
地方;当 minibuffer 出现两个字元时,游标也移至其下出现 
此两个字元的地方。当然,这些都必需要以缓冲区中有这些文字为前题, 
若找不到任何合适的文字时, 
 echo area 会出现 ``Failing I-search:'' 的警示语。 
     在 EMACS 中执行  incremental search的方法有两种, 
一种是往前的搜寻( forward search),另一种是回头的搜寻 
( backward search。如下,就是二种搜寻所使用的指令: 
 
   *  Ctrl-s (isearch-forward) 
           游标所在处向前(右)搜寻。 
   *  Ctrl-r (isearch-backward) 
           游标所在处往回(左)搜寻。 
 
当使用 Ctrl-s 或 Ctrl-r指令时, EMACS 的 
 echo area 会出现 ``I-search:''或 ``I-serach backward:''。当出现这些 
提示字时,就表示其後是要输入搜寻字串。只要键入第一个字元, 
搜寻的行动就立即展开了。 虽然如此,仍有几个有关搜寻的关键字 
必需先行讨论,它们是 ``RET''、 ``DEL'' 与``Ctrl-g''。 
 
   *  RET 
     当  minibuffer收到 RET 时,游标会停留在最後一个满足搜寻 
     条件之处,且结束搜寻的动作。这种做法的好处是,若所找的资料 
     就是所要的,且又是必需修改的资料,游标停留在该处,即可立即处理。 
     因为,有些离开搜寻状态的方法,会使游标到第一次执行搜寻的位置, 
     这就是下面要谈的`` Ctrl-g'' 的处理原则。 
   * Ctrl-g``Ctrl-g'' 的用法有二种,其一、是离开搜寻,承如上面所言; 
     其二、就是当所键入的搜寻字串,无法找到完全符合的对应字串时, 
     可利用 ``Ctrl-g'' 将minibuffer中所能找到的子字串留下, 
     而将不能找到的资料除去。 
     所以,若已经找到所要的字串而想离开搜寻时,键入 ``Ctrl-g'' 
     除了可以离开搜寻外,还可以将游标带回原先的出发点。根据 
     minibuffer 处所给予的资料,完全无误的在缓冲区中找到相对应 
     的文字後,以 ``Ctrl-g'' 可将游标归回原位。但若所给予的资料在缓冲区 
     中无法找到完全对应的字,此时,若想离开搜寻的状态,就必需用「两次」 
     的 ``Ctrl-g'' 才可完全脱离搜寻的状态。 
 
     此时,键入的第一个 ``Ctrl-g'' minibuffer 所找到的字串留下,而将 
     无法兑现的字串删除。此时再键入一次 ``Ctrl-g'' ,则会完全离开搜寻的 
     状态,而游标也会自动移回展开搜寻时的位置。 
   *  DEL 
     想要修改  minibuffer 内的字串时,请用DEL(delete-backward-char)  。 
     还记得它吗?它是用来删除字元的,此删除的动作是往回的删除。每执行 
     一次的DEL,就是一个新字串的诞生, 也就是一个新搜寻的展开。值得注意 
     的是,此新展开的搜寻与原先的搜寻方向相反,这个设计是合理的。 因为, 
     只要minibuffer 输入任何一个字,搜寻就己展开了,此时,若以DEL 来 
     删除错误的输入,则表示先前所找到的字串也不符需要,所以只能重新来过 
     才是可行之路。这也就是为何每删掉一个字元,搜寻的行动会回走的理由了。 
 
要使用搜寻的指令,只需键入 ``Ctrl-s'' 。此时minibuffer会出现 
``I-search:''。若键入 Ctrl-r 後,则出现 ``I-search backward:''。 
 
使用搜寻的指令,会有若干情形出现: 
 
   *  首次搜寻,即觅得所要的字串。 
     使用者此时可根据所需来做适当的处理。例如,离开搜寻,修改搜寻到 
     的资料等等。 
   *  搜寻不利,必需一而再,再而三的努力,才能找到所要的字串。 
     此时只要重复使用 `` Ctrl-s'' ,游标就移至下一个符合的字串。所以, 
     只要所找寻的字串不变.就不需要再给予搜寻的字串。重复使用 
     `` Ctrl-s'' 的结果,仍无法找到所要的字串,echo area 会回应出 
      ``Failing I-search:'' 的讯息。 
   *  若重复使用 `` Ctrl-s'' 的结果,已使  echo area 出现 
     ``Failing I-search''後,则表示缓冲区已到了极限。若想再查看已阅□ 
     过的资料,只要再使用一次 `` Ctrl-s'' ,就会迫使搜寻从原来的启始点 
     再进行一次的搜寻。 
   *  搜寻的过程中,若想回头再查阅已看过的资料时,只要交替使用 
           `` Ctrl-s'' 与 `` Ctrl-r'' ,就可以了。 
 
EMACS 可以将搜寻过的字串,再拿出来重复使用。因为,EMACS 
将使用过的搜寻字串,都放在一个名为  search ring的变数中。 
它与先前讨论过的  kill-ring 类似,都为变数。既为变数,其值就可以 
增减与参阅的。至於如何查阅变数的值,请再行参考 4.4 节 
(EMACS buffer and windows)。 
 
     再使用搜寻过的字串,只要将 `` serach-ring''此一变数的 
值取出即可。取出其值的方法有两种,一种是往前(右)的取出, 
另一种是往回(左)的撷取,其分界点是以最新使用过的搜寻字串 
为分野。因为 `` search-ring'' 为一个ring,所以撷取的方式, 
不是采顺时锺的方向,就是采反时锺的方向。今举一实例说明之。 
 
以下是以 `` Ctrl-h v'' 所得到有关 `` search-ring'' 的资料。 
 
search-ring's value is ("kill" "Ctrl" "tex" "Ctrl-h" "text" "search") 
 
Documentation: 
List of search string sequences. 
 
此时 `` search-ring''  的变数值是: 
 
        kill、 Ctrl、 tex、 Ctrl-h、 text 、 search 
最新的搜寻字串则位於最前端,此时为 ``kill'' 。往前(右)所得 
的字串则为``Ctrl'',往回(左)所得的字串则为 ``search''。 
今以此例,将使用`` search-ring'' 得取使用过的搜寻资料的步骤 
说明如下: 
 
   *  首先键入 Ctrl-s 或 Ctrl-r 
 
 
 
        o   ESC-p 
             当  echo area 出现 I-search: 後,再键入``ESC-p'', 
             则可得到 ``Ctrl''的字串。若想继续往前寻找使用过的字串, 
             只要重复键入``ESC-p'' 即可。 
 
        o   ESC-n\indexESC-n 
             当  echo area 出现 I-search: 後,再键入ESC-n,则可得到 
             ``search'' 的字串。若想继续往回寻找使用过的字串,只要重复 
             键入 ``ESC-n'' 即可。 
 
 
除了  search-ring 的资料可再使用外,将拷贝技巧运用在搜寻上, 
也是资料再使用的另一项运用。 
 
拷贝在搜寻上的运用,就是将缓冲区的资料拷贝至  echo area 出现 
I-search: 後的  minibuffer 处。经此拷贝的过程,任何大小 
的字串,都可使它轻易的出现在  minibuffer 处。 
 
以下就是使用的方法: 
 
   *  键入 Ctrl-y 
     若要将游标所在位置到列尾的所有资料,放入  minibuffer 处, 
     `` Ctrl-y'' 可完成此一任务。 
   *  键入 Ctrl-w 
     若只想拷贝游标所在位置之後的字(word),使用 `` Ctrl-w'' 
     是一个很好的选择。 `` Ctrl-w'' 是拷贝缓冲区上的一个字(word) 
     到 minibuffer 。其拷贝的□围是以游标所在地为准则, 
     若游标位於一字的第一个字元时,则拷贝整个的字到minibuffer 处, 
     若游标所在位置不在字首,则将游标之後的次字串拷贝至 
     minibuffer 处。 
   *  键入 ESC-y(yank-pop) 
     向  kill-ring 借资料也是可行的方法之一。使用 `` Ctrl-s'' 
     或`` Ctrl-r'' 指令後,可使用 `` ESC-y'' 将原先放於kill-ring 
     的资料拷贝於minibuffer 处。可惜的是,此方法只能将最新被删除 
     的资料来出用。 
 
到此为止,所谈的搜寻都是  incremental search的搜寻,现在来谈谈 
 nonincremental search。  nonincremental search 
是一般编辑器处理搜寻最常用的方法,所以又将其称为传统的用法。 
 
 nonincremental search的使用,必需从  incremental search开始。 
当以 `` Ctrl-s'' 或 `` Ctrl-r'' 启动  incremental search後,待  echo area 
出现 ``I-search:'' 或``I-search backward:'' 後,只键入 RET 而不给予 
任何其它的字串,此时就启动了  nonincremental search.当然echo area 
出现的讯息会不一样,此时  echo area 出现的讯息 ``Search:'' 或 
``Search backward:''。所以要使用  incremental search或 
 nonincremental search,完全取决於键入  minibuffer 的内容 
而定。若为只键入 RET ,就是选择  nonincremental serach。 
 
在启动了  nonincremental search之後,在 ``Search:'' 或 
``Search backward:''之後键入 ``Ctrl-w'',则表示要执行字的搜寻 
(Words Search)。此功能可以用来搜寻一组的字,只要在 minibuffer 
中将所要搜寻字群以一个空白隔开,就表示所要搜寻的是一个 
字群了。以下将  nonincremental serach 的相关指令整理如下: 
 
   *   nonincremental 字串(string)的搜寻 
 
 
 
        o   Ctrl-r RET  string RET 
 
        o   Ctrl-s RET  string RET 
 
 
   *   nonincremental 字(word)的搜寻 
 
 
 
        o   Ctrl-r RET Ctrl-w  words RET 
 
        o   Ctrl-s RET Ctrl-w  words RET 
 
 
还有一种搜寻不论是  incremental search或 nonincremental search 
都有的,那就是  regular expression,简称为Regexp。 
所谓的  regular expression就是以最少的字元组合来表示最大可能的巨集。 
现先不讨论如何来表达 regular expression ,只讨论如何使用 
regular expression 的搜寻。 
因为有关  regular expression 会有专节(6.3 节)来讨论。 
 
   *   Regexp 的  incremental search 
 
 
 
        o ESC-Ctrl-s(isearch-forward-regexp) 
             使用Regexp 的搜寻方法: 
             先按下 ``ESC'' 之後再将其放掉,随後再按下 ``Ctrl-s'', 
             echo area 处就会出现 
                   Regexp I-search: 
             这时就可以输入  Regexp 的表示字串了。 
             当然还有若干事与  Regexp 的搜寻有关,讨论如下: 
 
 
 
             +  若要继续以  Regexp 的方法搜寻,只需继续键入 
                  ``Ctrl-s'' 就可找到下一笔相关的资料。 
 
             + Regexp 的搜寻,也有其独立的  search-ring。 
                   这也意谓著可以再使用  Regexp 的  search ring 。 
                   其使用法与前所讨论的方法一样,就是以 `` ESC-p'' 与 
                   `` ESC-n'' 来再使用Regexp 的  search-ring。 
 
 
 
        o   ESC-Ctrl-r(isearch-backward-regexp) 
              往回(左)的  Regexp 搜寻,若想继续的往回找寻想要的字串, 
              只需键入 `` Ctrl-r'' 即可。当然,也可以 `` ESC-p'' 与 
              `` ESC-n'' 来再使用其  search-ring。 
 
 
   *   nonincremental search 
         以下是以  Regexp 来执行  nonincremental search的方法。 
 
 
 
        o   ESC-x re-search-forward 
 
        o   ESC-x re-search-backward 
 
 
搜寻缓冲区的内容,除了要参考其内容外,有很大的机率是希望 
能将找到的内容以它种内容取代。取代( Replacement)的方法, 
就是下一节讨论的主题。 

BBS水木清华站∶精华区