summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Steingold <sds@gnu.org>2013-05-24 14:39:21 -0400
committerSam Steingold <sds@gnu.org>2013-05-24 14:39:21 -0400
commit9631677d730a314f55378f5da6734db521f8130d (patch)
tree489b0974278443fd68ed5286202290174cb9cc75
parent5010583555fce883d83e7a50e26d9d34f9e108ce (diff)
downloademacs-9631677d730a314f55378f5da6734db521f8130d.tar.gz
* lisp/sort.el (delete-duplicate-lines): Accept an optional `keep-blanks'
argument (before the `interactive' argument).
-rw-r--r--etc/NEWS6
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/sort.el25
3 files changed, 25 insertions, 11 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 42ad2066992..2fe3ba79d4f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -264,10 +264,12 @@ New features include:
name and arguments. Useful to trace the value of (current-buffer) or
(point) when the function is invoked.
-** New command `delete-duplicate-lines' has two types of operation:
-when its arg ADJACENT is non-nil (when called interactively with C-u C-u)
+** New command `delete-duplicate-lines' has new types of operation:
+When its arg ADJACENT is non-nil (when called interactively with C-u C-u)
it works like the utility `uniq'. Otherwise by default it deletes
duplicate lines everywhere in the region without regard to adjacency.
+When it arg KEEP-BLANKS is non-nil (when called interactively with C-u C-u C-u),
+duplicate blank lines are preserved.
** New `cycle-spacing' command allows cycling between having just one
space, no spaces, or reverting to the original spacing. Like
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 8dd3ef277b0..a8d79f958d3 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-24 Sam Steingold <sds@gnu.org>
+
+ * sort.el (delete-duplicate-lines): Accept an optional `keep-blanks'
+ argument (before the `interactive' argument).
+
2013-05-24 Stefan Monnier <monnier@iro.umontreal.ca>
* image-mode.el (image-mode-winprops): Add winprops to
diff --git a/lisp/sort.el b/lisp/sort.el
index 56e97061d13..9493768f6a0 100644
--- a/lisp/sort.el
+++ b/lisp/sort.el
@@ -568,7 +568,8 @@ From a program takes two point or marker arguments, BEG and END."
(insert (car ll)))))
;;;###autoload
-(defun delete-duplicate-lines (beg end &optional reverse adjacent interactive)
+(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
@@ -582,6 +583,9 @@ delete repeated lines only if they are adjacent. It works like the utility
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."
@@ -591,6 +595,7 @@ function behaves in all respects as if it had been called interactively."
(list (region-beginning) (region-end)
(equal current-prefix-arg '(4))
(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
@@ -605,14 +610,16 @@ function behaves in all respects as if it had been called interactively."
(and (< (point) end) (not (eobp))))
(setq line (buffer-substring-no-properties
(line-beginning-position) (line-end-position)))
- (if (if adjacent (equal line prev-line) (gethash line lines))
- (progn
- (delete-region (progn (forward-line 0) (point))
- (progn (forward-line 1) (point)))
- (if reverse (forward-line -1))
- (setq count (1+ count)))
- (if adjacent (setq prev-line line) (puthash line t lines))
- (forward-line (if reverse -1 1)))))
+ (if (and keep-blanks (string= "" line))
+ (forward-line 1)
+ (if (if adjacent (equal line prev-line) (gethash line lines))
+ (progn
+ (delete-region (progn (forward-line 0) (point))
+ (progn (forward-line 1) (point)))
+ (if reverse (forward-line -1))
+ (setq count (1+ count)))
+ (if adjacent (setq prev-line line) (puthash line t lines))
+ (forward-line (if reverse -1 1))))))
(set-marker beg nil)
(set-marker end nil)
(when interactive