* lisp/pcomplete.el (pcomplete-completions-at-point): Return nil if there

aren't any completions at point.
This commit is contained in:
Stefan Monnier 2011-04-28 16:39:11 -03:00
parent 638f053a0e
commit 08abfaad86
2 changed files with 60 additions and 51 deletions

View file

@ -1,3 +1,8 @@
2011-04-28 Stefan Monnier <monnier@iro.umontreal.ca>
* pcomplete.el (pcomplete-completions-at-point): Return nil if there
aren't any completions at point.
2011-04-28 Juanma Barranquero <lekktu@gmail.com>
* subr.el (display-delayed-warnings): New function.
@ -5,6 +10,10 @@
2011-04-28 Stefan Monnier <monnier@iro.umontreal.ca>
* minibuffer.el (completion-at-point, completion-help-at-point):
Don't presume that a given completion-at-point-function will always
use the same calling convention.
* pcomplete.el (pcomplete-completions-at-point):
Obey pcomplete-ignore-case. Don't call pcomplete-norm-func unless
pcomplete-seen is non-nil.

View file

@ -489,57 +489,57 @@ Same as `pcomplete' but using the standard completion UI."
;; prefix from pcomplete-stub.
(beg (max (- (point) (length pcomplete-stub))
(pcomplete-begin)))
(buftext (buffer-substring beg (point)))
(table
(cond
((null completions) nil)
((not (equal pcomplete-stub buftext))
;; This isn't always strictly right (e.g. if
;; FOO="toto/$FOO", then completion of /$FOO/bar may
;; result in something incorrect), but given the lack of
;; any other info, it's about as good as it gets, and in
;; practice it should work just fine (fingers crossed).
(let ((prefixes (pcomplete--common-quoted-suffix
pcomplete-stub buftext)))
(apply-partially
'pcomplete--table-subvert
completions
(cdr prefixes) (car prefixes))))
(t
(lexical-let ((completions completions))
(lambda (string pred action)
(let ((res (complete-with-action
action completions string pred)))
(if (stringp res)
(pcomplete-quote-argument res)
res)))))))
(pred
;; pare it down, if applicable
(when (and table pcomplete-use-paring pcomplete-seen)
(setq pcomplete-seen
(mapcar (lambda (f)
(funcall pcomplete-norm-func
(directory-file-name f)))
pcomplete-seen))
(lambda (f)
(not (when pcomplete-seen
(member
(funcall pcomplete-norm-func
(directory-file-name f))
pcomplete-seen)))))))
(unless (zerop (length pcomplete-termination-string))
;; Add a space at the end of completion. Use a terminator-regexp
;; that never matches since the terminator cannot appear
;; within the completion field anyway.
(setq table
(apply-partially #'completion-table-with-terminator
(cons pcomplete-termination-string
"\\`a\\`")
table)))
(when pcomplete-ignore-case
(setq table
(apply-partially #'completion-table-case-fold table)))
(list beg (point) table :predicate pred))))
(buftext (buffer-substring beg (point))))
(when completions
(let ((table
(cond
((not (equal pcomplete-stub buftext))
;; This isn't always strictly right (e.g. if
;; FOO="toto/$FOO", then completion of /$FOO/bar may
;; result in something incorrect), but given the lack of
;; any other info, it's about as good as it gets, and in
;; practice it should work just fine (fingers crossed).
(let ((prefixes (pcomplete--common-quoted-suffix
pcomplete-stub buftext)))
(apply-partially
'pcomplete--table-subvert
completions
(cdr prefixes) (car prefixes))))
(t
(lexical-let ((completions completions))
(lambda (string pred action)
(let ((res (complete-with-action
action completions string pred)))
(if (stringp res)
(pcomplete-quote-argument res)
res)))))))
(pred
;; Pare it down, if applicable.
(when (and pcomplete-use-paring pcomplete-seen)
(setq pcomplete-seen
(mapcar (lambda (f)
(funcall pcomplete-norm-func
(directory-file-name f)))
pcomplete-seen))
(lambda (f)
(not (when pcomplete-seen
(member
(funcall pcomplete-norm-func
(directory-file-name f))
pcomplete-seen)))))))
(unless (zerop (length pcomplete-termination-string))
;; Add a space at the end of completion. Use a terminator-regexp
;; that never matches since the terminator cannot appear
;; within the completion field anyway.
(setq table
(apply-partially #'completion-table-with-terminator
(cons pcomplete-termination-string
"\\`a\\`")
table)))
(when pcomplete-ignore-case
(setq table
(apply-partially #'completion-table-case-fold table)))
(list beg (point) table :predicate pred))))))
;; I don't think such commands are usable before first setting up buffer-local
;; variables to parse args, so there's no point autoloading it.