branch: externals/org-contacts commit 8754afeb1410028d783bb111b36e364977d533b3 Author: stardiviner <numbch...@gmail.com> Commit: stardiviner <numbch...@gmail.com>
refactor capf completion popup doc function --- org-contacts.el | 71 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/org-contacts.el b/org-contacts.el index 1ee8e0740b..dd99c4b39a 100644 --- a/org-contacts.el +++ b/org-contacts.el @@ -668,42 +668,67 @@ See (org) Matching tags and properties for a complete description." ;; TODO (ignore candidate)) -(defun org-contacts-org-complete--doc-function (candidate) +(defun org-contacts--candidates-org-complete-get-doc (candidate) "Return `org-contacts' content of contact CANDIDATE." - (let* ((candidate (substring-no-properties candidate 1 nil)) - (contact (seq-find - (lambda (contact) (string-equal (plist-get contact :name) candidate)) + (let* ((contact (seq-find + (lambda (contact) (string-equal (plist-get contact :name) (get-text-property 0 'contact-name candidate))) (org-contacts-all-contacts))) (name (plist-get contact :name)) (file (plist-get contact :file)) (position (plist-get contact :position)) - (doc-buffer (get-buffer-create " *org-contact*")) (org-contact-buffer (get-buffer (find-file-noselect file))) ;; get org-contact headline and property drawer. - (contents (with-current-buffer org-contact-buffer - (when (derived-mode-p 'org-mode) - (save-excursion - (goto-char position) - (cond ((ignore-errors (org-edit-src-code)) - (delete-other-windows)) - ((org-at-block-p) - (org-narrow-to-block)) - (t (org-narrow-to-subtree))) - (let ((content (buffer-substring (point-min) (point-max)))) - (when (buffer-narrowed-p) (widen)) - content)))))) - (ignore name) + (contact-content (with-current-buffer org-contact-buffer + (when (derived-mode-p 'org-mode) + (save-excursion + (goto-char position) + (cond + ((org-at-block-p) + (org-narrow-to-block)) + (t (org-narrow-to-subtree))) + (let ((content (buffer-substring (point-min) (point-max)))) + (when (buffer-narrowed-p) (widen)) + content)))))) + contact-content)) + +;; TEST: +;; (setq org-contacts--candidates-complete-doc-cache nil) +;; (org-contacts--candidates-complete-doc-cache-setting) + +(defvar org-contacts--candidates-complete-doc-cache nil + "A list of contact candidates completion doc cache.") + +(defun org-contacts--candidates-complete-doc-cache-setting () + "Generate cache for contact candidates completion doc." + (if (null org-contacts--candidates-complete-doc-cache) + (let* ((candidates (org-contacts--candidates-cache-setting)) + (candidates-complete-doc-list (mapcar + (lambda (candidate) + (cons candidate (org-contacts--candidates-org-complete-get-doc candidate))) + candidates))) + (setq org-contacts--candidates-complete-doc-cache candidates-complete-doc-list)) + org-contacts--candidates-complete-doc-cache)) + +(defun org-contacts-org-complete--doc-function (candidate) + "Populates *org-contact* with the documentation for the content of contact CANDIDATE." + (let ((doc (alist-get candidate (org-contacts--candidates-complete-doc-cache-setting))) + (doc-buffer (get-buffer-create " *org-contact*"))) (with-current-buffer doc-buffer (read-only-mode 1) (let ((inhibit-read-only t)) (erase-buffer) - (insert contents) + (insert doc) (org-mode) (org-fold-show-all) - (font-lock-ensure))) - doc-buffer)) + (font-lock-ensure)) + (current-buffer)))) + +;; TEST: +;; (org-contacts-org-complete--doc-function (car org-contacts--candidates-cache-list)) +;; (benchmark 1 '(alist-get (car org-contacts--candidates-cache-list) (org-contacts--candidates-complete-doc-cache-setting))) +;; (benchmark 1 '(org-contacts-org-complete--doc-function (nth 10 org-contacts--candidates-cache-list))) -;;; display company-mode doc buffer bellow current window. +;; display company-mode doc buffer bellow current window. (add-to-list 'display-buffer-alist '("^ \\*org-contact\\*" . (display-buffer-below-selected))) (defun org-contacts-org-complete--location-function (candidate) @@ -737,13 +762,11 @@ Usage: (add-hook \\='completion-at-point-functions (mapcar (lambda (contact) (concat "@" (plist-get contact :name))) (org-contacts-all-contacts)))) - :predicate 'stringp :exclusive 'no ;; properties check out `completion-extra-properties' :annotation-function #'org-contacts-org-complete--annotation-function ;; :exit-function ; TODO change completion candidate inserted contact name into org-contact link?? - :company-docsig #'identity ; metadata :company-doc-buffer #'org-contacts-org-complete--doc-function ; doc popup :company-location #'org-contacts-org-complete--location-function))))