aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/sort.el
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>2001-12-23 06:46:19 +0000
committerRichard M. Stallman <[email protected]>2001-12-23 06:46:19 +0000
commit67f5954cbd0608a8380a78b4df694d168ce257b4 (patch)
treebd90a328b824028ffa9fd3436bfeebf7ff1d11e8 /lisp/sort.el
parentb85b15f3fe489b1b710f19911289e2c84cf7bd9d (diff)
(sort-reorder-buffer): Copy all to a temp buffer first.
Diffstat (limited to 'lisp/sort.el')
-rw-r--r--lisp/sort.el68
1 files changed, 39 insertions, 29 deletions
diff --git a/lisp/sort.el b/lisp/sort.el
index 7a835b635e..bedc76556f 100644
--- a/lisp/sort.el
+++ b/lisp/sort.el
@@ -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)