Subject: 28.0.50; allow user to choose what function is used when windmove create a window

From: pillule <[email-masked]>
Date: Tue, 08 Jun 2021 12:31:58 +0200

Hi,

This is not directly related to bug#48916 but nonetheless derive 
from a same logic of window management.

Actually the user can choose if windmove will create a window when 
it encounter the edges of the frame. I propose to let the user 
eventually provides instead a function that will be triggered in 
that case.

The function will receive as arguments the `dir' and `window' 
bindings of `windmove-do-window-select' so it can adapt its 
behavior accordingly.

The simplest use case I found for this feature is to creates a 
dispatch function that choose from the direction to display eg, a 
dired side window on the left, a shell side window on the top, a 
message side window on the bottom, another thing on the right ; 
and that act as a toggle, eg :

windmove-left : creates a dired side window
windmove-left again : delete the dired side window

>From here the function can be tuned again to behave differently in 
different contexts with eg, a local binding or by inspecting the 
WINDOW argument.

>From cf9007ce6fdba60a1c27b0952833139731c9fe8c Mon Sep 17 00:00:00 2001
From: Trust me I am a doctor <[email-masked]>
Date: Tue, 8 Jun 2021 11:44:54 +0200
Subject: [PATCH] User option to choose a function triggered by windmove-create

* lisp/windmove.el
  (windmove-create-window): add a defcustom choice
  (windmove-do-window-select): trigger custom functions
---
 lisp/windmove.el | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index f558903681..d648613e10 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -142,11 +142,14 @@ windmove-wrap-around
   :group 'windmove)
 
 (defcustom windmove-create-window nil
-  "Whether movement off the edge of the frame creates a new window.
+  "Whether movement off the edge of the frame creates a new window or
+trigger a custom function.
 If this variable is set to t, moving left from the leftmost window in
 a frame will create a new window on the left, and similarly for the other
 directions."
-  :type 'boolean
+  :type '(choice (const :tag "Don't create new windows" nil)
+          (const :tag "Create new windows" t)
+          (function :tag "Provide a function"))
   :group 'windmove
   :version "27.1")
 
@@ -357,7 +360,9 @@ windmove-do-window-select
                (or (null other-window)
                    (and (window-minibuffer-p other-window)
                         (not (minibuffer-window-active-p other-window)))))
-      (setq other-window (split-window window nil dir)))
+      (setq other-window (if (functionp windmove-create-window)
+                             (funcall windmove-create-window dir window)
+                           (split-window window nil dir))))
     (cond ((null other-window)
            (user-error "No window %s from selected window" dir))
           ((and (window-minibuffer-p other-window)
-- 
2.20.1

The second attachment is a library I am currently working on that 
implement a functional dired side window and its windmove bindings 
in 200 loc, so you can eventually try it and feel what I am 
requesting.
I wrote it for testing purposes for bug#48493 so some of its 
functionalities relies on fixes that are not yet available, and it 
is less about dired in a side window than implementing local 
bindings on couples of buffer/windows.