Function: completion-pcm--merge-try
completion-pcm--merge-try is a byte-compiled function defined in
minibuffer.el.gz.
Signature
(completion-pcm--merge-try PATTERN ALL PREFIX SUFFIX)
Source Code
;; Defined in /usr/src/emacs/lisp/minibuffer.el.gz
(defun completion-pcm--merge-try (pattern all prefix suffix)
(cond
((not (consp all)) all)
((and (not (consp (cdr all))) ;Only one completion.
;; Ignore completion-ignore-case here.
(equal (completion-pcm--pattern->string pattern) (car all)))
t)
(t
(let* ((mergedpat (completion-pcm--merge-completions all pattern))
;; `mergedpat' is in reverse order. Place new point (by
;; order of preference) either at the old point, or at
;; the last place where there's something to choose, or
;; at the very end.
(pointpat (or (memq 'point mergedpat)
(memq 'any mergedpat)
(memq 'star mergedpat)
;; Not `prefix'.
mergedpat))
;; New pos from the start.
(newpos (length (completion-pcm--pattern->string pointpat)))
;; Do it afterwards because it changes `pointpat' by side effect.
(merged (completion-pcm--pattern->string (nreverse mergedpat))))
(setq suffix (completion--merge-suffix
;; The second arg should ideally be "the position right
;; after the last char of `merged' that comes from the text
;; to be completed". But completion-pcm--merge-completions
;; currently doesn't give us that info. So instead we just
;; use the "last but one" position, which tends to work
;; well in practice since `suffix' always starts
;; with a boundary and we hence mostly/only care about
;; merging this boundary (bug#15419).
merged (max 0 (1- (length merged))) suffix))
(cons (concat prefix merged suffix) (+ newpos (length prefix)))))))