X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f0398ec17f8a00d6c6d828c3d04522d94337d156..a8e1414c0d66903884059361ecc8ec70da37cf35:/lisp/sort.el diff --git a/lisp/sort.el b/lisp/sort.el index 9493768f6a..8bc71388ad 100644 --- a/lisp/sort.el +++ b/lisp/sort.el @@ -1,10 +1,10 @@ ;;; sort.el --- commands to sort text in an Emacs buffer -;; Copyright (C) 1986-1987, 1994-1995, 2001-2013 Free Software +;; Copyright (C) 1986-1987, 1994-1995, 2001-2016 Free Software ;; Foundation, Inc. ;; Author: Howie Kaye -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: unix ;; This file is part of GNU Emacs. @@ -316,7 +316,7 @@ FIELD, BEG and END. BEG and END specify region to sort." ;; (point) ;; (save-excursion ;; (re-search-forward -;; "[+-]?[0-9]*\.?[0-9]*\\([eE][+-]?[0-9]+\\)?") +;; "[+-]?[0-9]*\\.?[0-9]*\\([eE][+-]?[0-9]+\\)?") ;; (point)))))) ;; nil)) @@ -570,25 +570,23 @@ From a program takes two point or marker arguments, BEG and END." ;;;###autoload (defun delete-duplicate-lines (beg end &optional reverse adjacent keep-blanks interactive) - "Delete duplicate lines in the region between BEG and END. - -If REVERSE is nil, search and delete duplicates forward keeping the first -occurrence of duplicate lines. If REVERSE is non-nil (when called -interactively with C-u prefix), search and delete duplicates backward -keeping the last occurrence of duplicate lines. - -If ADJACENT is non-nil (when called interactively with two C-u prefixes), -delete repeated lines only if they are adjacent. It works like the utility -`uniq' and is useful when lines are already sorted in a large file since -this is more efficient in performance and memory usage than when ADJACENT -is nil that uses additional memory to remember previous lines. - -If KEEP-BLANKS is non-nil (when called interactively with three C-u prefixes), -duplicate blank lines are preserved. - -When called from Lisp and INTERACTIVE is omitted or nil, return the number -of deleted duplicate lines, do not print it; if INTERACTIVE is t, the -function behaves in all respects as if it had been called interactively." + "Delete all but one copy of any identical lines in the region. +Non-interactively, arguments BEG and END delimit the region. +Normally it searches forwards, keeping the first instance of +each identical line. If REVERSE is non-nil (interactively, with +a C-u prefix), it searches backwards and keeps the last instance of +each repeated line. + +Identical lines need not be adjacent, unless the argument +ADJACENT is non-nil (interactively, with a C-u C-u prefix). +This is a more efficient mode of operation, and may be useful +on large regions that have already been sorted. + +If the argument KEEP-BLANKS is non-nil (interactively, with a +C-u C-u C-u prefix), it retains repeated blank lines. + +Returns the number of deleted lines. Interactively, or if INTERACTIVE +is non-nil, it also prints a message describing the number of deletions." (interactive (progn (barf-if-buffer-read-only) @@ -597,8 +595,8 @@ function behaves in all respects as if it had been called interactively." (equal current-prefix-arg '(16)) (equal current-prefix-arg '(64)) t))) - (let ((lines (unless adjacent (make-hash-table :weakness 'key :test 'equal))) - line prev-line + (let ((lines (unless adjacent (make-hash-table :test 'equal))) + line prev-line first-line (count 0) (beg (copy-marker beg)) (end (copy-marker end))) @@ -606,8 +604,9 @@ function behaves in all respects as if it had been called interactively." (goto-char (if reverse end beg)) (if (and reverse (bolp)) (forward-char -1)) (while (if reverse - (and (> (point) beg) (not (bobp))) + (not first-line) (and (< (point) end) (not (eobp)))) + (setq first-line (and reverse (or (<= (point) beg) (bobp)))) (setq line (buffer-substring-no-properties (line-beginning-position) (line-end-position))) (if (and keep-blanks (string= "" line))