emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master c3ad28c 1/2: De-duplicate lines in Xref buffers


From: Dmitry Gutov
Subject: master c3ad28c 1/2: De-duplicate lines in Xref buffers
Date: Sun, 20 Dec 2020 20:38:55 -0500 (EST)

branch: master
commit c3ad28c29098e3dd7c14dc2a8399d08e06d77f51
Author: Juri Linkov <juri@linkov.net>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    De-duplicate lines in Xref buffers
    
    * lisp/progmodes/xref.el (xref--insert-xrefs):
    Render matches coming from the same line together (bug#36967).
    (xref--item-at-point): Account for the above.
---
 lisp/progmodes/xref.el | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 6e99e9d..f33dfb4 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -613,9 +613,9 @@ SELECT is `quit', also quit the *xref* window."
   (xref-show-location-at-point))
 
 (defun xref--item-at-point ()
-  (save-excursion
-    (back-to-indentation)
-    (get-text-property (point) 'xref-item)))
+  (get-text-property
+   (if (eolp) (1- (point)) (point))
+   'xref-item))
 
 (defun xref-goto-xref (&optional quit)
   "Jump to the xref on the current line and select its window.
@@ -853,17 +853,30 @@ GROUP is a string for decoration purposes and XREF is an
                                (length (and line (format "%d" line)))))
            for line-format = (and max-line-width
                                   (format "%%%dd: " max-line-width))
+           with prev-line-key = nil
            do
            (xref--insert-propertized '(face xref-file-header xref-group t)
                                      group "\n")
            (cl-loop for (xref . more2) on xrefs do
                     (with-slots (summary location) xref
                       (let* ((line (xref-location-line location))
+                             (new-summary summary)
+                             (line-key (list (xref-location-group location) 
line))
                              (prefix
                               (if line
                                   (propertize (format line-format line)
                                               'face 'xref-line-number)
                                 "  ")))
+                        ;; Render multiple matches on the same line, together.
+                        (when (and line (equal prev-line-key line-key))
+                          (let ((column (xref-file-location-column location)))
+                            (delete-region
+                             (save-excursion
+                               (forward-line -1)
+                               (move-to-column (+ (length prefix) column))
+                               (point))
+                             (point))
+                            (setq new-summary (substring summary column) 
prefix "")))
                         (xref--insert-propertized
                          (list 'xref-item xref
                                'mouse-face 'highlight
@@ -871,7 +884,8 @@ GROUP is a string for decoration purposes and XREF is an
                                'help-echo
                                (concat "mouse-2: display in another window, "
                                        "RET or mouse-1: follow reference"))
-                         prefix summary)))
+                         prefix new-summary)
+                        (setq prev-line-key line-key)))
                     (insert "\n"))))
 
 (defun xref--analyze (xrefs)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]