BBS水木清华站∶精华区

 
文件的取代 
 
从事编辑工作的时候,常会为了某种需求而将某一共同的用语 
以另外一种语辞替换,此情形最常发生在撰写程式的时候。 
当然,英文字串由大写改为小写或小写改为大写也是经常可见的。 
编辑文件在处理这些事时,就如如下的若干问题产生。 
 
  1.  所有要修改的文件,都能如愿以偿的得到适当的修改,不会 
     有漏网之鱼发生。 
  2.  修改过文件的一致性,是必要的条件。 
 
因为有这些问题的考量,所以使用  replacement 来完成如是的工作, 
就成为最佳的解决之道。现在就来谈谈 EMACS 如何处理 replacement 
的问题。 
 
EMACS 处理  replacement 的方法有一气呵成的取代, 
与选择性的取代二种。 
所给予的被取代文字也有二种, 
一、被取代的字串完全与所给予的字串一样; 
二、以 Regexp 来做为取代的依据。试分述之。 
 
   *  二种的取代方法 
 
 
 
        o  一气呵成的取代 
             所谓一气呵成的取代,是一鼓作气将游标之後所有符合条件的 
             字串,全部以新字串取而代之。 
             此作法不会一一徵求是否要取而代之的意见,而是自动、全盘 
             且无条件的取代。 
             此作法称为  Unconditional Replacement。 
 
        o  选择性的取代 
             选择性的取代,是会先徵求取代的意见,只有在取得同意权时, 
             才会采取取代的行动。这种取代的行为称为  query replacement。 
 
 
   *  二种被取代字串的表示法 
 
 
 
        o  被取代的字串完全与所给予的字串一样。 
             此方法所要取代的文字,与  minibuffer 中所给予的文字一样。 
             所以,其可能符合条件的选择最多也只有一种。 
 
        o  Regexp 来做为取代的依据。 
             此方法就是以  Regexp 来表示所要找寻的字串集。前已论及,所谓的 
             Regexp 就是以最少的字元组来表达最多的巨集。此时的取代, 
             就不是单一字串的取代而是某一集合中的所有字串的取代。 
             所以,以此所得的取代字串就有多重的选择。如何表达正确的  Regexp 
             会在下一节中详细讨论。 
 
 
以下就是使用取代( replacement)的方法。 
 
   *   Unconditional Replace 
     进行取代时不事先徵求意见,迳行将缓冲区中游标所在位置(包括 
     游标所在位置本身)之後,所有符合的字串都以新字串取而代之。 
 
 
 
        o  ESC-x replace-string RET  string RET  newstring RET 
               此指令是将缓冲区中,所有出现  string 的字串以newstring 取代。 
               其详细的步骤如下: 
 
 
 
            1.  键入 ``ESC-x replace-string'',当按下 RET 时, 
                        echo area 会出现 
 
                              Replace string: 
 
                     此时可利用 ``Replace string:'' 後的  minibuffer , 
                     将所要被取代的字串输入,按下 RET 则表示已完成输入的工作 。 
 
            2.  按下 RET 时, echo area 会出现如下讯息: 
 
                         Replace string  string with: 
 
                     此时可利用  minibuffer 给予所要取代的新字串。 键入 
                     RET 时,游标所在位置之後的所有  string 都会转换成newstring。 
 
            3.  当转换完成後, echo area 会出现 ``done''。此时就已 
                      大功告成了。 
 
 
 
        o   ESC-x replace-Regexp RET  Regexp RETnewstring RET 
                   此方法与上一个方法雷同,不同之处在於所要取代的资料不是 
                   某一个特定的字串,而是某一巨集的字串组。从指令的表示法, 
                   也可以看出所给予的被取代字串是 ``Regexp'' 而非 ``string''。 
                   其详细的执行步骤与字串的取代雷同,只是在  echo area 将所有 
                   的  string 换成  Regexp罢了。 
 
 
   *   Query Replace 
     Query Replace顾名思义就是在取代时会徵询取代的意见, 
     使用者可根据需要来取决是否要进行取代。以下就介绍字串和 
     Regexp 的取代。 
 
 
 
        o ESC-x query-replace RET  string RET  newstring RET 
             使用  query replace 的方法及步骤与 
             unconditional replace的方法雷同,不同处只在於所引用的 
             指令有异,以及多增了询问的选择。其详细步骤如下 
           (斜体字表示使用者所输入的资料,粗体字表示系统自行根据 
             输入资料的回应): 
 
 
 
            1.  ESC-x query-replace RET 
 
            2.  Query replace:  Regexp RET 
 
            3.  Query replace  Regexp with:  newstring RET 
 
            4.  Query replacing  Regexp with  newstring:(? for help) 
                      此步骤是 query replace 与 unconditional replace 
                      最大不同之处。因为所有徵询的工作都是从此展开。 
                      不知如何使用徵询的使用者可键入 ``?'' 来得到线上的求助。 
                      以下就是键入 ``?'' 系统给予的资讯。 
 
                   Query replacing Regexp with string. 
 
                   Type Space or `y' to replace one match, Delete or `n' to skip to next, 
 
                   RET or `q' to exit, Period to replace one match and exit, 
 
                   Comma to replace but not move point immediately, 
 
                   C-r to enter recursive edit (M-C-c to get out again), 
 
                   C-w to delete match and recursive edit, 
 
                   C-l to clear the screen, redisplay, and offer same replacement again, 
 
                   ! to replace all remaining matches with no more questions, 
 
                   ^ to move point back to previous match. 
 
                        使用  query replace 时可有多种选择项。现只介绍常用的几个选项: 
 
 
 
                 1.   Space 或  y 
                         当决定以新的字串取代原来的字串时,以  Space 或  y 来表示。 
                         执行  query replace 时,游标会移至下一个合适的字串处, 
                         此时若决定将其取代,则键入 ``Space'' 或 ``y''。当取代完成後, 
                         游标会自动移至下一个合适的字串处。当然也可以放弃所找到 
                         的字串,这就是下一个要讨论的选项了。 
 
                 2.   Delete 或  n 
                         放弃字串的取代,使游标移至下一个目的地,是  Delete 或n 
                         所做的事情。 
 
                 3.   .(Period) 
                         若已找到合适的字串,而想终止所有进一步的取代行为时, 
                         键入``.''可使目前游标所在处的字串以新的字串取代,并且 
                         在取代後立即离开query replace 的状态。 
 
                 4.    ! 
                         `` !'' 可使  query replace 恢复为unconditional replace。 
                         因此,若想放弃询问的权利而恢复  unconditional replace 的 
                         状态,键入 ``!'' 就可将游标所位置及其以後所有合适的字串, 
                         都以新字串取而代之。 
 
                 5.   RET 或 `` q'' 
                         若想就此离开  query-replace 而不再做进一步的取代动作, 
                         只需按下RET  或 ``q'' 即可。 
 
 
 
 
 
        o   ESC-x query-replace-Regexp RET  Regexp RET  newstring RET 
              此方法与 `` ESC-x query-replace RET  string RET  newstring RET'' 
              相似,但此时所取代的不是特定的字串,而是某一字串的巨集。 
 
 
字串大小写( case sensitive)的问题与取代也有很大 
的相关性。因为大小写的问题,对於  unconditional replace 与 
 query replace 均适用。所以,只举 query-replace 
为例说明,至於  unconditional replace 就如法泡制。 
当启动 `` ESC-x query-replace RET  string RET  newstring RET'' 
时, string 与  newstring 的大小写,关系不同字串的取代。 
其规则如下所述: 
 
   *  当  string 与  newstring 都以小写的形式出现时, 
           取代工作的进行,就有三种情形: 
 
 
 
        o  缓冲区原始字串的第一个字母是以小写为开端时,不论 
             此字串是否有其它的大写字母,经取代後全转换成小写。 
 
        o  若原始字串的每个字母都是大写时,经取代後也维持大写的形式。 
 
        o  若原始字串以大写为开端,不论此字串是否还有其它的字母 
             为大写,只要不是全为大写的情形,取代後只有字串的第一个 
             字母为大写,其馀一律为小写。 
 
 
        以下举一实例,供参考: 
        string :abc , newstring: xyz 
        原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
        经过取代为: xyz Xyz xyz xyz Xyz Xyz xyz XYZ 
   *  当  newstring 部份为大写,而  string 依然维持小写 
     的情形: 
 
 
 
        o  若原始字串的第一个字母为大写时,被取代後的第一个字母 
                     仍维持大写的形式。其馀原始字串的大小写,就视  newstring 
                     的大小写而定,与原始字串本身的大小写无关。 
 
        o   newstring 的字母若以大写出现,则被取代的原始字串 
                     也会在相对应的位置以大写的形式出现。 
 
        o  若原始字串全为大写时,取代後仍维持大写的形式。 
 
 
           以下为若干实例,供参考: 
 
 
 
        o   string :abc , newstring: Xyz 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: Xyz Xyz Xyz Xyz Xyz Xyz Xyz XYZ 
 
 
        o   string :abc , newstring: xYz 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: xYz XYz xYz xYz XYz XYz xYz XYZ 
 
 
        o   string :abc , newstring: xyZ 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: xyZ XyZ xyZ xyZ XyZ XyZ xyZ XYZ 
 
 
        o   string :abc , newstring: XYz 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: XYz XYz XYz XYz XYz XYz XYz XYZ 
 
 
        o   string :abc, newstring: xYZ 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: xYZ XYZ xYZ xYZ XYZ XYZ xYZ XYZ 
 
 
        o   string :abc , newstring: XYZ 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ 
 
 
 
   *   只要  string 有大写的字母出现时,取代後字串的大小写, 
           就完全依照  newstring 的大小写。换言之, newstring 
           为大写的地方依旧为大写,为小写的地方依然为小写。 
            以下为若干实例,供参考: 
 
 
 
        o   string :Abc , newstring: xyz 
                   原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                   经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz 
 
 
        o   string :aBc , newstring: xyz 
                   原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                   经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz 
 
 
        o   string :ABc , newstring: xyz 
                   原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                   经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz 
 
 
        o   string :ABC , newstring: xyz 
                   原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                   经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz 
 
 
        o   string :aBC , newstring: Xyz 
                   原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                   经过取代为: Xyz Xyz Xyz Xyz Xyz Xyz Xyz Xyz 
 
 
        o   string :Abc , newstring: xYz 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: xYz xYz xYz xYz xYz xYz xYz xYz 
 
 
        o   string :aBc , newstring: XYz 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为:XYz XYz XYz XYz XYz XYz XYz XYz 
 
 
        o   string :ABC , newstring: XYZ 
                  原始文件为: abc Abc aBc abC ABc AbC aBC ABC 
                  经过取代为: XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ 
 
 
 
讨论至此,取代的部份应该可以告一段落了。接下来,就是要将 
一直未正式讨论的 Regular Expression 做一详尽的说明。 

BBS水木清华站∶精华区