Emacs autoinsert でテンプレートを使う

Pelican ではエントリを reST で書いています。ファイルの冒頭部分に投稿日時やカテゴリ、タグなどのメタデータを記載するフォーマットがあって以下のように書いています。

:date: 2014-03-08 17:00:25
:category: misc
:tags: Emacs, reST, Pelican
:slug: emacs-autoinsert

毎回これを手で入力するのは手間なので過去のファイルからコピペしていたのですが、それもどうかと思い、yasnippet を導入してみようと考えたのでした。

今のところは yasnippet も導入できていないので別のアプローチということでファイル作成時に自動であらかじめ用意したテンプレートを読み込んで記述してくれる autoinsert を使ってみることにしました。

まずは ymotongpoo さんのエントリを見てそのまま真似してみました。そのあとでファイル作成時の日時を Pelican で使用しているフォーマットで挿入したかったのでその部分を書き換えています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
;; autoinsert
;; http://ymotongpoo.hatenablog.com/entry/2012/12/02/190248
(require 'autoinsert)
(setq user-id-string "id")
(setq user-full-name "full name")
(setq user-mail-address "mail address")

;; テンプレートのディレクトリ
(setq auto-insert-directory "~/.emacs.d/template")

;; 各ファイルによってテンプレートを切り替える
(setq auto-insert-alist
      (nconc '(
               ("\\.rst$" . ["template.rst" my-template])
               ) auto-insert-alist))
(require 'cl)

(defvar template-replacements-alists
  '(("%file%"             . (lambda () (file-name-nondirectory (buffer-file-name))))
    ("%file-without-ext%" . (lambda () (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))))
    ;; ("%date%" . (lambda () (current-time-string)))
    ("%date%" . (lambda () (format-time-string "%Y-%m-%d %H:%M:%S")))
    ("%mail%" . (lambda () (identity user-mail-address)))
    ("%name%" . (lambda () (identity user-full-name)))
    ("%id%" . (lambda () (identity user-id-string)))
))

(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)

日時のところは

(format-time-string "%Y-%m-%d %H:%M:%S")

としています。これは以前に作業記録をつける目的で、日時の文字列を手軽に入力できるように elisp を少し書いたことがあったので、そこから抜き出しました。何ごとも無駄にはならないというか、別の場面で役に立つこともあるのだなぁとちょっと嬉しくなります。

.. -*- coding: utf-8; -*-

==============
 title string
==============

:date: %date%
:category: misc
:tags: tag, tag
:slug: slug

これで Emacs で .rst のファイルを作ると最初から Pelican 用のメタデータが入力された状態になります。Pelican 以外に使う reST ファイルを作成する場合はどうするのか(例えば Sphinx など)という問題はありますが、ひとまずこれで使っていきたいと思います。