# HG changeset patch # User Richard M. Stallman # Date 1009089879 0 # Node ID b8c51fd416a897f500374fafd7fa95b73ac915ab # Parent c04b899961647dd72ffc1f944aff6c9d15b4ac9b (sort-reorder-buffer): Copy all to a temp buffer first. diff -r c04b89996164 -r b8c51fd416a8 lisp/sort.el --- a/lisp/sort.el Sun Dec 23 06:40:00 2001 +0000 +++ b/lisp/sort.el Sun Dec 23 06:44:39 2001 +0000 @@ -164,37 +164,47 @@ 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 - (goto-char (point-max)) - (insert-buffer-substring (current-buffer) - last - (nth 1 (car old))) + (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) - (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 1 (1+ (- max min))) + (delete-region min (1+ min)))))) ;;;###autoload (defun sort-lines (reverse beg end)