[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [External] : Re: Make window-list return windows for all frames
From: |
Arthur Miller |
Subject: |
Re: [External] : Re: Make window-list return windows for all frames |
Date: |
Thu, 15 Jun 2023 19:18:39 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
Drew Adams <drew.adams@oracle.com> writes:
>> (defun window-list-by-mode (mode &optional all-frames)
>> (let ((window-list))
>> (walk-windows
>> (lambda (w)
>> (with-current-buffer (window-buffer w)
>> (when (eq major-mode mode)
>> (push (cons (prin1-to-string w) w) window-list))))
>> nil all-frames)
>> window-list))
>
> It's also possible to filter the buffers first.
>
> (defun windows-with-mode (mode &optional minibuf all-frames)
> (let ((wins ()))
> (dolist (buf (seq-filter
> (lambda (buf)
> (with-current-buffer buf
> (eq major-mode mode)))
> (buffer-list)))
> (setq wins (nconc (get-buffer-window-list
> buf minibuf all-frames)
> wins)))
> wins))
>
> (windows-with-mode 'Info-mode nil 'visible)
>
> But it's no doubt faster to filter the `window-list',
> just as you've done, because there are typically many
> buffers that are not displayed.
Indeed, but as you say probably slower and seems even less elegant than the
niether-so-elegant let-wrap over walk-windows.
Personally I would prefer more functional interface to it, something like map,
but that takes a predicate to filter stuff out; lighter then cl-remove-if and
cl-remove-if-not (no :key and that stuff, no need to pull in cl-seq) and
more elisp like-ish. Something like:
(cull predicate list)
For example (cull #'oddp '(1 2 3 4 5)) => (2 4)
We can do it in Lisp:
(defun cull (predicate list)
"Remove elements from LIST that satisfy PREDICATE."
(remq 'nil (mapcar (lambda (elt)
(if (funcall predicate elt) nil elt)) list)))
(cull (lambda (w)
(with-selected-window w
(not (eq major-mode 'Info-mode))))
(window-list-1 nil nil t))
=> (#<window 95 on *info*> #<window 102 on *info*<1>>)
I would prefer it though implemented in C so we don't have to do the iteration
through the list twice, but considering the last experience, I guess I should
not suggest a patch :).
- Re: Make window-list return windows for all frames, (continued)
- Re: Make window-list return windows for all frames, Arthur Miller, 2023/06/16
- Re: Make window-list return windows for all frames, Eli Zaretskii, 2023/06/16
- Re: Make window-list return windows for all frames, martin rudalics, 2023/06/16
- Re: Make window-list return windows for all frames, Eli Zaretskii, 2023/06/17
- Re: Make window-list return windows for all frames, martin rudalics, 2023/06/17
- Re: Make window-list return windows for all frames, Eli Zaretskii, 2023/06/17
- Re: Make window-list return windows for all frames, Arthur Miller, 2023/06/18
- Re: Make window-list return windows for all frames, Arthur Miller, 2023/06/19
- Re: Make window-list return windows for all frames, martin rudalics, 2023/06/20
- RE: [External] : Re: Make window-list return windows for all frames, Drew Adams, 2023/06/15
- Re: [External] : Re: Make window-list return windows for all frames,
Arthur Miller <=
Re: Make window-list return windows for all frames, Gregory Heytings, 2023/06/15
Re: Make window-list return windows for all frames, Po Lu, 2023/06/15