emacsでauto-insert

emacsC++のコードを書いてるとき、

  1. 行頭にエンコーディングの指定を書く
  2. headerでインクルードガードを書く

という定形作業が毎回発生してうっとおしいのでどうにかしたい。

下記のサイトを参考にemacsにテンプレを導入してみる。(ほぼそのままですが)
http://www.02.246.ne.jp/~torutk/cxx/emacs/mode_extension.html
http://d.hatena.ne.jp/higepon/20080731/1217491155

あと、最近ファイルをキャメルケースで、インクルードガードをスネークケースで書くことが多いので、インクルードガードをスネークケースに変換するように処理を追加。
キャメルケースとスネークケースの変換関数は以下のサイトのを利用。
http://recyclebin5385.blog13.fc2.com/blog-category-4.html

;; 自動挿入の設定
(require 'autoinsert)
;; テンプレート格納用ディレクト
(setq auto-insert-directory "~/.emacs.d/insert/")
;; ファイル拡張子とテンプレートの対応
(setq auto-insert-alist
(append '(
("\\.cpp$" . ["template.cpp" my-template])
("\\.h$" . ["template.h" my-template])
) auto-insert-alist))
(add-hook 'find-file-hooks 'auto-insert)

;; 変換ルールの定義
(require 'cl)
(defvar template-replacements-alists
'*1 t))))
)
)

;; 変換実行の定義
(defun my-template ()
(time-stamp)
(mapc #'(lambda(c)
(progn
(goto-char (point-min))
(replace-string (car c) (funcall (cdr c)) nil)))
template-replacements-alists)
(goto-char (point-max))
(message "done."))
(add-hook 'find-file-not-found-hooks 'auto-insert)

すごい短いけど。テンプレはこんな感じ。
template.h

/* -*- coding:utf-8 -*- */

#ifndef %include-guard%
#define %include-guard%



#endif // %include-guard%

template.cpp

/* -*- coding:utf-8 -*- */

実行してみるとこんな感じ。

固定の文言の追加とかもできるからいろいろ便利。

*1:"%file%" . (lambda () (file-name-nondirectory (buffer-file-name)))) ("%file-without-ext%" . (lambda () (file-name-sans-extension (file-name-nondirectory (buffer-file-name))))) ("%include-guard%" . (lambda () (format "%s_H" (camel-to-snake (file-name-sans-extension (file-name-nondirectory buffer-file-name