GNU bug report logs -
#21649
25.0.50; [PATCH] Allow M-x man to reuse an existing window
Previous Next
Reported by: Nicolas Richard <youngfrog <at> members.fsf.org>
Date: Thu, 8 Oct 2015 15:56:01 UTC
Severity: wishlist
Tags: patch
Found in version 25.0.50
Done: Nicolas Richard <youngfrog <at> members.fsf.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
martin rudalics <rudalics <at> gmx.at> writes:
> (2) Allow to specify the desired (parent) mode via an ALIST ‘mode’
> entry. As value we could allow a single mode or a list of modes. Then
> a window showing a buffer in the same mode as the buffer we want to
> display should maybe given preference to a window showing a buffer in
> another mode, derived from the same parent mode. If a same-mode-window
> exists on another and a derived-mode-window exists on the selected
> frame, one of these should be given preference consistently.
Well, it took a bit of time but here I am ! Could you please review the
following patch ?
[0001-Add-new-function-display-buffer-reuse-mode-window.patch (text/x-diff, inline)]
From 1623ed372ffce726c4f5b20ca2f333a9e5ba6f92 Mon Sep 17 00:00:00 2001
From: Nicolas Richard <youngfrog <at> members.fsf.org>
Date: Tue, 1 Mar 2016 12:33:05 +0100
Subject: [PATCH] Add new function display-buffer-reuse-mode-window
* lisp/window.el (display-buffer-reuse-mode-window): New function.
* doc/lispref/windows.texi (Display Action Functions): Document it.
---
doc/lispref/windows.texi | 17 ++++++++++++
lisp/window.el | 68 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 85 insertions(+)
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 7186791..c52bf0e 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -2395,6 +2395,23 @@ Display Action Functions
entry (@pxref{Choosing Window Options}), raises that frame if necessary.
@end defun
+@defun display-buffer-reuse-mode-window buffer alist
+This function tries to display @var{buffer} by finding a window
+that is displaying a buffer in a given mode.
+
+If @var{alist} contains a @code{mode} entry, its value is a major mode
+(a symbol) or a list of major modes. If @var{alist} contains no
+@code{mode} entry, the current major mode of @var{buffer} is used. A
+window is a candidate if it displays a buffer that derives from one of
+the given modes.
+
+The behaviour is also controlled by entries for
+@code{inhibit-same-window}, @code{reusable-frames} and
+@code{inhibit-switch-frame} as is done in the function
+@code{display-buffer-reuse-window}.
+
+@end defun
+
@defun display-buffer-pop-up-frame buffer alist
This function creates a new frame, and displays the buffer in that
frame's window. It actually performs the frame creation by calling
diff --git a/lisp/window.el b/lisp/window.el
index 620f4ed..4586994 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -6721,6 +6721,74 @@ display-buffer-reuse-window
(unless (cdr (assq 'inhibit-switch-frame alist))
(window--maybe-raise-frame (window-frame window)))))))
+(defun display-buffer-reuse-mode-window (buffer alist)
+ "Return a window based on the mode of the buffer it displays.
+Display BUFFER in the returned window. Return nil if no usable
+window is found.
+
+If ALIST contains a `mode' entry, its value is a major mode (a
+symbol) or a list of modes. A window is a candidate if it
+displays a buffer that derives from one of the given modes. When
+ALIST contains no `mode' entry, the current major mode of BUFFER
+is used.
+
+The behaviour is also controlled by entries for
+`inhibit-same-window', `reusable-frames' and
+`inhibit-switch-frame' as is done in the function
+`display-buffer-reuse-window'."
+ (let* ((alist-entry (assq 'reusable-frames alist))
+ (alist-mode-entry (assq 'mode alist))
+ (frames (cond (alist-entry (cdr alist-entry))
+ ((if (eq pop-up-frames 'graphic-only)
+ (display-graphic-p)
+ pop-up-frames)
+ 0)
+ (display-buffer-reuse-frames 0)
+ (t (last-nonminibuffer-frame))))
+ (inhibit-same-window-p (cdr (assq 'inhibit-same-window alist)))
+ (windows (window-list-1 nil 'nomini frames))
+ (buffer-mode (with-current-buffer buffer major-mode))
+ (allowed-modes (if alist-mode-entry
+ (cdr alist-mode-entry)
+ buffer-mode))
+ (curwin (selected-window))
+ (curframe (selected-frame)))
+ (unless (listp allowed-modes)
+ (setq allowed-modes (list allowed-modes)))
+ (let (same-mode-same-frame
+ same-mode-other-frame
+ derived-mode-same-frame
+ derived-mode-other-frame)
+ (dolist (window windows)
+ (let ((window-mode (with-current-buffer
+ (window-buffer window)
+ major-mode))
+ mode? frame?)
+ (setq mode?
+ (cond ((memq window-mode allowed-modes)
+ 'same)
+ ((let ((major-mode window-mode))
+ (derived-mode-p allowed-modes))
+ 'derived)))
+ (when (and mode?
+ (not (and inhibit-same-window-p
+ (eq window curwin))))
+ (if (eq curframe (window-frame window))
+ (if (eq mode? 'same)
+ (push window same-mode-same-frame)
+ (push window derived-mode-same-frame))
+ (if (eq mode? 'same)
+ (push window same-mode-other-frame)
+ (push window derived-mode-other-frame))))))
+ (let ((window (first (nconc same-mode-same-frame
+ same-mode-other-frame
+ derived-mode-same-frame
+ derived-mode-other-frame))))
+ (when (window-live-p window)
+ (prog1 (window--display-buffer buffer window 'reuse alist)
+ (unless (cdr (assq 'inhibit-switch-frame alist))
+ (window--maybe-raise-frame (window-frame window)))))))))
+
(defun display-buffer--special-action (buffer)
"Return special display action for BUFFER, if any.
If `special-display-p' returns non-nil for BUFFER, return an
--
2.4.5
[Message part 3 (text/plain, inline)]
--
Nicolas.
This bug report was last modified 9 years and 75 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.