From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: pillule Newsgroups: gmane.emacs.bugs 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 Message-ID: <87im2e4vlt.fsf@riseup.net> References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.net> <87lf7a4vzx.fsf@riseup.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="15306"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 48917@debbugs.gnu.org, Juri Linkov To: pillule Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Jun 16 00:23:10 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ltHSf-0003fk-Im for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 16 Jun 2021 00:23:09 +0200 Original-Received: from localhost ([::1]:43684 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ltHSe-0004L3-5o for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 15 Jun 2021 18:23:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:46406) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ltHSY-0004Ku-G8 for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:23:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:39453) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1ltHSY-0006Os-9H for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:23:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1ltHSY-0005Pu-6p for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:23:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: pillule Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 15 Jun 2021 22:23:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 48917 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162379572820746 (code B ref 48917); Tue, 15 Jun 2021 22:23:02 +0000 Original-Received: (at 48917) by debbugs.gnu.org; 15 Jun 2021 22:22:08 +0000 Original-Received: from localhost ([127.0.0.1]:50999 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltHRf-0005OY-RM for submit@debbugs.gnu.org; Tue, 15 Jun 2021 18:22:08 -0400 Original-Received: from mx1.riseup.net ([198.252.153.129]:45070) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltHRe-0005O4-BU for 48917@debbugs.gnu.org; Tue, 15 Jun 2021 18:22:07 -0400 Original-Received: from fews1.riseup.net (fews1-pn.riseup.net [10.0.1.83]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client CN "*.riseup.net", Issuer "Sectigo RSA Domain Validation Secure Server CA" (not verified)) by mx1.riseup.net (Postfix) with ESMTPS id 4G4N8m5nvLzDqB4; Tue, 15 Jun 2021 15:22:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1623795720; bh=j8cP7CCcwOy2y6UMAHGp10az1dN1Can0NDshIesKEcs=; h=References:From:To:Cc:Subject:Date:In-reply-to:From; b=GFWhqK2nQMvREJZ7qzF4LZkGvY6Cnb/NjbxpOz+4pwqbVo56bQwaOiIS9FjTM/igE uY7LoBYkgt2TIwvI9enYBzy3QDHw2DpajC3ZCx0SKlLXyrzvudXsF7gIIQOptVnY3G DLbhRMl8t+rwfm3vDCVNUmCsoBqEBoNc7XqWDQ6A= X-Riseup-User-ID: 630A3C5559578D3C1D1EDC8465CB2BF8CA2E5928F19F5F4C0CBB2186BC6FB57D Original-Received: from [127.0.0.1] (localhost [127.0.0.1]) by fews1.riseup.net (Postfix) with ESMTPSA id 4G4N8k13gBz5vY3; Tue, 15 Jun 2021 15:21:57 -0700 (PDT) In-reply-to: <87lf7a4vzx.fsf@riseup.net> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:208603 Archived-At: --=-=-= Content-Type: text/plain pillule writes: > Juri Linkov 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 :/ --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0004-User-option-to-choose-a-function-triggered-by-windmo.patch Content-Description: user-option windmove-create-window with function >From 8dce7c9c4aa0457f5f921cb6f7af8ca681da5467 Mon Sep 17 00:00:00 2001 From: Trust me I am a doctor 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 --=-=-= Content-Type: text/plain -- --=-=-=--