Function: completion--complete-and-exit

completion--complete-and-exit is a byte-compiled function defined in minibuffer.el.gz.

Signature

(completion--complete-and-exit BEG END EXIT-FUNCTION COMPLETION-FUNCTION)

Documentation

Exit from require-match minibuffer.

COMPLETION-FUNCTION is called if the current buffer's content does not appear to be a match.

Source Code

;; Defined in /usr/src/emacs/lisp/minibuffer.el.gz
(defun completion--complete-and-exit (beg end
                                          exit-function completion-function)
  "Exit from `require-match' minibuffer.
COMPLETION-FUNCTION is called if the current buffer's content does not
appear to be a match."
  (cond
   ;; Allow user to specify null string
   ((= beg end) (funcall exit-function))
   ;; The CONFIRM argument is a predicate.
   ((functionp minibuffer-completion-confirm)
    (if (funcall minibuffer-completion-confirm
                 (buffer-substring beg end))
        (funcall exit-function)
      (unless completion-fail-discreetly
	(ding)
	(completion--message "No match"))))
   ;; See if we have a completion from the table.
   ((test-completion (buffer-substring beg end)
                     minibuffer-completion-table
                     minibuffer-completion-predicate)
    ;; FIXME: completion-ignore-case has various slightly
    ;; incompatible meanings.  E.g. it can reflect whether the user
    ;; wants completion to pay attention to case, or whether the
    ;; string will be used in a context where case is significant.
    ;; E.g. usually try-completion should obey the first, whereas
    ;; test-completion should obey the second.
    (when completion-ignore-case
      ;; Fixup case of the field, if necessary.
      (let* ((string (buffer-substring beg end))
             (compl (try-completion
                     string
                     minibuffer-completion-table
                     minibuffer-completion-predicate)))
        (when (and (stringp compl) (not (equal string compl))
                   ;; If it weren't for this piece of paranoia, I'd replace
                   ;; the whole thing with a call to do-completion.
                   ;; This is important, e.g. when the current minibuffer's
                   ;; content is a directory which only contains a single
                   ;; file, so `try-completion' actually completes to
                   ;; that file.
                   (= (length string) (length compl)))
          (completion--replace beg end compl))))
    (funcall exit-function))
   ;; The user is permitted to exit with an input that's rejected
   ;; by test-completion, after confirming her choice.
   ((memq minibuffer-completion-confirm '(confirm confirm-after-completion))
    (if (or (eq last-command this-command)
            ;; For `confirm-after-completion' we only ask for confirmation
            ;; if trying to exit immediately after typing TAB (this
            ;; catches most minibuffer typos).
            (and (eq minibuffer-completion-confirm 'confirm-after-completion)
                 (not (memq last-command minibuffer-confirm-exit-commands))))
        (funcall exit-function)
      (minibuffer-message "Confirm")
      nil))

   (t
    ;; Call do-completion, but ignore errors.
    (funcall completion-function))))