branch: externals/denote
commit b8f1a589e10f193d38c573262778e635a5c05f6f
Author: Jean-Philippe Gagné Guay <jeanphilippe...@gmail.com>
Commit: Jean-Philippe Gagné Guay <jeanphilippe...@gmail.com>

    Add denote--display-buffer-from-xref-alist
---
 denote.el | 74 +++++++++++++++++++++++++++++----------------------------------
 1 file changed, 34 insertions(+), 40 deletions(-)

diff --git a/denote.el b/denote.el
index 2196b49d2a..0d2825b233 100644
--- a/denote.el
+++ b/denote.el
@@ -5538,50 +5538,21 @@ Intended to be used as 
`denote-query-format-heading-function'."
       title
     denote-query-untitled-string))
 
-;; NOTE 2025-03-24: The `&rest' is there because we used to have an
-;; extra SHOW-CONTEXT parameter.  This way we do not break anybody's
-;; code, even if we slightly modify the behaviour.
-(defun denote-make-links-buffer (query &optional files buffer-name 
display-buffer-action &rest _)
-  "Create links' buffer called BUFFER-NAME for QUERY.
-
-Optional FILES can be a list of files to search for.  It can also be a
-regexp, which limits the files accordingly per `denote-directory-files'.
+(defun denote--display-buffer-from-xref-alist (xref-alist buffer-name 
display-buffer-action)
+  "Create buffer called BUFFER-NAME for XREF-ALIST.
 
-Optional DISPLAY-BUFFER-ACTION is a `display-buffer' action and
-concomitant alist, such as `denote-backlinks-display-buffer-action'."
+DISPLAY-BUFFER-ACTION is a `display-buffer' action and concomitant
+alist, such as `denote-backlinks-display-buffer-action'."
   (let* ((inhibit-read-only t)
          (file buffer-file-name)
-         (buffer (or buffer-name
-                     (denote-format-buffer-name (format-message "query for 
`%s'" query) :special-buffer)))
-         ;; We retrieve results in absolute form and change the
-         ;; absolute path to a relative path below. We could add a
-         ;; suitable function and the results would be automatically
-         ;; in relative form, but eventually notes may not be all
-         ;; under a common directory (or project).
-         (xref-alist (denote-retrieve-xref-alist query files))
          (dirs (denote-directories)))
     (unless xref-alist
-      (error "No matches for query `%s'" query))
-    ;; Update internal variables
-    (setq denote-query--last-files nil)
-    (setq denote-query--last-query query)
+      (error "No results to display"))
+    ;; Update group of each item in xref-alist
     (dolist (x xref-alist)
-      (let* ((file-xref (car x))
-             (file
-              ;; NOTE: Unfortunately, the car of the xref construct is
-              ;; not reliable; sometimes it's absolute, sometimes it
-              ;; is not
-              (if (file-name-absolute-p file-xref)
-                  file-xref
-                (xref-location-group
-                 (xref-match-item-location (car (last x)))))))
-        ;; Add to current set of files
-        (push file denote-query--last-files)
-        ;; Format heading
-        (setf (car x) (funcall denote-query-format-heading-function file))))
-    (delete-dups denote-query--last-files)
-    ;; Insert results
-    (with-current-buffer (get-buffer-create buffer)
+      (let* ((file-xref (car x)))
+        (setf (car x) (funcall denote-query-format-heading-function 
file-xref))))
+    (with-current-buffer (get-buffer-create buffer-name)
       (erase-buffer)
       (denote-query-mode)
       ;; In the links' buffer, the values of variables set in a
@@ -5597,8 +5568,31 @@ concomitant alist, such as 
`denote-backlinks-display-buffer-action'."
       (setq-local revert-buffer-function
                   (lambda (_ignore-auto _noconfirm)
                     (when-let* ((buffer-file-name file))
-                      (denote-make-links-buffer query files buffer-name 
display-buffer-action)))))
-    (display-buffer buffer display-buffer-action)))
+                      (denote--display-buffer xref-alist buffer-name 
display-buffer-action)))))
+    (display-buffer buffer-name display-buffer-action)))
+
+;; NOTE 2025-03-24: The `&rest' is there because we used to have an
+;; extra SHOW-CONTEXT parameter.  This way we do not break anybody's
+;; code, even if we slightly modify the behaviour.
+(defun denote-make-links-buffer (query &optional files buffer-name 
display-buffer-action &rest _)
+  "Create links' buffer called BUFFER-NAME for QUERY.
+
+Optional FILES can be a list of files to search for.  It can also be a
+regexp, which limits the files accordingly per `denote-directory-files'.
+
+Optional DISPLAY-BUFFER-ACTION is a `display-buffer' action and
+concomitant alist, such as `denote-backlinks-display-buffer-action'."
+  (let* ((inhibit-read-only t)
+         (buffer (or buffer-name
+                     (denote-format-buffer-name (format-message "query for 
`%s'" query) :special-buffer)))
+         (xref-alist (denote-retrieve-xref-alist query files)))
+    (unless xref-alist
+      (error "No matches for query `%s'" query))
+    (setq denote-query--last-query query)
+    (setq denote-query--last-files
+          (delete-dups
+           (mapcar #'car xref-alist)))
+    (denote--display-buffer-from-xref-alist xref-alist buffer 
display-buffer-action)))
 
 (defvar denote-query-links-buffer-function #'denote-make-links-buffer
   "Function to make an Xref buffer showing query link results.

Reply via email to