补记:看了下 Emacs Wiki 上 MsfAbbrev-mode 的介绍好象是同样的结构。
跟 snippet-mode 一样是模仿 TextMate 的自动完成功能的 emacs mode ,smart-snippet 和 yasnippet 的作者都是 http://pluskid.lifegoo.com 的 pluskid ,好象也是 ann@emacs@smth 。
snippet-mode 的信息可以在 http://www.emacswiki.org/cgi-bin/wiki/SnippetMode 看到并找到下载地址,源文件中有详细的使用说明。之前使用 snippet 做的 doc-mode 下的定义:
(add-hook 'doc-mode-hook
'(lambda ()
(setq-default abbrev-mode t)
(snippet-with-abbrev-table
'local-abbrev-table
("xh1" . "= $${文章标题} =\nHick <HickWu@qq.com>\n\n$.")
)
(snippet-with-abbrev-table
'local-abbrev-table
("xh2" . "== $${一级标题} ==\n\n$.")
)
(snippet-with-abbrev-table
'local-abbrev-table
("xh3" . "=== $${二级标题} ===\n\n$.")
)
(snippet-with-abbrev-table
'local-abbrev-table
("xc" . "------------\n$$\n------------\n")
)
))
在一个 buffer 中进入 doc-mode 以后,通过输出xh1后按 tab 即可展开相应 snippet 。
yasnippet 可以文件形式定义 snippet ,http://code.google.com/p/yasnippet/ 下到源代码以后,然后把压缩包中的 snippet 放到用户 HOME 目录以后这样设置 .emacs 文件:
(require 'yasnippet)
(yas/initialize)
(yas/load-directory "~/snippets/")
snippet 目录下的 text-mode 下定义各个模块的 snippet ,比如 html-mode 下有一个文件 div ,也就是该模式下 div 的 snippet 定义,进入 html-mode 以后按 div + TAB 即可扩展为 div 的 snippet 。具体定义语法比较简单,参见 http://pluskid.lifegoo.com/upload/project/yasnippet/doc/define_snippet.html 。下面是语法的示例和摘要:
#contributor : pluskid <pluskid@gmail.com>
#name : __...__
# --
= ${1:文章标题} =
`(format-time-string "%y/%m/%d")`
. 通过目录层级关系来共享 snippet 定义,text-mode 目录下的 time 的定义在所有子目录对应 mode 中都可以使用。
. 字符 # 开头的为一些 snippet 的辅助 meta 信息,name 定义 snippet 的简短描述,contributor 定义作者, — 为注释 ,condition 中可以定义简单的 elisp 代码
. 通过 yas/define-snippets 可以以 elisp 代码的方式直接定义 snippet
. 同一组键可以对应多个 snippet (内置 dropdown-list.el 实现选择提示)
. 通过反引号可以嵌入 elisp 代码
. TAB 和 S-TAB 的切换
. 对 snippet 输入内容可以定义 elisp 函数进行再处理, 比如首字母大写
刚才也初步试了下 windows 下模仿 TextMate 的另外两个软件 E-texteditor 和 intype ,除了 snippet 功能也没有特别出彩的,两个软件都不怎么稳定,前者没用几分钟就报错,后者中文支持不太好。
vim 下也有类似的 snippet 功能(去 vim 官方或者 google 搜索 snippet),没有试过,看了几个 demo 效果都不是十分满意。