* 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 Leo Liu <sdl.web@gmail.com>
+
+ * 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 <monnier@iro.umontreal.ca>
* progmodes/f90.el (f90-keywords-re, f90-keywords-level-3-re)
(if (string-match re name)
(setq matches (cons item matches)))))
items))
- matches))
+ (delete-consecutive-dups matches t)))
(defun ido-set-matches ()
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)
(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)))
(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)
(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 ()
(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.