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毫秒