拾遗笔记

yasnippet Auto Insert mode整合

auto-insert 是GNU/Emacs自带的一个功能,它可以实现当你新建一个文件的时候,自动 在这个新建的文件里插入相应的内容,比如你新建一个c源文件的时候它自动加入这样一 段代码:

1 c模版代码1

#include <stdio.h>

int main(void){
  return 0;
}

auto-insert 会根据你所新建文件的后缀名或major mode种类决定插入哪个模版文件。要 实现上述功能 ,只需要在你Emacs的配置文件中加入似类如下的代码

2 启用Auto Insert 的配置代码

;;首先这句话设置一个目录,你的auto-insert 的模版文件会存放在这个目录中,
(setq-default auto-insert-directory "~/.emacs.d/auto-insert/")
(auto-insert-mode)  ;;; 启用auto-insert
;; 默认情况下插入模版前会循问你要不要自动插入,这里设置为不必询问,
;; 在新建一个org文件时,自动插入`auto-insert-directory'目录下的`org-auto-insert`文件中的内容
(setq auto-insert-query nil)
(define-auto-insert "\\.org" "org-auto-insert")
;;这个就是新建以.c 结尾的C文件时,会自动插入c-auto-insert文件中的内容
(define-auto-insert "\\.c" "c-auto-insert")

下面要做在只需要在~/.emacs.d/auto-insert/c-auto-insert 文件中插入上面提到的c模 版代码1建好~/.emacs.d/auto-insert/c-auto-insert 文件后,用Emacs新建 一个c文 件,你就会发现你新建的文件中已经包含上面那段c代码片段了。故事并没有到此结束 , 写到这里,还一直没yasnippet什么事呢.假如我想在创建这个c文件的时候,在文件开头 插入文件创建的时间,作者的姓名,又或者是这个刚刚创建的文件的名称,其格式大概如 下

//file name : hellworld.c
//created at: 2011-11-11 11:11:11
//author: 爱谁谁

#include <stdio.h>

int main(void){
  return 0;
}

这个作者姓名或许你可以硬编码到这个模版文件中,因为毕竟只有你自己在用你的Emacs ,可是这个创建时间,及文件名你就很难把它办到了,当然EmacsWiki上介绍 AutoInSertMode的页面上有解决这个问题的办法 ,但是它针对上面提到的每个问题都要 写一个elisp函数来实现其功能。很明显,易用性、扩展性差了点。而讲到模版功能,相 信在Emacs中可用的模版功能,目前可以说yasnippet 算得上是最强大的了。 将这两者结合来用,自然再合适不过了。

3 将auto-insert-mode与yasnippet 进行整合的代码

(defadvice auto-insert  (around yasnippet-expand-after-auto-insert activate)
  "expand auto-inserted content as yasnippet templete,
  so that we could use yasnippet in autoinsert mode"
  (let ((is-new-file (and (not buffer-read-only)
                          (or (eq this-command 'auto-insert)
                              (and auto-insert (bobp) (eobp))))))
    ad-do-it
    (let ((old-point-max (point-max)))
      (when is-new-file
        (goto-char old-point-max)
        (yas/expand-snippet (buffer-substring-no-properties (point-min) (point-max)))
        (delete-region (point-min) old-point-max)
        )
      )
    )
  )

将这段代码放到2 的后面,即可。然后c-auto-insert 这个 文件里的代码 就可以是yasnippet 支持的模版文件的代码了,上面提到的功能, 可以这样实现

4 Yasnippet 格式的模版

//file name : `(buffer-name)`
//created at: `(format-time-string "%c")`
//author:  `user-full-name`

#include <stdio.h>

int main(void){
  return 0;
}

Comments

comments powered by Disqus