[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v |
Date: |
Wed, 21 May 2008 20:52:45 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Stefan Monnier <monnier> 08/05/21 20:52:44
Index: lisp/minibuffer.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/minibuffer.el,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -b -r1.40 -r1.41
--- lisp/minibuffer.el 20 May 2008 17:03:30 -0000 1.40
+++ lisp/minibuffer.el 21 May 2008 20:52:44 -0000 1.41
@@ -489,6 +489,59 @@
t)
(t t)))))
+(defvar completion-all-sorted-completions nil)
+(make-variable-buffer-local 'completion-all-sorted-completions)
+
+(defun completion--flush-all-sorted-completions (&rest ignore)
+ (setq completion-all-sorted-completions nil))
+
+(defun completion-all-sorted-completions ()
+ (or completion-all-sorted-completions
+ (let* ((start (field-beginning))
+ (end (field-end))
+ (all (completion-all-completions (buffer-substring start end)
+ minibuffer-completion-table
+ minibuffer-completion-predicate
+ (- (point) start)))
+ (last (last all))
+ (base-size (or (cdr last) 0)))
+ (when last
+ (setcdr last nil)
+ ;; Prefer shorter completions.
+ (setq all (sort all (lambda (c1 c2) (< (length c1) (length c2)))))
+ ;; Prefer recently used completions.
+ (let ((hist (symbol-value minibuffer-history-variable)))
+ (setq all (sort all (lambda (c1 c2)
+ (> (length (member c1 hist))
+ (length (member c2 hist)))))))
+ ;; Cache the result. This is not just for speed, but also so that
+ ;; repeated calls to minibuffer-force-complete can cycle through
+ ;; all possibilities.
+ (add-hook 'after-change-functions
+ 'completion--flush-all-sorted-completions nil t)
+ (setq completion-all-sorted-completions
+ (nconc all base-size))))))
+
+(defun minibuffer-force-complete ()
+ "Complete the minibuffer to an exact match.
+Repeated uses step through the possible completions."
+ (interactive)
+ ;; FIXME: Need to deal with the extra-size issue here as well.
+ (let* ((start (field-beginning))
+ (end (field-end))
+ (all (completion-all-sorted-completions)))
+ (if (not (consp all))
+ (minibuffer-message (if all "No more completions" "No completions"))
+ (goto-char end)
+ (insert (car all))
+ (delete-region (+ start (cdr (last all))) end)
+ ;; If completing file names, (car all) may be a directory, so we'd now
+ ;; have a new set of possible completions and might want to reset
+ ;; completion-all-sorted-completions to nil, but we prefer not to,
+ ;; so that repeated calls minibuffer-force-complete still cycle
+ ;; through the previous possible completions.
+ (setq completion-all-sorted-completions (cdr all)))))
+
(defun minibuffer-complete-and-exit ()
"If the minibuffer contents is a valid completion then exit.
Otherwise try to complete it. If completion leads to a valid completion,
@@ -861,6 +914,9 @@
(let ((map minibuffer-local-completion-map))
(define-key map "\t" 'minibuffer-complete)
+ ;; M-TAB is already abused for many other purposes, so we should find
+ ;; another binding for it.
+ ;; (define-key map "\e\t" 'minibuffer-force-complete)
(define-key map " " 'minibuffer-complete-word)
(define-key map "?" 'minibuffer-completion-help))
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/02
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/02
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Andreas Schwab, 2008/05/04
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Glenn Morris, 2008/05/06
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Juanma Barranquero, 2008/05/07
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/20
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v,
Stefan Monnier <=
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/22
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/22
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Stefan Monnier, 2008/05/29
- [Emacs-diffs] Changes to emacs/lisp/minibuffer.el,v, Juanma Barranquero, 2008/05/30