From: Richard M. Stallman Date: Sun, 23 Dec 2001 06:46:19 +0000 (+0000) Subject: (sort-reorder-buffer): Copy all to a temp buffer first. X-Git-Tag: ttn-vms-21-2-B4~17516 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=67f5954cbd0608a8380a78b4df694d168ce257b4;p=emacs.git (sort-reorder-buffer): Copy all to a temp buffer first. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6ab208875b4..9fbd1abc8d4 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2001-12-23 Richard M. Stallman + + * 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,Bm(Bk * emacs-lisp/elint.el (elint-unknown-builtin-args): Remove diff --git a/lisp/sort.el b/lisp/sort.el index 7a835b635e8..bedc76556f6 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)