]> code.delx.au - gnu-emacs/blobdiff - lisp/sort.el
(custom-variable-prompt): Doc change. Use custom-variable-p.
[gnu-emacs] / lisp / sort.el
index 57a3643c4dae510b88d629044842bfee996109e4..ebcea995ad327bf2fbe8eee6650ff386c8b374b5 100644 (file)
@@ -1,4 +1,4 @@
-;;; sort.el --- commands to sort text in an Emacs buffer.
+;;; sort.el --- commands to sort text in an Emacs buffer
 
 ;; Copyright (C) 1986, 1987, 1994, 1995 Free Software Foundation, Inc.
 
@@ -164,37 +164,45 @@ 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)
-                              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)))))
+      (insert-buffer-substring old-buffer last 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)
+       (delete-region min (1+ min))))))
 
 ;;;###autoload
 (defun sort-lines (reverse beg end) 
@@ -486,7 +494,7 @@ Use \\[untabify] to convert tabs to spaces before sorting."
       (setq col-start (min col-beg1 col-end1))
       (setq col-end (max col-beg1 col-end1))
       (if (search-backward "\t" beg1 t)
-         (error "sort-columns does not work with tabs.  Use M-x untabify"))
+         (error "sort-columns does not work with tabs -- use M-x untabify"))
       (if (not (or (eq system-type 'vax-vms)
                   (text-properties-at beg1)
                   (< (next-property-change beg1 nil end1) end1)))