all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "João Távora" <joaotavora@gmail.com>
To: Juri Linkov <juri@linkov.net>
Cc: 33870@debbugs.gnu.org, Dmitry Gutov <dgutov@yandex.ru>
Subject: bug#33870: 27.0.50; xref-goto-xref not configurable
Date: Mon, 07 Jan 2019 14:21:55 +0000	[thread overview]
Message-ID: <jjbd0p85z0c.fsf@gmail.com> (raw)
In-Reply-To: <878t02egph.fsf@mail.linkov.net> (Juri Linkov's message of "Thu,  03 Jan 2019 02:18:50 +0200")

[-- Attachment #1: Type: text/plain, Size: 1490 bytes --]

Juri Linkov <juri@linkov.net> writes:

> Hi João
>
>> Any simplification to the implementation that keeps the
>> "keep original window intent" behavior across xref
>> intermediate buffers is very welcome.
>
> Thanks for the explanation.  Now I understand better the intent in
> xref--show-pos-in-buf. Generally, I'd like to see the “keep original
> window intent” behavior in more places, e.g. in *Occur*, *grep*, etc.
> Based on your explanation, I've been able to write the patch that does
> the following:

Hi again, Juri

After re-reading your patch more closely and giving it some more
testing, I've discovered it breaks an existing use case:

   Emacs -Q
   C-x 2 ;; split-window-horizontally
   C-x 4 . ;; xref-find-definitions-other-window
   xref-backend-definitions RET
   C-n RET ;; in the resulting *xref* buffer
   
Expected xref.el to appear in the bottom window which was my original
intent when I said "other window".  In the current master this works OK,
in your patch it doesn't.

But don't worry, I've fixed that.  In the patch that I attach to this
message, none of the current UI changes is changed, but the xref window
should now be configurable as is the original request of this bug.

I've also renamed window.el's window--display-buffer to
window-display-buffer throughout Emacs (i.e. made it public).

After we merge this, we can continue the discussion about the changing
the xref UI in the other bug you opened, bug#33992


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Make-xref-s-choice-of-windows-easier-to-configure.patch --]
[-- Type: text/x-patch, Size: 11884 bytes --]

From 424fe397c86026469a3853e86ca486d549f58100 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= <joaotavora@gmail.com>
Date: Mon, 7 Jan 2019 14:16:35 +0000
Subject: [PATCH] Make xref's choice of windows easier to configure

Fixes: bug#33870

Allow for the usual user configuration strategies involving
display-buffer-alist, etc. while maintaining the "keep original window
intent" of xref-find-definitions, xref-find-references, etc.

* lisp/windmove.el (windmove-display-in-direction): Use
window--display-buffer.

* lisp/window.el (display-buffer-in-atom-window):
(window--make-major-side-window):
(display-buffer-in-side-window):
(display-buffer-in-side-window):
(display-buffer-in-side-window):
(display-buffer-use-some-frame):
(display-buffer-same-window):
(display-buffer-reuse-window):
(display-buffer-reuse-mode-window):
(display-buffer-pop-up-frame):
(display-buffer-pop-up-window):
(display-buffer-in-child-frame):
(display-buffer-below-selected):
(display-buffer-below-selected):
(display-buffer-below-selected):
(display-buffer-below-selected):
(display-buffer-at-bottom):
(display-buffer-in-previous-window):
(display-buffer-use-some-window): Use window-display-buffer.
(window-display-buffer): Rename from window--display-buffer.

* lisp/progmodes/xref.el (xref--show-pos-in-buf): Use
window-display-buffer.
---
 lisp/progmodes/xref.el |  5 ++---
 lisp/windmove.el       |  2 +-
 lisp/window.el         | 46 +++++++++++++++++++++---------------------
 3 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 87ce2299c5..20eaa51bef 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -482,9 +482,8 @@ xref--show-pos-in-buf
                   (window-live-p xref--original-window)
                   (or (not (window-dedicated-p xref--original-window))
                       (eq (window-buffer xref--original-window) buf)))
-                 `(,(lambda (buf _alist)
-                      (set-window-buffer xref--original-window buf)
-                      xref--original-window))))))
+                 `(,(lambda (buf alist)
+                      (window-display-buffer buf xref--original-window 'reuse alist)))))))
     (with-selected-window
         (with-selected-window
             ;; Just before `display-buffer', place ourselves in the
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 65270d9bbe..54f0098de7 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -626,7 +626,7 @@ windmove-display-in-direction
                     (type 'reuse))
                 (unless window
                   (setq window (split-window nil nil dir) type 'window))
-		(setq new-window (window--display-buffer buffer window type alist)))))
+		(setq new-window (window-display-buffer buffer window type alist)))))
           display-buffer-overriding-action)
     (message "[display-%s]" dir)))
 
diff --git a/lisp/window.el b/lisp/window.el
index 37d82c060c..cf923f7dc6 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -700,7 +700,7 @@ display-buffer-in-atom-window
 	(set-window-parameter window 'window-atom 'main))
       (set-window-parameter new 'window-atom side)
       ;; Display BUFFER in NEW and return NEW.
-      (window--display-buffer
+      (window-display-buffer
        buffer new 'window alist display-buffer-mark-dedicated))))
 
 (defun window--atom-check-1 (window)
@@ -985,7 +985,7 @@ window--make-major-side-window
       (with-current-buffer buffer
         (setq window--sides-shown t))
       ;; Install BUFFER in new window and return WINDOW.
-      (window--display-buffer buffer window 'window alist 'side))))
+      (window-display-buffer buffer window 'window alist 'side))))
 
 (defun display-buffer-in-side-window (buffer alist)
   "Display BUFFER in a side window of the selected frame.
@@ -1113,7 +1113,7 @@ display-buffer-in-side-window
 		 ;; Reuse `this-window'.
                  (with-current-buffer buffer
                    (setq window--sides-shown t))
-		 (window--display-buffer
+		 (window-display-buffer
                   buffer this-window 'reuse alist dedicated))
 	    (and (or (not max-slots) (< slots max-slots))
 		 (or (and next-window
@@ -1131,7 +1131,7 @@ display-buffer-in-side-window
 		   (set-window-parameter window 'window-slot slot)
                    (with-current-buffer buffer
                      (setq window--sides-shown t))
-		   (window--display-buffer
+		   (window-display-buffer
                     buffer window 'window alist dedicated))
 	    (and best-window
 		 ;; Reuse `best-window'.
@@ -1140,7 +1140,7 @@ display-buffer-in-side-window
 		   (set-window-parameter best-window 'window-slot slot)
                    (with-current-buffer buffer
                      (setq window--sides-shown t))
-                   (window--display-buffer
+                   (window-display-buffer
 		    buffer best-window 'reuse alist dedicated)))))))))
 
 (defun window-toggle-side-windows (&optional frame)
@@ -6748,7 +6748,7 @@ window--even-window-sizes
            (/ (- (window-total-height window) (window-total-height)) 2))
         (error nil))))))
 
-(defun window--display-buffer (buffer window type &optional alist dedicated)
+(defun window-display-buffer (buffer window type &optional alist dedicated)
   "Display BUFFER in WINDOW.
 TYPE must be one of the symbols `reuse', `window' or `frame' and
 is passed unaltered to `display-buffer-record-window'.  ALIST is
@@ -7190,7 +7190,7 @@ display-buffer-use-some-frame
                 frame nil (cdr (assq 'inhibit-same-window alist))))))
     (when window
       (prog1
-          (window--display-buffer
+          (window-display-buffer
            buffer window 'reuse alist display-buffer-mark-dedicated)
         (unless (cdr (assq 'inhibit-switch-frame alist))
           (window--maybe-raise-frame frame))))))
@@ -7204,7 +7204,7 @@ display-buffer-same-window
   (unless (or (cdr (assq 'inhibit-same-window alist))
 	      (window-minibuffer-p)
 	      (window-dedicated-p))
-    (window--display-buffer buffer (selected-window) 'reuse alist)))
+    (window-display-buffer buffer (selected-window) 'reuse alist)))
 
 (defun display-buffer--maybe-same-window (buffer alist)
   "Conditionally display BUFFER in the selected window.
@@ -7252,7 +7252,7 @@ display-buffer-reuse-window
 			      (get-buffer-window-list buffer 'nomini
 						      frames))))))
     (when (window-live-p window)
-      (prog1 (window--display-buffer buffer window 'reuse alist)
+      (prog1 (window-display-buffer buffer window 'reuse alist)
 	(unless (cdr (assq 'inhibit-switch-frame alist))
 	  (window--maybe-raise-frame (window-frame window)))))))
 
@@ -7316,7 +7316,7 @@ display-buffer-reuse-mode-window
                                 derived-mode-same-frame
                                 derived-mode-other-frame))))
         (when (window-live-p window)
-          (prog1 (window--display-buffer buffer window 'reuse alist)
+          (prog1 (window-display-buffer buffer window 'reuse alist)
             (unless (cdr (assq 'inhibit-switch-frame alist))
               (window--maybe-raise-frame (window-frame window)))))))))
 
@@ -7356,7 +7356,7 @@ display-buffer-pop-up-frame
 	       (with-current-buffer buffer
 		 (setq frame (funcall fun)))
 	       (setq window (frame-selected-window frame)))
-      (prog1 (window--display-buffer
+      (prog1 (window-display-buffer
 	      buffer window 'frame alist display-buffer-mark-dedicated)
 	(unless (cdr (assq 'inhibit-switch-frame alist))
 	  (window--maybe-raise-frame frame))))))
@@ -7386,7 +7386,7 @@ display-buffer-pop-up-window
 				(window--try-to-split-window
 				 (get-lru-window frame t) alist))))
 
-      (prog1 (window--display-buffer
+      (prog1 (window-display-buffer
 	      buffer window 'window alist display-buffer-mark-dedicated)
 	(unless (cdr (assq 'inhibit-switch-frame alist))
 	  (window--maybe-raise-frame (window-frame window)))))))
@@ -7452,7 +7452,7 @@ display-buffer-in-child-frame
         (setq frame (make-frame parameters))
         (setq window (frame-selected-window frame))))
 
-    (prog1 (window--display-buffer
+    (prog1 (window-display-buffer
 	    buffer window 'frame alist display-buffer-mark-dedicated)
       (unless (cdr (assq 'inhibit-switch-frame alist))
 	(window--maybe-raise-frame frame)))))
@@ -7476,7 +7476,7 @@ display-buffer-below-selected
              (eq buffer (window-buffer window))
 	     (or (not (numberp min-height))
 		 (>= (window-height window) min-height)
-		 ;; 'window--display-buffer' can resize this window if
+		 ;; 'window-display-buffer' can resize this window if
 		 ;; and only if it has a 'quit-restore' parameter
 		 ;; certifying that it always showed BUFFER before.
 		 (let ((height (window-height window))
@@ -7484,7 +7484,7 @@ display-buffer-below-selected
 		   (and quit-restore
 			(eq (nth 1 quit-restore) 'window)
 			(window-resizable-p window (- min-height height)))))
-	     (window--display-buffer buffer window 'reuse alist))
+	     (window-display-buffer buffer window 'reuse alist))
 	(and (not (frame-parameter nil 'unsplittable))
              (or (not (numberp min-height))
 		 (window-sizable-p nil (- min-height)))
@@ -7492,7 +7492,7 @@ display-buffer-below-selected
 		   split-width-threshold)
                (setq window (window--try-to-split-window
                              (selected-window) alist)))
-             (window--display-buffer
+             (window-display-buffer
               buffer window 'window alist display-buffer-mark-dedicated))
 	(and (setq window (window-in-direction 'below))
              (not (window-dedicated-p window))
@@ -7500,7 +7500,7 @@ display-buffer-below-selected
 		 ;; A window that showed another buffer before cannot
 		 ;; be resized.
 		 (>= (window-height window) min-height))
-	     (window--display-buffer
+	     (window-display-buffer
               buffer window 'reuse alist display-buffer-mark-dedicated)))))
 
 (defun display-buffer--maybe-at-bottom (buffer alist)
@@ -7533,20 +7533,20 @@ display-buffer-at-bottom
 	 (setq bottom-window window))))
      nil nil 'nomini)
     (or (and bottom-window-shows-buffer
-	     (window--display-buffer
+	     (window-display-buffer
 	      buffer bottom-window 'reuse alist display-buffer-mark-dedicated))
 	(and (not (frame-parameter nil 'unsplittable))
 	     (let (split-width-threshold)
 	       (setq window (window--try-to-split-window bottom-window alist)))
-	     (window--display-buffer
+	     (window-display-buffer
 	      buffer window 'window alist display-buffer-mark-dedicated))
 	(and (not (frame-parameter nil 'unsplittable))
 	     (setq window (split-window-no-error (window-main-window)))
-	     (window--display-buffer
+	     (window-display-buffer
 	      buffer window 'window alist display-buffer-mark-dedicated))
 	(and (setq window bottom-window)
 	     (not (window-dedicated-p window))
-	     (window--display-buffer
+	     (window-display-buffer
 	      buffer window 'reuse alist display-buffer-mark-dedicated)))))
 
 (defun display-buffer-in-previous-window (buffer alist)
@@ -7603,7 +7603,7 @@ display-buffer-in-previous-window
 	(setq best-window window)))
     ;; Return best or second best window found.
     (when (setq window (or best-window second-best-window))
-      (window--display-buffer buffer window 'reuse alist))))
+      (window-display-buffer buffer window 'reuse alist))))
 
 (defun display-buffer-use-some-window (buffer alist)
   "Display BUFFER in an existing window.
@@ -7643,7 +7643,7 @@ display-buffer-use-some-window
 	  (error nil)))
 
       (prog1
-	  (window--display-buffer buffer window 'reuse alist)
+	  (window-display-buffer buffer window 'reuse alist)
 	(window--even-window-sizes window)
 	(unless (cdr (assq 'inhibit-switch-frame alist))
 	  (window--maybe-raise-frame (window-frame window)))))))
-- 
2.19.2


  parent reply	other threads:[~2019-01-07 14:21 UTC|newest]

Thread overview: 165+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-25 20:42 bug#33870: 27.0.50; xref-goto-xref not configurable Juri Linkov
2018-12-26  2:10 ` Dmitry Gutov
2018-12-26 14:48   ` João Távora
2018-12-26 23:18     ` Juri Linkov
2018-12-27  0:05       ` João Távora
2018-12-27 13:20         ` Dmitry Gutov
2018-12-27 18:08           ` João Távora
2018-12-27 21:21           ` Juri Linkov
2018-12-27 23:23             ` Dmitry Gutov
2018-12-27 23:47               ` Juri Linkov
2018-12-28  0:35                 ` Dmitry Gutov
2018-12-28  9:25                   ` João Távora
2018-12-27 21:19         ` Juri Linkov
2018-12-27 21:49           ` João Távora
2018-12-27  1:12     ` making xref.el a core ELPA package Dmitry Gutov
2018-12-27 17:59       ` João Távora
2018-12-27 20:12         ` Juri Linkov
2018-12-27 21:41           ` João Távora
2018-12-28 14:32             ` Stefan Monnier
2018-12-28 16:28               ` João Távora
2019-01-03  0:18     ` bug#33870: 27.0.50; xref-goto-xref not configurable Juri Linkov
2019-01-03 13:50       ` Eli Zaretskii
2019-01-03 14:24       ` João Távora
2019-01-03 21:29         ` Juri Linkov
2019-01-03 22:08           ` João Távora
2019-01-04  0:07             ` Juri Linkov
2019-01-04  0:42               ` Dmitry Gutov
2019-01-04  7:41               ` João Távora
2019-01-04  6:55           ` Eli Zaretskii
2019-01-05 23:23             ` Juri Linkov
2019-01-06  9:03               ` martin rudalics
2019-01-06 20:55                 ` Drew Adams
2019-01-06 23:52                   ` Juri Linkov
2019-01-06 23:48                 ` Juri Linkov
2019-01-07  9:03                   ` martin rudalics
2019-01-07 22:02                     ` Juri Linkov
2019-01-08  9:24                       ` martin rudalics
2019-01-09  0:15                         ` Juri Linkov
2019-01-09 10:04                           ` martin rudalics
2019-01-09 23:40                             ` Juri Linkov
2019-01-10 10:19                               ` martin rudalics
2019-01-10 21:56                                 ` Juri Linkov
2019-01-11  9:24                                   ` martin rudalics
2019-01-13  0:33                                     ` Juri Linkov
2019-01-13  8:34                                       ` martin rudalics
2019-01-13 21:32                                         ` Juri Linkov
2019-01-14  7:57                                           ` martin rudalics
2019-01-19 20:47                                             ` Juri Linkov
2019-01-20  9:14                                               ` martin rudalics
2019-01-20 20:46                                                 ` Juri Linkov
2019-01-21  7:52                                                   ` martin rudalics
2019-01-21 20:59                                             ` Juri Linkov
2019-01-24  9:07                                               ` martin rudalics
2019-01-27 20:23                                                 ` Juri Linkov
2019-01-28 18:38                                                   ` martin rudalics
2019-01-28 20:07                                                     ` Juri Linkov
2019-01-29  8:50                                                       ` martin rudalics
2019-01-29 21:10                                                         ` Juri Linkov
2019-01-29 21:46                                                           ` Drew Adams
2019-01-30 21:06                                                             ` Juri Linkov
2019-01-30 21:39                                                               ` Drew Adams
2019-01-30  8:08                                                           ` martin rudalics
2019-01-30 21:12                                                             ` Juri Linkov
2019-01-31  8:32                                                               ` martin rudalics
2019-01-31 21:07                                                                 ` Juri Linkov
2019-02-01  9:05                                                                   ` martin rudalics
2019-02-02  9:30                                                                     ` martin rudalics
2019-02-02 21:14                                                                       ` Juri Linkov
2019-02-03 20:22                                                             ` Juri Linkov
2019-02-04  7:30                                                               ` martin rudalics
2019-02-04 21:41                                                                 ` Juri Linkov
2019-02-05  8:36                                                                   ` martin rudalics
2019-02-17 21:14                                                                     ` Juri Linkov
2019-01-03 22:48         ` Dmitry Gutov
2019-01-04  0:12           ` Juri Linkov
2019-01-04  0:39             ` Dmitry Gutov
2019-01-03 22:49       ` Dmitry Gutov
2019-01-03 23:31       ` Dmitry Gutov
2019-01-04  0:14         ` Juri Linkov
2019-01-04  0:36           ` Dmitry Gutov
2019-01-04  7:49           ` João Távora
2019-01-05 23:17             ` Juri Linkov
2019-01-05 23:52               ` Dmitry Gutov
2019-01-05 23:27       ` Juri Linkov
2019-01-05 23:55         ` Dmitry Gutov
2019-01-07 14:21       ` João Távora [this message]
2019-01-07 22:16         ` Juri Linkov
2019-01-07 23:46           ` Dmitry Gutov
2019-01-08  0:23             ` Juri Linkov
2019-01-08  1:04               ` Dmitry Gutov
2019-01-08  1:04           ` João Távora
2019-01-08  9:25             ` martin rudalics
2019-01-08 11:17               ` João Távora
2019-01-08 14:47                 ` martin rudalics
2019-01-08 14:55                   ` João Távora
2019-01-08 14:44               ` Stefan Monnier
2019-01-08 15:04                 ` martin rudalics
2019-01-08 16:06                   ` Stefan Monnier
2019-01-08 17:43                     ` martin rudalics
2019-01-08 20:53                       ` Stefan Monnier
2019-01-09 10:03                         ` martin rudalics
2019-01-09 13:14                           ` Stefan Monnier
2019-01-09 13:27                             ` martin rudalics
2019-01-10 10:19                               ` martin rudalics
2019-01-09  0:20             ` Juri Linkov
2019-01-09  9:57               ` João Távora
2019-01-11  1:18               ` Dmitry Gutov
2019-01-13  0:41                 ` Juri Linkov
2019-01-13 11:52                   ` João Távora
2019-01-13 21:54                     ` Juri Linkov
2019-01-13 23:06                       ` João Távora
2019-01-18  2:32                         ` Dmitry Gutov
2019-01-18 15:26                           ` João Távora
2019-01-18 17:33                             ` martin rudalics
2019-01-18 22:22                               ` João Távora
2019-01-19 20:35                                 ` Juri Linkov
2019-01-20  9:14                                   ` martin rudalics
2019-01-19 20:31                         ` Juri Linkov
2019-01-20  0:34                           ` Dmitry Gutov
2019-01-20 20:44                             ` Juri Linkov
2019-01-21 20:43                               ` Juri Linkov
2019-01-22  0:07                                 ` Dmitry Gutov
2019-01-18  2:37                       ` Dmitry Gutov
2019-01-18 15:22                         ` João Távora
2019-01-18 15:35                           ` Dmitry Gutov
2019-01-18 15:40                             ` João Távora
2019-01-18 17:33                               ` martin rudalics
2019-01-18 17:38                               ` Dmitry Gutov
2019-01-19 20:45                         ` Juri Linkov
2019-01-20  0:27                           ` Dmitry Gutov
2019-01-20  0:31                             ` João Távora
2019-01-27 20:29                               ` Juri Linkov
2019-01-31 22:14                                 ` João Távora
2019-02-01  0:17                                   ` João Távora
2019-02-01  1:39                                     ` Dmitry Gutov
2019-02-01  7:30                                       ` Eli Zaretskii
2019-02-01  8:19                                         ` João Távora
2019-02-01 18:27                                           ` Drew Adams
2019-02-02  0:00                                           ` Dmitry Gutov
2019-02-02  0:29                                             ` Dmitry Gutov
2019-02-02  9:30                                           ` martin rudalics
2019-02-02 21:16                                           ` Juri Linkov
2019-02-02 22:22                                             ` João Távora
2019-02-03  3:37                                               ` Eli Zaretskii
2019-02-03 12:00                                                 ` João Távora
2019-02-03 17:09                                                   ` Eli Zaretskii
2019-02-03 20:22                                                     ` João Távora
2019-02-05 18:12                                                       ` Eli Zaretskii
2019-02-05 18:34                                                         ` João Távora
2019-02-06 22:53                                                           ` João Távora
2019-02-17 20:17                                                             ` Juri Linkov
2019-02-03 21:02                                                   ` Drew Adams
2019-02-03 20:33                                                 ` Juri Linkov
2019-02-03 21:08                                                   ` João Távora
2019-02-04 21:35                                                     ` Juri Linkov
2019-02-04 23:24                                                       ` João Távora
2019-02-05 13:44                                                   ` Dmitry Gutov
2019-02-17 21:20                                                     ` Juri Linkov
2019-02-22  2:17                                                       ` Dmitry Gutov
2019-06-11  0:00                                 ` Dmitry Gutov
2019-06-16  0:52                                   ` Dmitry Gutov
2018-12-26 15:36 ` Eli Zaretskii
2018-12-26 23:17   ` Juri Linkov
2018-12-27 15:27     ` Eli Zaretskii
2018-12-27 20:51       ` Dmitry Gutov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jjbd0p85z0c.fsf@gmail.com \
    --to=joaotavora@gmail.com \
    --cc=33870@debbugs.gnu.org \
    --cc=dgutov@yandex.ru \
    --cc=juri@linkov.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.