org-contacts.el: Add new link type "contact:"
* contrib/lisp/org-contacts.el (org-contacts-link-store): Store a link of org-contacts in Org file. * contrib/lisp/org-contacts.el (org-contacts-link-open): Open contact: link in Org file. * contrib/lisp/org-contacts.el (org-contacts-link-complete): Insert a contact: link with completion of contacts. * contrib/lisp/org-contacts.el (org-contacts-link-face): Set different face for contact: link.
This commit is contained in:
parent
4e3f139857
commit
478dfcc9b7
1 changed files with 75 additions and 0 deletions
|
@ -1146,6 +1146,81 @@ are effectively trimmed). If nil, all zero-length substrings are retained."
|
||||||
(setq proplist (cons bufferstring proplist))))
|
(setq proplist (cons bufferstring proplist))))
|
||||||
(cdr (reverse proplist))))
|
(cdr (reverse proplist))))
|
||||||
|
|
||||||
|
;;; Add an Org link type `org-contact:' for easy jump to or searching org-contacts headline.
|
||||||
|
;;; link spec: [[org-contact:query][desc]]
|
||||||
|
(org-link-set-parameters "org-contact"
|
||||||
|
:follow 'org-contacts-link-open
|
||||||
|
:complete 'org-contacts-link-complete
|
||||||
|
:store 'org-contacts-link-store
|
||||||
|
:face 'org-contacts-link-face)
|
||||||
|
|
||||||
|
(defun org-contacts-link-store ()
|
||||||
|
"Store the contact in `org-contacts-files' with a link."
|
||||||
|
(when (eq major-mode 'org-mode)
|
||||||
|
;; (member (buffer-file-name) (mapcar 'expand-file-name org-contacts-files))
|
||||||
|
(let ((headline-str (substring-no-properties (org-get-heading t t t t))))
|
||||||
|
(org-store-link-props
|
||||||
|
:type "org-contact"
|
||||||
|
:link headline-str
|
||||||
|
:description headline-str))))
|
||||||
|
|
||||||
|
(defun org-contacts--all-contacts ()
|
||||||
|
"Return an alist (name . (file . position)) of all contacts in `org-contacts-files'."
|
||||||
|
(car (mapcar
|
||||||
|
(lambda (file)
|
||||||
|
(unless (buffer-live-p (get-buffer (file-name-nondirectory file)))
|
||||||
|
(find-file file))
|
||||||
|
(with-current-buffer (get-buffer (file-name-nondirectory file))
|
||||||
|
(org-map-entries
|
||||||
|
(lambda ()
|
||||||
|
(let ((name (substring-no-properties (org-get-heading t t t t)))
|
||||||
|
(file (buffer-file-name))
|
||||||
|
(position (point)))
|
||||||
|
`(:name ,name :file ,file :position ,position))))))
|
||||||
|
org-contacts-files)))
|
||||||
|
|
||||||
|
(defun org-contacts-link-open (path)
|
||||||
|
"Open contacts: link type with jumping or searching."
|
||||||
|
(let ((query path))
|
||||||
|
(cond
|
||||||
|
((string-match "/.*/" query)
|
||||||
|
(let* ((f (car org-contacts-files))
|
||||||
|
(buf (get-buffer (file-name-nondirectory f))))
|
||||||
|
(unless (buffer-live-p buf) (find-file f))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(string-match "/\\(.*\\)/" query)
|
||||||
|
(occur (match-string 1 query)))))
|
||||||
|
(t
|
||||||
|
(let* ((f (car org-contacts-files))
|
||||||
|
(buf (get-buffer (file-name-nondirectory f))))
|
||||||
|
(unless (buffer-live-p buf) (find-file f))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(goto-char (marker-position (org-find-exact-headline-in-buffer query)))))
|
||||||
|
;; FIXME
|
||||||
|
;; (let* ((contact-entry (plist-get (org-contacts--all-contacts) query))
|
||||||
|
;; (contact-name (plist-get contact-entry :name))
|
||||||
|
;; (file (plist-get contact-entry :file))
|
||||||
|
;; (position (plist-get contact-entry :position))
|
||||||
|
;; (buf (get-buffer (file-name-nondirectory file))))
|
||||||
|
;; (unless (buffer-live-p buf) (find-file file))
|
||||||
|
;; (with-current-buffer buf (goto-char position)))
|
||||||
|
))))
|
||||||
|
|
||||||
|
(defun org-contacts-link-complete (&optional arg)
|
||||||
|
"Create a org-contacts link using completion."
|
||||||
|
(let ((name (completing-read "org-contact Name: "
|
||||||
|
(mapcar
|
||||||
|
(lambda (plist) (plist-get plist :name))
|
||||||
|
(org-contacts--all-contacts)))))
|
||||||
|
(concat "org-contact:" name)))
|
||||||
|
|
||||||
|
(defun org-contacts-link-face (path)
|
||||||
|
"Different face color for different org-contacts link query."
|
||||||
|
(cond
|
||||||
|
((string-match "/.*/" path)
|
||||||
|
'(:background "sky blue" :overline t :slant 'italic))
|
||||||
|
(t '(:background "green yellow" :underline t))))
|
||||||
|
|
||||||
(provide 'org-contacts)
|
(provide 'org-contacts)
|
||||||
|
|
||||||
;;; org-contacts.el ends here
|
;;; org-contacts.el ends here
|
||||||
|
|
Loading…
Reference in a new issue