Linux 版 (精华区)

发信人: howdoit (第一个角球), 信区: Linux
标  题: EMACSulation:模板机制
发信站: 哈工大紫丁香 (Thu May 20 08:50:54 1999), 转信

"Linux公报...让Linux更富魅力!"

                     EMACSulation

                       作者Eric Marsden翻译gaia

          本专栏致力于让Emacs这种非凡的文本编辑器发 挥更

      大作用.在每一期里,我计划介绍一种Emacs扩展,它能让你

      工作起来更顺 手,让生活更美好.

模板机制

文档多半要遵从某种模板:即符合某种常规结构,如果每建立一个文档

都要输入 这些结构是很烦人的.大多数文字处理软件都认识到这一点,

允许你为商务信 函,技术报告,备忘录等分别创建模板.Emacs能做的比

这种静态"框架 "更好,因为它的模板机制能让你插入动态产生的文本,

可以根据文件名 ,登录名,日期,或shell命令输出的不同而不同. 

Emacs的自动插入机制允许你建立一个模板,此模板在文件一建立时就

根据新建 文件的名字或模式而起作用.比如,当你建立一个叫lsys.h的

新文 件时,它将问你是否执行 C / C++ header auto-insertion?,如

果 你回答yes,Emacs将插入如下这样的文本 

  

     

     /*********************************************************************

*      * lsys.h

      *

      * Eric Marsden  <emarsden@mail.dotcom.fr>

      * Time-stamp: <>

      *********************************************************************

*/     #ifndef _LSYS_H_

     #define _LSYS_H_

     

     

     

     

     #endif /* _LSYS_H_ */

注意 #ifndef 被自动产生以避免这个头文件被多次include.你也许

还希望加入其它内容如你们公司的版权声明,修改历史,或者RCS版本标

识号 .自动插入的内容依赖于 major mode: 当建立名叫 lsys.sgml 的

文件时,自动插入的文本可能会是 

  

     <!DOCTYPE ARTICLE PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [

     ]>

     <article>

       <artheader>

         <date>1999-03-01</date>

         <title> </title>

         <subtitle> </subtitle>

         <author>

           <firstname>Eric</firstname>

           <surname>Marsden</surname>

           <affiliation><orgname>CULTe</orgname></affiliation>

         </author>

         <authorinitials>ecm</authorinitials>

         <abstract>

           <para>

           

           </para>

         </abstract>

       </artheader>  

       

       <sect1><title> </title>

         <para>

         

         </para>    

       </sect1>

     </article>

[上面的HTML文本是由 Hrvoje Niksic的优秀的htmlize包产 生的,它

可以根据buffers的font-lock模式的字体颜色产生相应的HTML文件 .]

自动插入可以这样激活 

  

     (add-hook 'find-file-hooks 'auto-insert)

     (setq auto-insert-directory (expand-file-name "~/.autoinsert/"))

autoinsert package (由Charlie Martin开发)为几种模式 (mode)定制

了缺省的模板.要想自己定制自动插入的内容可以有如下两种方 法:最

简单的办法(不需要任何有关elisp的知识)是把一些文件放在 

  

     (define-auto-insert "\\.html\\'" "autoinsert.html")

其中"\\.html\\'" 是一个规则表达式( regular expression),它匹配

以 .html 结尾的文件名(注意是用匹配字串结尾的 \\' ,而不用匹配行

结尾的 $ ,因 为文件名允许含有换行符). 这样就能在你创建一个名

字以 .html结尾的文件时,把 ~/.autoinsert/autoinsert.html 文件里的

内容自动插入进去.这 种方法只能插入静态内容.如果你懂一点Emacs

Lisp,插入动态产生的内容也 是可能的;下面这段代码就能产生C/C++

头文件的框架,就像本文的第一个例 子: 

  

      ;; autoinsert.el

      (define-auto-insert

         (cons "\\.\\([Hh]\\)\\'" "My C / C++ header")

         '(nil

            "/*" (make-string 69 ?*) "\n"

            " * " (file-name-nondirectory buffer-file-name) "\n"

            " *\n"

            " * " (user-full-name) " <" user-mail-address ">\n"

            " * Time-stamp: <>\n"

            " *" (make-string 69 ?*) "*/\n"

            (let* ((noext (substring buffer-file-name 0 (match-beginning 0)

))                   (nopath (file-name-nondirectory noext))

                   (ident (concat "_" (upcase nopath) "_H_")))

              (concat "#ifndef " ident "\n"

                      "#define " ident  "\n\n\n"

                      "\n\n#endif /* " ident " */\n"))))

自动插入机制是怎样工作的?每次你打开一个文件时,Emacs都要运行一

个叫 find-file-hooks的钩(hook).在这个钩里可以定义做很多事情,如

可以把语法关键词高亮显示,或者检查一个文件是否由某种版本控制系

统(RCS或CVS)管理,等等.上面的add-hook 这行就是把自动插入功能加

入到这个钩里去执行. 

Dmacro

由Wayne Mesard开发的 Dynamic Macro 包能让你在任 何时候插入结

构化的文本,而不仅仅局限于文档创建时.dmacro提供的功能有 :提示

用户输入,插入一个文件的内容或一个shell命令的输出,在文本插入后

定位光标或mark. 特别有用的是它能根据当前使用的模式而缩进被插

入的文 本.这可以用于强制(或者说鼓励)开发者遵守写代码的标准,并

且防止对齐的 文本中容易产生的输入错误,从而节省了时间. dmacro

并不是与Emacs一起发 布的;你不得不 下载 并 安装它(其实不过是 

make一下). 在你的 ~/.emacs里激活它 (其中.dm 文件含有你个人定义

的宏 ; 详见下文的例子): 

  

     (require 'dmacro)                       ; dynamic macros

     (dmacro-load "~/elisp/ecm.dm")

dmacro包有很详细的文档, 所以我将只提供几个有意思的例子.下面这

个能在 C模式下插入for 语句块的框架 (宏既可以是全局的也可以是

专一 于某种模式的): 

  

     # file ~/elisp/ecm.dm

     # ================================== Stuff for C-derived modes =======

     # MODE:     c-mode c++-mode java-mode

     ifor        indent  interactive for statement (prompts for variable na

me)     for (~(prompt var "Variable: ") = 0; ~prompt < ~@; ~prompt++)

     {

      ~mark

     }

     #    

你可以输入 C-c d ifor 来激活这个宏(用tab键补齐宏名).它将会提示

你输入变量名: 

其效果会是 这样. 下一个例子显 示如何在当前buffer里插入形如

-ecm1999-02-29 的时间戳. 在你 输入 C-c d dstamp时就会激活这个宏.

其代码是(这段代码还显 示了使用alias来取代通常使用的定义): 

  

     # ALIAS: iso-date (eval (format-time-string "%Y-%m-%d"))

     

     # ================================= Stuff for all modes ============

     # MODE:     nil 

     

     dstamp      expand  user id and date

      -~user-id~(iso-date)

     #   

相关的包

其它一些包也提供了类似于dmacro的功能. tempo.el ( GNU Emacs和

XEmacs都包括了这个程序) 最初是对html-helper-mode的改进,提供

了一些插入对应的HTML标记的手段,不过它还可以被用于其它目的.通

过 研究abbrev-mode-hook可以对标准缩略机制进行扩展,让其插入动

态产生的 文本,就像下面这则匿 名贴到gnu.emacs.help 的消息所解

释的那样.最后,还有一个似乎功能很全面的由Christoph Wedler写的

template.el 

读者反馈

1999一月的介绍缩略机制的 EMACSulation有一个很小却很关键的问

题: 我介绍了如何创建一个缩略和如何在Emacs启动时自动读入,却没

有给出让Emacs退出时自动保存缩略的办法.感谢 Nat Makarevitch和

Dave Bennet指出了这一点.下面是我修改后的代码(最后一行是上次没

有的): 

  

     

     ;; if there is an abbrev file, read it in

     (if (file-exists-p abbrev-file-name)

        (read-abbrev-file))

    (setq-default save-abbrevs t)

一些欧洲读者询问如何让缩略包含8-bit非ASCII字符.在缺省情况下

Emacs没有考虑这个,因为它认为置了第八位的字符不是组字字符.要想

改变这一点(比如,让它考虑iso-8859-1字符集中的8bit字符)你需要做

如下工作 

  

     (set-language-environment 'Latin-1)   ; GNU Emacs 20.x

     (require 'iso-syntax)                 ; GNU Emacs 19.x

( GNU Emacs 19.x及20.x处理不同字符编码的方式有很大不同;最近的

版本能处理表示亚洲语言所需要的多字节字符.Emacs使用adjustable

width characters而没用 Unicode.对XEmacs的最近版本来说, MULE

(MULtilingual enhancements for Emacs:多语种增强)支持是一个编

译时的选项.) 

下一次 ...

下次我们将看看Emacs的拼写检查. 感谢Jean-Christophe Arnu对本文

草稿的建议.有关评论,更正或建议(什么是你喜欢的Emacs独有的软件

包?)请与我联系<emarsden@mail.dotcom.fr> C-u 1000 M-x hail-emacs ! 

PS:Emacs并不局限于在Linux上使用,因为许多其它操作系统(及一些

只能作半吊子操作的系统)上也有Emacs的实现.然而,作为自由软件的

旗帜之一,作为最强大,复杂和可定制的系统之一,我觉得应该在Linux

公报中介绍它.  

EMACSulation #1: Handling Compressed Files, February 1998 

EMACSulation #2: Internet Ready, March 1998 

EMACSulation #3: Ediff, April 1998 

EMACSulation #4: Emacs as a Server, June 1998 

EMACSulation #5: Customizing Emacs, August 1998 

EMACSulation #6: Saving Time, January 1999  

                       版权所有 (C) 1999 NJLUG

           出版于第39期《Linux公报》1999年4月 中文版第六期

                            


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.636毫秒