I'm trying to use auto-complete to match in the middle of a string (after the characters
::). I'd like to typing
a then hit tab and have the list of candidates appear 'in full' e.g.
So far, I'm approaching this using an alist:
(setq l1 '(("apples" "fruit::apples") ("apples" "other::apples") ("bananas" "fruit::bananas") ("asparagus" "veg::asparagus")))
The completions are matched to the
car of each element in
l1 but return the
cdr. The 'prefix' part always ends with
:: and I would prefer to avoid using alternatives such as
Here is a function which prompts in the minibuffer and can display a list of candidates in another window:
(defun f1 () " Replaces text at point with completion, including the appropriate prefix" (interactive) ;; ac1 = all completions ;; lc1 = list of completions (let ((tap1 (thing-at-point 'symbol)) ac1 (lc1 ()) (resize-mini-windows t) (p1 (point)) elem1 r1) (when (not tap1) (set 'tap1 "")) (set 'ac1 (all-completions tap1 l1)) (mapc (lambda (elem1) (when (member (car elem1) ac1) (push (cdr elem1) lc1))) l1) (set 'lc1 (mapcar (lambda (x) (print (car x))) lc1)) (set 'elem1 (concat "Complete " tap1 " (TAB for selection) : ")) (set 'r1 (completing-read elem1 lc1)) (delete-region (- p1 (length tap1)) p1) (insert r1)))
so that if I call
f1 when at text that says
a I can replace it as desired.
Now, is there any way to adapt auto-complete to behave like this? I've been going through the source files and can't figure out where I should replace the usual list of
(all-completions STRING COLLECTION) with the list which includes the prefixes.
Is there a simpler way to do this? Should I be looking at company-mode instead?