1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-04 11:40:22 +00:00

* lisp/minibuffer.el (completion-table-with-context): Fix inf-loop.

Reported by Aaron S. Hawley <aaron.s.hawley@gmail.com>.
This commit is contained in:
Stefan Monnier 2012-02-22 23:38:29 -05:00
parent 371fb83399
commit b291b57241
2 changed files with 30 additions and 24 deletions

View File

@ -1,3 +1,8 @@
2012-02-23 Stefan Monnier <monnier@iro.umontreal.ca>
* minibuffer.el (completion-table-with-context): Fix inf-loop.
Reported by Aaron S. Hawley <aaron.s.hawley@gmail.com>.
2012-02-23 Glenn Morris <rgm@gnu.org>
* emacs-lisp/authors.el (authors-aliases, authors-fixed-case)

View File

@ -226,30 +226,31 @@ case sensitive instead."
(defun completion-table-with-context (prefix table string pred action)
;; TODO: add `suffix' maybe?
;; Notice that `pred' may not be a function in some abusive cases.
(when (functionp pred)
(setq pred
;; Predicates are called differently depending on the nature of
;; the completion table :-(
(cond
((vectorp table) ;Obarray.
(lambda (sym) (funcall pred (concat prefix (symbol-name sym)))))
((hash-table-p table)
(lambda (s _v) (funcall pred (concat prefix s))))
((functionp table)
(lambda (s) (funcall pred (concat prefix s))))
(t ;Lists and alists.
(lambda (s)
(funcall pred (concat prefix (if (consp s) (car s) s))))))))
(if (eq (car-safe action) 'boundaries)
(let* ((len (length prefix))
(bound (completion-boundaries string table pred (cdr action))))
(list* 'boundaries (+ (car bound) len) (cdr bound)))
(let ((comp (complete-with-action action table string pred)))
(cond
;; In case of try-completion, add the prefix.
((stringp comp) (concat prefix comp))
(t comp)))))
(let ((pred
(if (not (functionp pred))
;; Notice that `pred' may not be a function in some abusive cases.
pred
;; Predicates are called differently depending on the nature of
;; the completion table :-(
(cond
((vectorp table) ;Obarray.
(lambda (sym) (funcall pred (concat prefix (symbol-name sym)))))
((hash-table-p table)
(lambda (s _v) (funcall pred (concat prefix s))))
((functionp table)
(lambda (s) (funcall pred (concat prefix s))))
(t ;Lists and alists.
(lambda (s)
(funcall pred (concat prefix (if (consp s) (car s) s)))))))))
(if (eq (car-safe action) 'boundaries)
(let* ((len (length prefix))
(bound (completion-boundaries string table pred (cdr action))))
(list* 'boundaries (+ (car bound) len) (cdr bound)))
(let ((comp (complete-with-action action table string pred)))
(cond
;; In case of try-completion, add the prefix.
((stringp comp) (concat prefix comp))
(t comp))))))
(defun completion-table-with-terminator (terminator table string pred action)
"Construct a completion table like TABLE but with an extra TERMINATOR.