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. fruit::apples
, others::apples
, veg::asparagus
.
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 fruit-apples
...
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?