diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-02-22 23:38:29 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-02-22 23:38:29 -0500 |
commit | b291b57241a4e46013db0989991635364fb4beb2 (patch) | |
tree | 200c070183634546660f8e59eab34515ff9aadda /lisp/minibuffer.el | |
parent | 371fb833991718335bf5b3661bd4bb209c51ba11 (diff) | |
download | emacs-b291b57241a4e46013db0989991635364fb4beb2.tar.gz |
* lisp/minibuffer.el (completion-table-with-context): Fix inf-loop.
Reported by Aaron S. Hawley <aaron.s.hawley@gmail.com>.
Diffstat (limited to 'lisp/minibuffer.el')
-rw-r--r-- | lisp/minibuffer.el | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 8564cc2009b..2414baf8e3c 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -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. |