]> git.eshelyaron.com Git - emacs.git/commitdiff
Have `M-q' not mark buffers are changed when they haven't
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 28 Mar 2016 17:08:33 +0000 (19:08 +0200)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 28 Mar 2016 17:08:50 +0000 (19:08 +0200)
* lisp/textmodes/fill.el (fill-paragraph): Use `buffer-hash'
to avoid marking buffers as changed when they haven't.

lisp/textmodes/fill.el

index 100e2a24367b709031dbddcad3d5defabfe1ea3e..173d1c9d1966ae215fa2dd5ef61b7e800b68f3ff 100644 (file)
@@ -804,65 +804,75 @@ region, instead of just filling the current paragraph."
   (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
-  (or
-   ;; 1. Fill the region if it is active when called interactively.
-   (and region transient-mark-mode mark-active
-       (not (eq (region-beginning) (region-end)))
-       (or (fill-region (region-beginning) (region-end) justify) t))
-   ;; 2. Try fill-paragraph-function.
-   (and (not (eq fill-paragraph-function t))
-        (or fill-paragraph-function
-            (and (minibufferp (current-buffer))
-                 (= 1 (point-min))))
-        (let ((function (or fill-paragraph-function
-                            ;; In the minibuffer, don't count the width
-                            ;; of the prompt.
-                            'fill-minibuffer-function))
-              ;; If fill-paragraph-function is set, it probably takes care
-              ;; of comments and stuff.  If not, it will have to set
-              ;; fill-paragraph-handle-comment back to t explicitly or
-              ;; return nil.
-              (fill-paragraph-handle-comment nil)
-              (fill-paragraph-function t))
-          (funcall function justify)))
-   ;; 3. Try our syntax-aware filling code.
-   (and fill-paragraph-handle-comment
-        ;; Our code only handles \n-terminated comments right now.
-        comment-start (equal comment-end "")
-        (let ((fill-paragraph-handle-comment nil))
-          (fill-comment-paragraph justify)))
-   ;; 4. If it all fails, default to the good ol' text paragraph filling.
-   (let ((before (point))
-         (paragraph-start paragraph-start)
-         ;; Fill prefix used for filling the paragraph.
-         fill-pfx)
-     ;; Try to prevent code sections and comment sections from being
-     ;; filled together.
-     (when (and fill-paragraph-handle-comment comment-start-skip)
-       (setq paragraph-start
-             (concat paragraph-start "\\|[ \t]*\\(?:"
-                     comment-start-skip "\\)")))
-     (save-excursion
-       ;; To make sure the return value of forward-paragraph is meaningful,
-       ;; we have to start from the beginning of line, otherwise skipping
-       ;; past the last few chars of a paragraph-separator would count as
-       ;; a paragraph (and not skipping any chars at EOB would not count
-       ;; as a paragraph even if it is).
-       (move-to-left-margin)
-       (if (not (zerop (fill-forward-paragraph 1)))
-           ;; There's no paragraph at or after point: give up.
-           (setq fill-pfx "")
-         (let ((end (point))
-               (beg (progn (fill-forward-paragraph -1) (point))))
-           (goto-char before)
-           (setq fill-pfx
-                 (if use-hard-newlines
-                     ;; Can't use fill-region-as-paragraph, since this
-                     ;; paragraph may still contain hard newlines.  See
-                     ;; fill-region.
-                     (fill-region beg end justify)
-                   (fill-region-as-paragraph beg end justify))))))
-     fill-pfx)))
+  (let ((hash (and (not (buffer-modified-p))
+                   (buffer-hash))))
+    (prog1
+        (or
+         ;; 1. Fill the region if it is active when called interactively.
+         (and region transient-mark-mode mark-active
+              (not (eq (region-beginning) (region-end)))
+              (or (fill-region (region-beginning) (region-end) justify) t))
+         ;; 2. Try fill-paragraph-function.
+         (and (not (eq fill-paragraph-function t))
+              (or fill-paragraph-function
+                  (and (minibufferp (current-buffer))
+                       (= 1 (point-min))))
+              (let ((function (or fill-paragraph-function
+                                  ;; In the minibuffer, don't count
+                                  ;; the width of the prompt.
+                                  'fill-minibuffer-function))
+                    ;; If fill-paragraph-function is set, it probably
+                    ;; takes care of comments and stuff.  If not, it
+                    ;; will have to set fill-paragraph-handle-comment
+                    ;; back to t explicitly or return nil.
+                    (fill-paragraph-handle-comment nil)
+                    (fill-paragraph-function t))
+                (funcall function justify)))
+         ;; 3. Try our syntax-aware filling code.
+         (and fill-paragraph-handle-comment
+              ;; Our code only handles \n-terminated comments right now.
+              comment-start (equal comment-end "")
+              (let ((fill-paragraph-handle-comment nil))
+                (fill-comment-paragraph justify)))
+         ;; 4. If it all fails, default to the good ol' text paragraph filling.
+         (let ((before (point))
+               (paragraph-start paragraph-start)
+               ;; Fill prefix used for filling the paragraph.
+               fill-pfx)
+           ;; Try to prevent code sections and comment sections from being
+           ;; filled together.
+           (when (and fill-paragraph-handle-comment comment-start-skip)
+             (setq paragraph-start
+                   (concat paragraph-start "\\|[ \t]*\\(?:"
+                           comment-start-skip "\\)")))
+           (save-excursion
+             ;; To make sure the return value of forward-paragraph is
+             ;; meaningful, we have to start from the beginning of
+             ;; line, otherwise skipping past the last few chars of a
+             ;; paragraph-separator would count as a paragraph (and
+             ;; not skipping any chars at EOB would not count as a
+             ;; paragraph even if it is).
+             (move-to-left-margin)
+             (if (not (zerop (fill-forward-paragraph 1)))
+                 ;; There's no paragraph at or after point: give up.
+                 (setq fill-pfx "")
+               (let ((end (point))
+                     (beg (progn (fill-forward-paragraph -1) (point))))
+                 (goto-char before)
+                 (setq fill-pfx
+                       (if use-hard-newlines
+                           ;; Can't use fill-region-as-paragraph, since this
+                           ;; paragraph may still contain hard newlines.  See
+                           ;; fill-region.
+                           (fill-region beg end justify)
+                         (fill-region-as-paragraph beg end justify))))))
+           fill-pfx))
+      ;; If we didn't change anything in the buffer (and the buffer
+      ;; was previously unmodified), then flip the modification status
+      ;; back to "unchanged".
+      (when (and hash
+                 (equal hash (buffer-hash)))
+        (set-buffer-modified-p nil)))))
 
 (declare-function comment-search-forward "newcomment" (limit &optional noerror))
 (declare-function comment-string-strip "newcomment" (str beforep afterp))