]> code.delx.au - gnu-emacs/commitdiff
(sort-reorder-buffer): Copy all to a temp buffer first.
authorRichard M. Stallman <rms@gnu.org>
Sun, 23 Dec 2001 06:46:19 +0000 (06:46 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 23 Dec 2001 06:46:19 +0000 (06:46 +0000)
lisp/ChangeLog
lisp/sort.el

index 6ab208875b4387bd461c69fbb4f286ad734ec1d6..9fbd1abc8d4a4094c22f7f8c22d485c3bd702c7b 100644 (file)
@@ -1,3 +1,10 @@
+2001-12-23  Richard M. Stallman  <rms@gnu.org>
+
+       * sort.el (sort-reorder-buffer): Copy all to a temp buffer first.
+
+       * play/yow.el (yow): Use an arg to distinguish interactive calls,
+       not interactive-p.
+
 2001-12-22  Pavel Jan\e,Bm\e(Bk  <Pavel@Janik.cz>
 
        * emacs-lisp/elint.el (elint-unknown-builtin-args): Remove
index 7a835b635e8c85124dec0506abb0da88430ffdfb..bedc76556f66e79a979b597b227029d3f6d923d9 100644 (file)
@@ -164,37 +164,47 @@ same as ENDRECFUN."
     sort-lists))
 
 (defun sort-reorder-buffer (sort-lists old)
-  (let ((inhibit-quit t)
-       (last (point-min))
-       (min (point-min)) (max (point-max)))
-    ;; Make sure insertions done for reordering
-    ;; do not go after any markers at the end of the sorted region,
-    ;; by inserting a space to separate them.
-    (goto-char (point-max))
-    (insert-before-markers " ")
-    (narrow-to-region min (1- (point-max)))
-    (while sort-lists
+  (let ((last (point-min))
+       (min (point-min)) (max (point-max))
+       (old-buffer (current-buffer))
+       temp-buffer)
+    (with-temp-buffer
+      ;; Record the temporary buffer.
+      (setq temp-buffer (current-buffer))
+
+      ;; Copy the sorted text into the temporary buffer.
+      (while sort-lists
+       (goto-char (point-max))
+       (insert-buffer-substring old-buffer
+                                last
+                                (nth 1 (car old)))
+       (goto-char (point-max))
+       (insert-buffer-substring old-buffer
+                                (nth 1 (car sort-lists))
+                                (cdr (cdr (car sort-lists))))
+       (setq last (cdr (cdr (car old)))
+             sort-lists (cdr sort-lists)
+             old (cdr old)))
       (goto-char (point-max))
-      (insert-buffer-substring (current-buffer)
+      (insert-buffer-substring old-buffer
                               last
-                              (nth 1 (car old)))
-      (goto-char (point-max))
-      (insert-buffer-substring (current-buffer)
-                              (nth 1 (car sort-lists))
-                              (cdr (cdr (car sort-lists))))
-      (setq last (cdr (cdr (car old)))
-           sort-lists (cdr sort-lists)
-           old (cdr old)))
-    (goto-char (point-max))
-    (insert-buffer-substring (current-buffer)
-                            last
-                            max)
-    ;; Delete the original copy of the text.
-    (delete-region min max)
-    ;; Get rid of the separator " ".
-    (goto-char (point-max))
-    (narrow-to-region min (1+ (point)))
-    (delete-region (point) (1+ (point)))))
+                              max)
+
+      ;; Copy the reordered text from the temporary buffer
+      ;; to the buffer we sorted (OLD-BUFFER).
+      (set-buffer old-buffer)
+      (let ((inhibit-quit t))
+       ;; Make sure insertions done for reordering
+       ;; do not go after any markers at the end of the sorted region,
+       ;; by inserting a space to separate them.
+       (goto-char max)
+       (insert-before-markers " ")
+       ;; Delete the original copy of the text.
+       (delete-region min max)
+       ;; Now replace the separator " " with the sorted text.
+       (goto-char (point-max))
+       (insert-buffer-substring temp-buffer 1 (1+ (- max min)))
+       (delete-region min (1+ min))))))
 
 ;;;###autoload
 (defun sort-lines (reverse beg end)