Stefan Monnier via Users list for the GNU Emacs text editor writes: >> (add-hook 'completion-at-point-functions 'org-contacts-org-complete-function nil 'local) > > I assume you're careful to run this `add-hook` in the appropriate buffer > (otherwise, of course it won't do anything useful ;-) > I test this `add-hook` in org-mode buffer and elisp-mode buffer. >> When I evaluated upper code, and test by typing in "@Chri", I have not seen org-contacts related >> complete popup candidates. > > Try `M-x trace-function RET org-contacts-org-complete-function RET`. > Also you may prefer to first just try > > M-: (org-contacts-org-complete-function) RET > > and make sure that what it returns makes sense. > Then > > M-: (all-completions "Chr" (nth 2 (org-contacts-org-complete-function))) RET > > Maybe try also > > M-: (all-completions "@Chr" (nth 2 (org-contacts-org-complete-function))) RET > > then check whether the BEG..END area returned by > `org-contacts-org-complete-function` contains "@Chr" or "Chr". I followed your steps. Got following trace output: #+begin_example ====================================================================== 1 -> (org-contacts-org-complete-function) 1 <- org-contacts-org-complete-function: nil ====================================================================== 1 -> (org-contacts-org-complete-function) 1 <- org-contacts-org-complete-function: nil ====================================================================== 1 -> (org-contacts-org-complete-function) 1 <- org-contacts-org-complete-function: nil #+end_example I found ~org-contacts-org-complete-function~ returned a special value: #+begin_example #f(compiled-function (string pred action) #) #+end_example And this code, #+begin_src emacs-lisp (completion-table-dynamic (lambda (_) (mapcar (lambda (contact) (plist-get contact :name)) (org-contacts--all-contacts)))) #+end_src returned following: #+begin_example #[771 "....." [(lambda (_) (mapcar ... ...)) nil boundaries metadata minibuffer-selected-window window-live-p window-buffer complete-with-action] 8 " (fn STRING PRED ACTION)"] #+end_example Don't know whether this is correct. I can confirm the bellowing basic completion with ~try-completion~ code works fine: #+begin_src emacs-lisp (try-completion "tri" (mapcar (lambda (contact) (plist-get contact :name)) (org-contacts--all-contacts))) #+end_src # ================================================================================================== At last, I paste my latest simple code version: #+begin_src emacs-lisp (defun org-contacts-org-complete-function () "Function used in `completion-at-point-functions' in `org-mode' to complete @name." (when-let* ((bounds (bounds-of-thing-at-point 'symbol)) (begin (1- (car bounds))) (end (cdr bounds)) (symbol (buffer-substring-no-properties begin end)) (org-contacts-prefix-p (string-prefix-p "@" symbol)) ;; (prefix (substring-no-properties symbol 1 nil)) ) (when org-contacts-prefix-p (list begin end (completion-table-dynamic (lambda (_) (mapcar (lambda (contact) (plist-get contact :name)) (org-contacts--all-contacts)))))))) #+end_src And test with execute following ~add-hook~ in org-mode buffer or emacs-lisp-mode buffer: #+begin_src emacs-lisp (add-hook 'completion-at-point-functions 'org-contacts-org-complete-function nil 'local) #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3