From f70aa678ca569fc4e7aa57d663dc94dc08c1ac3a Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Tue, 7 Aug 2007 12:43:40 +0000 Subject: [PATCH] (format-insert-file): Make sure that at most one undo entry is recorded for the insertion. Inhibit point-motion and modification hooks around call to insert-file-contents. --- lisp/ChangeLog | 6 ++++++ lisp/format.el | 35 ++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f8bf2d8f1be..ce496808a6b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2007-08-07 Martin Rudalics + + * format.el (format-insert-file): Make sure that at most one undo + entry is recorded for the insertion. Inhibit point-motion and + modification hooks around call to insert-file-contents. + 2007-08-07 Stefan Monnier * vc.el (vc-annotate): Select temp-buffer before running vc-exec-after. diff --git a/lisp/format.el b/lisp/format.el index d029e3d4683..35e47efadbf 100644 --- a/lisp/format.el +++ b/lisp/format.el @@ -429,13 +429,34 @@ a list (ABSOLUTE-FILE-NAME SIZE)." (fmt (format-read (format "Read file `%s' in format: " (file-name-nondirectory file))))) (list file fmt))) - (let (value size) - (let ((format-alist nil)) - (setq value (insert-file-contents filename nil beg end)) - (setq size (nth 1 value))) - (if format - (setq size (format-decode format size) - value (list (car value) size))) + (let (value size old-undo) + ;; Record only one undo entry for the insertion. Inhibit point-motion and + ;; modification hooks as with `insert-file-contents'. + (let ((inhibit-point-motion-hooks t) + (inhibit-modification-hooks t)) + ;; Don't bind `buffer-undo-list' to t here to assert that + ;; `insert-file-contents' may record whether the buffer was unmodified + ;; before. + (let ((format-alist nil)) + (setq value (insert-file-contents filename nil beg end)) + (setq size (nth 1 value))) + (when (consp buffer-undo-list) + (let ((head (car buffer-undo-list))) + (when (and (consp head) + (equal (car head) (point)) + (equal (cdr head) (+ (point) size))) + ;; Remove first entry from `buffer-undo-list', we shall insert + ;; another one below. + (setq old-undo (cdr buffer-undo-list))))) + (when format + (let ((buffer-undo-list t)) + (setq size (format-decode format size) + value (list (car value) size))) + (unless (eq buffer-undo-list t) + (setq buffer-undo-list + (cons (cons (point) (+ (point) size)) old-undo))))) + (unless inhibit-modification-hooks + (run-hook-with-args 'after-change-functions (point) (+ (point) size) 0)) value)) (defun format-read (&optional prompt) -- 2.11.4.GIT