みっつめ

Emacs-Lispのお勉強 – ファイルの保存時になにがしかの関数を実行する

ファイルの保存時に、なにがしかの関数を実行する。

今回は、my-update-timestamp という関数を実行する。

init.el に以下の記述を加える。

init.el
;;; my-update-timestamp.el
;;; 修正時刻をファイルの末尾に追加・更新するスクリプト
;;;
(load "my-update-timestamp")
(add-hook 'write-file-hooks 'my-update-timestamp)   ; <== <1>

<1> — ”write-file-hooks” が、ファイルの保存時に使える変数。

この変数に関数のリストをわたすとよい。
今回は、わたしたい関数はひとつなので、シンボルでわたす。
ただ、nil が返ってくるようにしないと、実際の保存は実行されない。

my-update-timestamp.el
(defun my-update-timestamp ()
  (interactive)
  (if (my-search-stamp)
      (progn
        (delete-char 24)
        (my-insert-current-time)
        (message "修正時刻を更新しました"))
    (goto-char (point-max))
    (insert (concat "\n修正時刻: " (current-time-string) "\n"))
    (message "修正時刻がなかったので、作りました"))
  nil)                      ; <== nil を返すようにした

これで、うまくいく。

参考

ファイルの書き出しを別の仕方に変えたり,書き出す前に別のことを行なうこ とができます.これにはフック変数write-file-hooksを使います.この 変数の値は関数のリストでなくてはなりません.あるファイルが書き出されよう とするときに,このリストの関数が順に引数なしで実行されます.そのうちの1 つがnon-nilの値を返したなら,Emacsはそれをファイルはふさわしい方 法で書き出されたと解釈して,残りの関数の実行をやめます.また,標準の書き 出しも行ないません.

http://flex.phys.tohoku.ac.jp/texi/emacs-jp/emacs-jp_69.html