From c7a8fcacf99548e19b4efcf6900abc66c1de3a9d Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Fri, 17 May 2013 10:43:41 +0800 Subject: [PATCH] * subr.el (delete-consecutive-dups): New function. * ido.el (ido-set-matches-1): Use it. * progmodes/octave.el (inferior-octave-completion-table): Use it. * ido.el (ido-remove-consecutive-dups): Remove. --- lisp/ChangeLog | 7 +++++++ lisp/ido.el | 19 ++----------------- lisp/progmodes/octave.el | 8 +++++--- lisp/subr.el | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 78eefc86500..4a060875e3c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2013-05-17 Leo Liu + + * subr.el (delete-consecutive-dups): New function. + * ido.el (ido-set-matches-1): Use it. + * progmodes/octave.el (inferior-octave-completion-table): Use it. + * ido.el (ido-remove-consecutive-dups): Remove. + 2013-05-17 Stefan Monnier * progmodes/f90.el (f90-keywords-re, f90-keywords-level-3-re) diff --git a/lisp/ido.el b/lisp/ido.el index 297e3258338..8087124765c 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -3785,7 +3785,7 @@ This is to make them appear as if they were \"virtual buffers\"." (if (string-match re name) (setq matches (cons item matches))))) items)) - matches)) + (delete-consecutive-dups matches t))) (defun ido-set-matches () @@ -4676,21 +4676,6 @@ For details of keybindings, see `ido-find-file'." ido-temp-list)))) (ido-to-end summaries))) -(defun ido-remove-consecutive-dups (list) - "Remove consecutive duplicates in LIST. -Use `equal' for comparison. First and last elements are -considered consecutive." - (let ((tail list) - (last (make-symbol "")) - (result nil)) - (while (consp tail) - (unless (equal (car tail) last) - (push (setq last (car tail)) result)) - (setq tail (cdr tail))) - (nreverse (or (and (equal last (car list)) - (cdr result)) - result)))) - ;;; Helper functions for other programs (put 'dired-do-rename 'ido 'ignore) @@ -4808,7 +4793,7 @@ DEF, if non-nil, is the default value." (ido-directory-nonreadable nil) (ido-directory-too-big nil) (ido-context-switch-command 'ignore) - (ido-choice-list (ido-remove-consecutive-dups choices))) + (ido-choice-list choices)) ;; Initialize ido before invoking ido-read-internal (ido-common-initialization) (ido-read-internal 'list prompt hist def require-match initial-input))) diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el index ab2f570cccb..451ac2791a7 100644 --- a/lisp/progmodes/octave.el +++ b/lisp/progmodes/octave.el @@ -38,7 +38,9 @@ (require 'newcomment) (eval-and-compile (unless (fboundp 'user-error) - (defalias 'user-error 'error))) + (defalias 'user-error 'error)) + (unless (fboundp 'delete-consecutive-dups) + (defalias 'delete-consecutive-dups 'delete-dups))) (eval-when-compile (unless (fboundp 'setq-local) (defmacro setq-local (var val) @@ -777,8 +779,8 @@ startup file, `~/.emacs-octave'." (inferior-octave-send-list-and-digest (list (concat "completion_matches (\"" command "\");\n"))) (setq cache (list command (float-time) - (sort (delete-dups inferior-octave-output-list) - 'string-lessp)))) + (delete-consecutive-dups + (sort inferior-octave-output-list 'string-lessp))))) (car (cddr cache)))))) (defun inferior-octave-completion-at-point () diff --git a/lisp/subr.el b/lisp/subr.el index 9bf11a13ef6..9b2c8157ac8 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -376,6 +376,23 @@ one is kept." (setq tail (cdr tail)))) list) +;; See http://lists.gnu.org/archive/html/emacs-devel/2013-05/msg00204.html +(defun delete-consecutive-dups (list &optional circular) + "Destructively remove `equal' consecutive duplicates from LIST. +First and last elements are considered consecutive if CIRCULAR is +non-nil." + (let ((tail list) last) + (while (consp tail) + (if (equal (car tail) (cadr tail)) + (setcdr tail (cddr tail)) + (setq last (car tail) + tail (cdr tail)))) + (if (and circular + (cdr list) + (equal last (car list))) + (nbutlast list) + list))) + (defun number-sequence (from &optional to inc) "Return a sequence of numbers from FROM to TO (both inclusive) as a list. INC is the increment used between numbers in the sequence and defaults to 1. -- 2.39.2