大変便利な Gonza さんの auto-save-buffers.l を好き勝手に使わせて頂いてます。 ただ、(読み)書きの遅いメディアを使っている場合や、巨大なファイルを編集している場合は止めたいので、 ツールバーにボタンを作ってみたり、 また、auto-time-stamp (auto-time-stamp-bottom) を実行するタイミングが悩ましくなったので、いろいろとしてみたり。
time-stamp は、関数 auto-save-buffers の中で実行しようと思ったのだけれど、 undo がとってもイヤな感じになるのと、余計な処理は極力避けたいので、 こんな面倒なことになってしまった。
結構思いつきでしているところが多いので、どうなることやら。
とりあえず、使うことにした変数。
(defvar *auto-save-buffers* nil) (defvar *auto-save-buffers-interval* 1) (defvar *auto-save-buffers-list* nil)
自動保存時に、自動保存したファイル名をリスト(*auto-save-buffers-list*)に追加するように。
(defun auto-save-buffers () (save-excursion (dolist (buffer (buffer-list)) (when (need-buffer-save-p buffer) (set-buffer buffer) (save-buffer) (pushnew (get-buffer-file-name buffer) *auto-save-buffers-list* :test #'equal))) t))
自動保存トグル用の関数を準備。 でもって、自分用のツールバーに追加。
(defun toggle-auto-save-buffers () (interactive) (if *auto-save-buffers* (progn (setq *auto-save-buffers* nil) (stop-timer 'auto-save-buffers) (message "auto-save-buffers stopped.")) (progn (setq *auto-save-buffers* t) (start-timer *auto-save-buffers-interval* 'auto-save-buffers) (message "auto-save-buffers started."))))
起動時に、自動保存開始。
(add-hook '*post-startup-hook* #'(lambda () (when (start-timer *auto-save-buffers-interval* 'auto-save-buffers) (setq *auto-save-buffers* t))))
タイムスタンプをつけそうな個所があれば、タイムスタンプを押し、保存する関数。 タイムスタンプを押したバッファは、リスト(*auto-save-buffers-list*)から削除。
(defun check-time-stamp (&optional buffer) (interactive) (let ((bufn (get-buffer-file-name buffer)) limit) (when (and ed::*time-stamp-active* bufn (not buffer-read-only) (member bufn *auto-save-buffers-list* :test #'equal) (save-excursion (or (progn (goto-char (point-min)) (save-excursion (forward-line ed::*time-stamp-line-limit*) (setq limit (point))) (when (scan-buffer ed::*time-stamp-start* :regexp t :tail t :limit limit) t)) (progn (goto-char (point-max)) (backward-line ed::*time-stamp-line-limit*) (when (scan-buffer ed::*time-stamp-start* :regexp t :tail t) t))))) (ed::time-stamp) (save-buffer) (message "タイムスタンプを押した")) (setq *auto-save-buffers-list* (remove bufn *auto-save-buffers-list* :test #'equal))) t)
C-x C-s で、意図的にタイムスタンプを押すよう試みる。
(defun save-buffer-with-check-time-stamp () (interactive) (if (buffer-modified-p) (progn (and ed::*time-stamp-active* (ed::time-stamp)) (save-buffer-dialog)) (check-time-stamp))) (define-key ctl-x-map #\C-s 'save-buffer-with-check-time-stamp)
バッファ削除時および deactivate された時に、必要そうなバッファの場合は、タイムスタンプを押す。
(add-hook '*delete-buffer-hook* #'check-time-stamp) (add-hook '*query-kill-buffer-hook* #'check-time-stamp) (add-hook '*deactivate-hook* #'check-time-stamp)
以下のような不具合があるようなので,御注意ください。m(__)m