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
カテゴリー:技術情報メモ