Emacs を 1/256 倍使うためのコラム 網道編
 2006.10.26

auto-insert に直感的な埋め込みを。

auto-insert には skeleton-insert による動的な埋め込み機能がありますが、この機能は auto-insert-alist の ACTION にファイル名を指定した場合は機能しません。 また skeleton な文法を憶える必要があります。 対話的でなくていいから、もっと直感的に書きたいです。

…という欲求を実現してみた。 さすが Emacs Lisp だ。なんてことないぜ。

(defvar x:auto-insert-embed-prefix "#=")

(defun x:auto-insert-embed-function (dummy)
  (save-excursion
    (save-match-data
      (while (search-forward x:auto-insert-embed-prefix nil t)
	(let* ((pre (match-beginning 0))
	       (beg (match-end 0))
	       (end (scan-sexps beg 1))
	       (str (buffer-substring beg end))
	       (ret (eval (car (read-from-string str)))))
	  (delete-region pre end)
	  (insert (format "%s" ret)))))))

(defadvice auto-insert
  (around embed () activate)
  (let ((after-insert-file-functions after-insert-file-functions))
    (add-hook 'after-insert-file-functions 'x:auto-insert-embed-function)
    ad-do-it))

x:auto-insert-embed-prefix で指定した文字列の直後の S 式を評価して置き換えます。 例えば、雛型ファイルの末尾にこんなこと書いとくと、ファイル名が埋め込まれます。

;;; #=(file-name-nondirectory (buffer-file-name)) ends here
カテゴリー:Emacs