Sébastien Gendre <s...@k-7.ch> writes: > Can someone regroup the patch I need to apply ? > > I'm a bit lost between them.
I am attaching two files here: 1. display-indirect-buffer.diff 2. 0001-org-agenda-goto-Reuse-visible-indirect-buffer-window.patch You should 1. Download Emacs git repo 2. Apply display-indirect-buffer.diff on top 3. Re-compile Emacs from the repo 4. Download Org git repo 5. Apply 0001-org-agenda-goto-Reuse-visible-indirect-buffer-window.patch on top 6. Run Emacs from git repo and load Org from the Org git repo to test things with your setup. Hope the steps are not too confusing.
diff --git a/lisp/window.el b/lisp/window.el index e9d57652ec6..5178e302238 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -2615,7 +2615,36 @@ get-largest-window (setq best-window window)))) best-window)) -(defun get-buffer-window-list (&optional buffer-or-name minibuf all-frames) +(defun window-indirect-buffer-p (&optional window buffer-or-name) + "Return non-nil if specified WINDOW is indirectly related to BUFFER-OR-NAME. +WINDOW must be a live window and defaults to the selected window. +BUFFER-OR-NAME may be a buffer or the name of an existing buffer and +defaults to the current buffer. + +WINODW is indirectly related to BUFFER-OR-NAME if one of the following +conditions hold: + +- BUFFER-OR-NAME specifies an indirect buffer and WINDOW's buffer is its + base buffer. + +- WINDOW's buffer is an indirect buffer whose base buffer is the buffer + specified by BUFFER-OR-NAME. + +- Both, WINDOW's buffer and the buffer specified by BUFFER-OR-NAME, are + indirect buffer's sharing the same base buffer. + +Return nil if none of the above holds." + (let* ((window (window-normalize-window window t)) + (window-buffer (window-buffer window)) + (window-base-buffer (buffer-base-buffer window-buffer)) + (buffer (window-normalize-buffer buffer-or-name)) + (buffer-base-buffer (buffer-base-buffer buffer))) + (or (eq buffer-base-buffer window-buffer) + (eq window-base-buffer buffer) + (and buffer-base-buffer + (eq buffer-base-buffer window-base-buffer))))) + +(defun get-buffer-window-list (&optional buffer-or-name minibuf all-frames indirect) "Return list of all windows displaying BUFFER-OR-NAME, or nil if none. BUFFER-OR-NAME may be a buffer or the name of an existing buffer and defaults to the current buffer. If the selected window displays @@ -2644,12 +2673,23 @@ get-buffer-window-list - A frame means consider all windows on that frame only. Anything else means consider all windows on the selected frame -and no others." +and no others. + +INDIRECT non-nil means to append to the list of windows showing +BUFFER-OR-NAME a list of all windows that are indirectly related to +BUFFER-OR-NAME, that is, windows for which `window-indirect-buffer-p' +with the window and the buffer specified by BUFFER-OR-NAME as arguments +returns non-nil." (let ((buffer (window-normalize-buffer buffer-or-name)) + (window-list (window-list-1 (selected-window) minibuf all-frames)) windows) - (dolist (window (window-list-1 (selected-window) minibuf all-frames)) + (dolist (window window-list) (when (eq (window-buffer window) buffer) (setq windows (cons window windows)))) + (when indirect + (dolist (window window-list) + (when (window-indirect-buffer-p window buffer) + (setq windows (cons window windows))))) (nreverse windows))) (defun minibuffer-window-active-p (window) @@ -8235,35 +8275,57 @@ display-buffer-reuse-window event that a window on another frame is chosen, avoid raising that frame. +If ALIST has a non-nil `reuse-indirect' entry and no window showing +BUFFER has been found, try to find a window that is indirectly related +to BUFFER and return that window. This would be a window for which +`window-indirect-buffer-p' with the window and BUFFER as arguments +returns non-nil. If a suitable window has been found and the cdr of the +entry equals the symbol `buffer', do not replace the buffer of the +chosen window with BUFFER but return the window with its old buffer in +place. Otherwise, put BUFFER into the chosen window and return the +window. + This is an action function for buffer display, see Info node `(elisp) Buffer Display Action Functions'. It should be called only by `display-buffer' or a function directly or indirectly called by the latter." - (let* ((alist-entry (assq 'reusable-frames alist)) - (frames (cond (alist-entry (cdr alist-entry)) + (let* ((reusable-frames (assq 'reusable-frames alist)) + (reuse-indirect (assq 'reuse-indirect alist)) + (frames (cond (reusable-frames (cdr reusable-frames)) ((window--pop-up-frames alist) 0) (display-buffer-reuse-frames 0) (t (last-nonminibuffer-frame)))) - (window (if (and (eq buffer (window-buffer)) - (not (cdr (assq 'inhibit-same-window alist)))) - (selected-window) - ;; Preferably use a window on the selected frame, - ;; if such a window exists (Bug#36680). - (let* ((windows (delq (selected-window) - (get-buffer-window-list - buffer 'nomini frames))) - (first (car windows)) - (this-frame (selected-frame))) - (cond - ((eq (window-frame first) this-frame) - first) - ((catch 'found - (dolist (next (cdr windows)) - (when (eq (window-frame next) this-frame) - (throw 'found next))))) - (t first)))))) + (inhibit-same (cdr (assq 'inhibit-same-window alist))) + (window + ;; Avoid calling 'get-buffer-window-list' if the selected + ;; window already shows BUFFER and can be used. + (if (and (eq buffer (window-buffer)) (not inhibit-same)) + (selected-window) + ;; Preferably use a window on the selected frame, + ;; if such a window exists (Bug#36680). + (let* ((windows-raw + (get-buffer-window-list + buffer 'nomini frames reuse-indirect)) + (windows (if inhibit-same + (delq (selected-window) windows-raw) + windows-raw)) + (first (car windows)) + (this-frame (selected-frame))) + (cond + ((eq (window-frame first) this-frame) + first) + ((catch 'found + (dolist (next (cdr windows)) + (when (eq (window-frame next) this-frame) + (throw 'found next))))) + (t first)))))) (when (window-live-p window) + (when (and (eq (cdr reuse-indirect) 'buffer) + (not (eq (window-buffer window) buffer))) + ;; Pretend we were asking for a window showing the buffer of + ;; that window. + (setq buffer (window-buffer window))) (prog1 (window--display-buffer buffer window 'reuse alist) (unless (cdr (assq 'inhibit-switch-frame alist)) (window--maybe-raise-frame (window-frame window)))))))
>From df57e6e25f843c94102ceba7c992d6bf775acb8d Mon Sep 17 00:00:00 2001 Message-ID: <df57e6e25f843c94102ceba7c992d6bf775acb8d.1739628844.git.yanta...@posteo.net> From: Ihor Radchenko <yanta...@posteo.net> Date: Sat, 15 Feb 2025 15:10:51 +0100 Subject: [PATCH] org-agenda-goto: Reuse visible indirect buffer window; try keeping narrowing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/org-agenda.el (org-agenda-goto): When jumping to agenda item, the item's indirect buffer is displayed, reuse it. If the item's buffer is narrowed and the item position is within the narrowing, do not widen. Reusing indirect buffer requires Emacs support for reuse-indirect option in the buffer alist (see the link). Reported-by: Sébastien Gendre <s...@k-7.ch> Link: https://yhetil.org/emacs-devel/87msgx7yo5.fsf@localhost/ --- lisp/org-agenda.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 8143fd97a7..9872382c4d 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -9258,8 +9258,12 @@ (defun org-agenda-goto (&optional highlight) (org-agenda-error))) (buffer (marker-buffer marker)) (pos (marker-position marker))) - (switch-to-buffer-other-window buffer) - (widen) + (pop-to-buffer + buffer + `((display-buffer-reuse-window display-buffer-pop-up-window) + (reuse-indirect . buffer))) + (unless (<= (point-min) pos (point-max)) + (widen)) (push-mark) (goto-char pos) (when (derived-mode-p 'org-mode) -- 2.47.1
-- Ihor Radchenko // yantar92, Org mode maintainer, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92>