IT Rescue IT関連Tips情報

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

2006年10月26日Emacs

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

コメントをどうぞ

免責事項

著作権者の文書による承諾を得ずに、本サイトの内容の一部、全部を無断で複写、複製、転載することは、禁じられています。
また、当ウェブサイト に記載された情報の完全性・正確性に対して一切の保証を与えるものではありません。当ウェブサイトに含まれる情報もしくは内容を利用することで直接・間接的に生じた損失に関し一切責任を負わないものとします。