소스 검색

oc-basic: Improve <mouse-1> handling on citation keys

* lisp/oc-basic.el (org-cite-basic--set-keymap): New function.
(org-cite-basic--make-repair-keymap): Remove function.
(org-cite-basic-activate): Use new function.
Nicolas Goaziou 3 년 전
부모
커밋
18570684ad
1개의 변경된 파일33개의 추가작업 그리고 22개의 파일을 삭제
  1. 33 22
      lisp/oc-basic.el

+ 33 - 22
lisp/oc-basic.el

@@ -67,6 +67,8 @@
 (require 'bibtex)
 (require 'oc)
 
+(declare-function org-open-at-point "org" (&optional arg))
+
 (declare-function org-element-interpret-data "org-element" (data))
 (declare-function org-element-property "org-element" (property element))
 (declare-function org-element-type "org-element" (element))
@@ -399,21 +401,28 @@ Optional argument INFO is the export state, as a property list."
                     (org-string-distance k key)))
               keys))
 
-(defun org-cite-basic--make-repair-keymap (beg end suggestions)
-  "Return keymap active on wrong citation keys.
-BEG and END are boundaries of the wrong citation.  SUGGESTIONS is a list of
-replacement keys, as strings."
-  (let ((km (make-sparse-keymap))
-        (f (lambda ()
-             (interactive)
-             (setf (buffer-substring beg end)
-                   (concat "@"
-                           (if (= 1 (length suggestions))
-                               (car suggestions)
-                             (completing-read "Substitute key: "
-                                              suggestions nil t)))))))
-    (define-key km (kbd "<mouse-1>") f)
-    km))
+(defun org-cite-basic--set-keymap (beg end suggestions)
+  "Set keymap on citation key between BEG and END positions.
+
+When the key is know, SUGGESTIONS is nil.  Otherwise, it may be
+a list of replacement keys, as strings, which will be offered as
+substitutes for the unknown key.  Finally, it may be the symbol
+`all'."
+  (let ((km (make-sparse-keymap)))
+    (define-key km (kbd "<mouse-1>")
+      (pcase suggestions
+        ('nil #'org-open-at-point)
+        ('all #'org-cite-insert)
+        (_
+         (lambda ()
+           (interactive)
+           (setf (buffer-substring beg end)
+                 (concat "@"
+                         (if (= 1 (length suggestions))
+                             (car suggestions)
+                           (completing-read "Did you mean: "
+                                            suggestions nil t))))))))
+    (put-text-property beg end 'keymap km)))
 
 (defun org-cite-basic-activate (citation)
   "Set various text properties on CITATION object.
@@ -438,24 +447,26 @@ them with a mouse click."
         (if (member key keys)
             ;; Activate a correct key.  Face is `org-cite-key' and
             ;; `help-echo' displays bibliography entry, for reference.
+            ;; <mouse-1> calls `org-open-at-point'.
             (let* ((entry (org-cite-basic--get-entry key))
                    (bibliography-entry
                     (org-element-interpret-data
                      (org-cite-basic--print-entry entry "plain"))))
               (add-face-text-property beg end 'org-cite-key)
-              (put-text-property beg end 'help-echo bibliography-entry))
+              (put-text-property beg end 'help-echo bibliography-entry)
+              (org-cite-basic--set-keymap beg end nil))
           ;; Activate a wrong key.  Face is `error', `help-echo'
-          ;; displays possible suggestions, and <mouse-1> provides
-          ;; completion to fix the key.
+          ;; displays possible suggestions.
           (add-face-text-property beg end 'error)
           (let ((close-keys (org-cite-basic--close-keys key keys)))
             (when close-keys
               (put-text-property beg end 'help-echo
                                  (concat "Suggestions (mouse-1 to substitute): "
-                                         (mapconcat #'identity close-keys " ")))
-              (put-text-property beg end 'keymap
-                                 (org-cite-basic--make-repair-keymap
-                                  beg end close-keys)))))))))
+                                         (mapconcat #'identity close-keys " "))))
+            ;; When the are close know keys, <mouse-1> provides
+            ;; completion to fix the current one.  Otherwise, call
+            ;; `org-cite-insert'.
+            (org-cite-basic--set-keymap beg end (or close-keys 'all))))))))
 
 
 ;;; "Export" capability