This repository has been archived by the owner on Jun 15, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
citar-capf.el
94 lines (76 loc) · 3.66 KB
/
citar-capf.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;;; citar-capf.el --- bibtex completation at point -*- lexical-binding: t -*-
;; Author: Colin McLear
;; Maintainer: Colin McLear
;; Version: version
;; Package-Requires: (citar "0.9")
;; Homepage: homepage
;; Keywords: keywords
;; This file is not part of GNU Emacs
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;; Completion at point for citations using citar as its backend.
;;; Code:
;;;; Requirements
(require 'citar)
(require 'org)
(declare-function org-element-at-point "org-element")
(declare-function citar--get-candidates "citar")
;;;; Functions
(defun citar-capf ()
"Complete citation key at point for org, markdown, or latex.
The parsing of the bibtex file is handled by citar."
(let ((element (org-element-at-point))
(capf-citar-latex-regexp "\\(?:cite\\(?:\\(?:[pt]\\*\\|[pt]\\)?{\\)\\)\\([[:alnum:]_-]*,\\)*\\([[:alnum:]_-]*\\)")
(capf-citar-markdown-regexp (concat "-?@" ; @ preceded by optional -
"\\(?:"
"{\\(?1:.*?\\)}" ; brace-delimited key
"\\|"
"\\(?1:[[:alnum:]_][[:alnum:]]*\\(?:[:.#$%&+?<>~/-][[:alnum:]]+\\)*\\)"
"\\)")))
;; only list candidates in certain contexts
(when
;; conditional recognition of citation key by mode
(cond
;; latex-mode
((derived-mode-p 'latex-mode)
(looking-back capf-citar-latex-regexp 2))
;; org-mode
((and (derived-mode-p 'org-mode)
(or (eq 'citation (org-element-type (org-element-context element)))
(and (or (eq ?@ (char-before))
(looking-back org-element-citation-key-re
(line-beginning-position)))
(let ((origin (point)))
(save-excursion
(and (re-search-backward org-element-citation-prefix-re
(org-element-property
:begin element)
t)
(not (search-forward "]" origin t)))))))))
;; markdown-mode
((and (derived-mode-p 'markdown-mode)
(or (eq ?@ (char-before))
(looking-back capf-citar-markdown-regexp
(line-beginning-position))))))
;; Get and insert candidate
(let* ((candidates (citar--get-candidates))
(begin (save-excursion (backward-word) (point)))
(end (point)))
(list begin end candidates
:exclusive 'no
:exit-function
(lambda (str _status)
;; take completion str and replace with key
(delete-char (- (length str)))
(insert (cadr (assoc str candidates)))))))))
(provide 'citar-capf)
;;; citar-capf.el ends here