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:04:12 +0200 Message-ID: <87lf7a4vzx.fsf@riseup.net> References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.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="10053"; mail-complaints-to="usenet@ciao.gmane.io" Cc: pillule , 48917@debbugs.gnu.org To: Juri Linkov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Jun 16 00:14:11 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 1ltHJy-0002QI-91 for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 16 Jun 2021 00:14:10 +0200 Original-Received: from localhost ([::1]:39132 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ltHJx-0000Zc-BG for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 15 Jun 2021 18:14:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:44878) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ltHJq-0000ZD-Rd for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:14:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:39439) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1ltHJq-0000rN-Jw for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:14:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1ltHJq-0005CR-Gj for bug-gnu-emacs@gnu.org; Tue, 15 Jun 2021 18:14: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:14: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.162379522019951 (code B ref 48917); Tue, 15 Jun 2021 22:14:02 +0000 Original-Received: (at 48917) by debbugs.gnu.org; 15 Jun 2021 22:13:40 +0000 Original-Received: from localhost ([127.0.0.1]:50985 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltHJT-0005Bj-Mk for submit@debbugs.gnu.org; Tue, 15 Jun 2021 18:13:40 -0400 Original-Received: from mx1.riseup.net ([198.252.153.129]:53124) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltHJR-0005BV-0K for 48917@debbugs.gnu.org; Tue, 15 Jun 2021 18:13:38 -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 4G4Myz47XkzDsdc; Tue, 15 Jun 2021 15:13:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1623795211; bh=NSjoIUosDffC9pImYXH+D+yafk/CWvVfv+3NfBehhl8=; h=References:From:To:Cc:Subject:Date:In-reply-to:From; b=JledFDmqp9j95aCg2Aew8GWaCp9CAI/Oa6plBphhTRy4ia5YDFFfmVxzy8Ycb5eN2 Ms1MF46KWVmeeY5LQCZSYvyxpLtVwBCOLGDw1ER+2kFYsXJ5UaHUwWhNF7OwIlQFtU dUEiFTPCPiz/xvgubPRXpaAROvfdhcSgZH8viF74= X-Riseup-User-ID: E61050BA1D3D6F8F49727AEE50750A54CED6DCD6C27DEDA7FCB141444D05B80A Original-Received: from [127.0.0.1] (localhost [127.0.0.1]) by fews1.riseup.net (Postfix) with ESMTPSA id 4G4Myx3t3Wz5vhJ; Tue, 15 Jun 2021 15:13:29 -0700 (PDT) In-reply-to: <871r96envu.fsf@mail.linkov.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:208602 Archived-At: --=-=-= Content-Type: text/plain 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. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0003-User-option-to-choose-a-function-triggered-by-windmo.patch Content-Description: allow user to choose what function is used when windmove create a window >From f276e2b7fe96512b1ed88be8f8da66faab7a24e4 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 | 92 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 7 deletions(-) diff --git a/lisp/windmove.el b/lisp/windmove.el index f558903681..e49b6ad654 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 window 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 @@ -142,13 +208,21 @@ 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 create 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 returns +or a valid window that `windmove-do-window-select' will select, +or the symbol 'no-select to ignore that final selection. +The comments 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 -- --=-=-=--