[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#35385: 27.0.50; Make dired-dwim-target aware of other frames
From: |
Juri Linkov |
Subject: |
bug#35385: 27.0.50; Make dired-dwim-target aware of other frames |
Date: |
Thu, 19 Sep 2019 00:48:30 +0300 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (x86_64-pc-linux-gnu) |
> I'd like to elaborate on my comments: the thought was that instead of
> extending the scope of the search for the first random Dired window
> from the selected frame to all frames, would it be better to improve the
> heuristic of finding the window that the user really meant to use
> (remember that the user option name contains the word "DWIM").
>
> The proposed heuristic was to use `get-mru-window' to get
> the most recently used window from all frames, and even
> better way is to traverse all windows ordered by their visiting
> recency on all frames to find the window with Dired mode buffer.
I can't find an existing function that would sort windows by recency,
but fortunately the implementation is straightforward:
(sort (window-list-1)
(lambda (a b)
(> (window-use-time a)
(window-use-time b))))
using `>' gives the mru order, `<' - lru order.
BTW, while looking at windows walking functions, I noticed
an opportunity for simplification.
Martin, could you please confirm if I'm not mistaken with this patch:
diff --git a/lisp/window.el b/lisp/window.el
index cf733153b8..aedebd9d46 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -2217,6 +2217,10 @@ walk-windows
- A frame means consider all windows on that frame only.
+If ALL-FRAMES specifies a frame, the first window walked is the
+first window on that frame (the one returned by `frame-first-window'),
+not necessarily the selected window.
+
Anything else means consider all windows on the selected frame
and no others.
@@ -2226,14 +2230,11 @@ walk-windows
;; back to it.
(when (window-minibuffer-p)
(setq minibuf t))
- ;; Make sure to not mess up the order of recently selected
- ;; windows. Use `save-selected-window' and `select-window'
- ;; with second argument non-nil for this purpose.
- (save-selected-window
- (when (framep all-frames)
- (select-window (frame-first-window all-frames) 'norecord))
- (dolist (walk-windows-window (window-list-1 nil minibuf all-frames))
- (funcall fun walk-windows-window))))
+ (dolist (walk-windows-window
+ (window-list-1 (and (framep all-frames)
+ (frame-first-window all-frames))
+ minibuf all-frames))
+ (funcall fun walk-windows-window)))
(defun window-at-side-p (&optional window side)
"Return t if WINDOW is at SIDE of its containing frame.