From: pillule <pillule@riseup.net>
To: pillule <pillule@riseup.net>
Cc: 48917@debbugs.gnu.org, Juri Linkov <juri@linkov.net>
Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window
Date: Wed, 16 Jun 2021 00:20:31 +0200 [thread overview]
Message-ID: <87im2e4vlt.fsf@riseup.net> (raw)
In-Reply-To: <87lf7a4vzx.fsf@riseup.net>
[-- Attachment #1: Type: text/plain, Size: 917 bytes --]
pillule <pillule@riseup.net> writes:
> Juri Linkov <juri@linkov.net> writes:
>
>>>>> :version "27.1")
>>>>
>>>> The :version tag should be updated, because the defcustom was changed.
>>>
>>> - :version "27.1")
>>> + :version "28.0.50")
>
> Done.
>
>> Thanks for sending two patches in bug#48916 and bug#48917.
>> If you have not signed papers yet, I guess
>> these patches are small enough to push.
>>
>> But in both patches please change the :version tag to "28.1".
>
> I get the papers now \o/
>
> I was a little bit worried that this user-option is quite obscure to understand,
> so among other little docstring fixes, I documented an usage with
> 'display-buffer-alist' in the commentary section of the package.
>
> Please let me know if it is not desirable, in which case I will remove it.
>
> Also I added the parent function ARG to be passed, it is an universal-argument.
hm I'm still making typos :/
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: user-option windmove-create-window with function --]
[-- Type: text/x-diff, Size: 6142 bytes --]
From 8dce7c9c4aa0457f5f921cb6f7af8ca681da5467 Mon Sep 17 00:00:00 2001
From: Trust me I am a doctor <pillule@riseup.net>
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, update the
docstring.
Commentary: document the usage of this user option with a basic
'display-buffer-alist', a dispatcher function for
'windmove-create-window' and an alist to hold the dispatch.
---
lisp/windmove.el | 90 ++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 84 insertions(+), 6 deletions(-)
diff --git a/lisp/windmove.el b/lisp/windmove.el
index f558903681..0ef20fb498 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -110,6 +110,72 @@
;; (setq windmove-wrap-around t)
;;
+;; Configuring windmove to display side windows :
+;;
+;; Assuming you have customized your 'display-buffer-alist' to
+;; uses side-windows, see (info "(elisp) Choosing Window")
+;;
+;; Or refer to this basic example :
+;;
+;; (customize-set-variable 'display-buffer-alist
+;; '(("\\*Ibuffer\\*"
+;; (display-buffer-in-side-window)
+;; (side . left) (window-width . 42))
+;; ("\\*Info.*"
+;; (display-buffer-in-side-window)
+;; (side . right) (window-width . 80))
+;; ("\\*e?shell.*"
+;; (display-buffer-in-side-window)
+;; (side . top))
+;; ("\\*Messages.*"
+;; (display-buffer-in-side-window)
+;; (side . bottom))))
+;;
+;; You can create a function that will dispatch the calls by direction :
+;;
+;; (defun windmove-create-side-window (dir arg window)
+;; "Intermedary function choosing what to call on direction DIR.
+;; If the selected-window is a side-window, delete it, otherwise,
+;; select the relevant function from `windmove-dispatch-sides-functions'.
+;; Only pass ARG and WINDOW to the childs functions."
+;; ;; normalise the direction
+;; (let ((dir (pcase dir (`up 'top) (`down 'bottom) (_ dir))))
+;; (funcall (if (eq dir (window-parameter window 'window-side))
+;; (lambda (_dir _arg window)
+;; (prog1 (get-mru-window) (delete-window window)))
+;; (alist-get dir windmove-dispatch-sides-functions))
+;; dir arg window)))
+;;
+;; Then assign it to 'windmove-create-window'
+;;
+;; (customize-set-variable 'windmove-create-window
+;; #'windmove-create-side-window)
+;;
+;; You can then specify an alist to actually hold the functions
+;; to be called with their directions :
+;;
+;; (defvar windmove-dispatch-sides-functions
+;; '((left . (lambda (_dir _arg _window)
+;; (ibuffer 'other-window)
+;; (get-buffer-window "*Ibuffer*")))
+;; (right . (lambda (_dir _arg _window)
+;; (let ((buffer (get-buffer "*info*")))
+;; (if buffer
+;; (display-buffer buffer)
+;; (info))
+;; (get-buffer-window "*info*"))))
+;; (top . (lambda (_dir _arg _window)
+;; (shell)
+;; (get-buffer-window "*shell*")))
+;; (bottom . (lambda (_arg _dir _window)
+;; (view-echo-area-messages)
+;; 'no-select)))
+;; "Alist to dispatch by direction the calls of `windmove-create-side-window'")
+;;
+;; And also activate this recommended setting :
+;;
+;; (customize-set-variable 'windmove-allow-all-windows t)
+
;; Acknowledgments:
;;
;; Special thanks to Julian Assange (proff@iq.org), whose
@@ -145,10 +211,18 @@ windmove-create-window
"Whether movement off the edge of the frame creates a new window.
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
- :group 'windmove
- :version "27.1")
+directions.
+This variable may also be a function to be called in this circumstance
+by `windmove-do-window-select'. The function should accept then as
+argument the DIRECTION targeted, an interactive ARG and a WINDOW
+corresponding to the currently selected window. It should also return
+or a valid window that `windmove-do-window-select' will select,
+or the symbol 'no-select to ignore that final selection.
+The commentary section of windmove.el show an example of this utilisation."
+ :type '(choice (const :tag "Don't create new windows" nil)
+ (const :tag "Create new windows" t)
+ (function :tag "Provide a function"))
+ :version "28.1")
;; If your Emacs sometimes places an empty column between two adjacent
;; windows, you may wish to set this delta to 2.
@@ -350,19 +424,23 @@ windmove-do-window-select
"Move to the window at direction DIR as seen from WINDOW.
DIR, ARG, and WINDOW are handled as by `windmove-find-other-window'.
If no window is at direction DIR, an error is signaled.
-If `windmove-create-window' is non-nil, try to create a new window
+If `windmove-create-window' is a function, call that function with
+DIR, ARG and WINDOW, if it is non-nil, try to create a new window
in direction DIR instead."
(let ((other-window (windmove-find-other-window dir arg window)))
(when (and windmove-create-window
(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 arg 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)
(not (minibuffer-window-active-p other-window)))
(user-error "Minibuffer is inactive"))
+ ((eq other-window 'no-select))
(t
(select-window other-window)))))
--
2.20.1
[-- Attachment #3: Type: text/plain, Size: 6 bytes --]
--
next prev parent reply other threads:[~2021-06-15 22:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-08 10:31 bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window pillule
2021-06-08 11:49 ` Eli Zaretskii
2021-06-08 14:12 ` pillule
2021-06-12 22:09 ` Juri Linkov
2021-06-15 22:04 ` pillule
2021-06-15 22:20 ` pillule [this message]
2021-06-15 23:32 ` Juri Linkov
2021-06-16 1:26 ` pillule
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87im2e4vlt.fsf@riseup.net \
--to=pillule@riseup.net \
--cc=48917@debbugs.gnu.org \
--cc=juri@linkov.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).