auto-save-buffers

Last modified: "2003/08/31 11:42:00"

Intro

大変便利な Gonza さんの auto-save-buffers.l を好き勝手に使わせて頂いてます。 ただ、(読み)書きの遅いメディアを使っている場合や、巨大なファイルを編集している場合は止めたいので、 ツールバーにボタンを作ってみたり、 また、auto-time-stamp (auto-time-stamp-bottom) を実行するタイミングが悩ましくなったので、いろいろとしてみたり。

time-stamp は、関数 auto-save-buffers の中で実行しようと思ったのだけれど、 undo がとってもイヤな感じになるのと、余計な処理は極力避けたいので、 こんな面倒なことになってしまった。

結構思いつきでしているところが多いので、どうなることやら。


Table of contents


カスタマイズしているあたり

とりあえず、使うことにした変数。

(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


更新履歴

[2003/08/17]
・「注意事項」を追加した。
[2003/06/11]
おおよそ、自分の望みどおりになってきた気がした。
・check-time-stamp で何も聞いてこないようにした。
・check-time-stamp-noquestion を削除した。
・*deactivate-hook* でも check-time-stamp を実行するようにした。
[2003/06/05]
・check-time-stamp-noquestion を追加した。
・*query-kill-buffer-hook* でも check-time-stamp を実行するようにした。
・*delete-buffer-hook* では、check-time-stamp-noquestion を実行するようにした。
・check-time-stamp に ed::*time-stamp-active* を追加した。
・save-buffer-with-check-time-stamp から ed::*time-stamp-active* を削除した。


(^_^)