From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: pillule Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 08 Jun 2021 11:00:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 48917 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: To: 48917@debbugs.gnu.org X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.16231499604137 (code B ref -1); Tue, 08 Jun 2021 11:00:01 +0000 Received: (at submit) by debbugs.gnu.org; 8 Jun 2021 10:59:20 +0000 Received: from localhost ([127.0.0.1]:57539 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqZS0-00014b-62 for submit@debbugs.gnu.org; Tue, 08 Jun 2021 06:59:19 -0400 Received: from lists.gnu.org ([209.51.188.17]:34854) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqZRu-00014R-S2 for submit@debbugs.gnu.org; Tue, 08 Jun 2021 06:59:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37978) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lqZRu-000672-Hj for bug-gnu-emacs@gnu.org; Tue, 08 Jun 2021 06:59:10 -0400 Received: from mx1.riseup.net ([198.252.153.129]:55048) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lqZRr-0001Df-BQ for bug-gnu-emacs@gnu.org; Tue, 08 Jun 2021 06:59:10 -0400 Received: from fews2.riseup.net (fews2-pn.riseup.net [10.0.1.84]) (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 4FznL13RJmzDq9s for ; Tue, 8 Jun 2021 03:59:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1623149945; bh=SzrxieIzo57peHAbXDxrFNcFDsp43Y2pbs9StlnWs+E=; h=From:To:Subject:Date:From; b=fJXzTXdXYGxda39U6qOe0XEHwQ0hfMBU5zWNWOH5Ao9apGU0YQu9YcvMN5mQywx31 gYm0k9pAzNJmRQIj/988y1QToPeWvp7SIpimMEDvdPTCb3YBfVBabkGi5wAT8mKN+X Rl2kPQaHbVBXcosJKDFofa7PUVmr8/NxDVKEgzMk= X-Riseup-User-ID: FD3035E8097E660ECB63B9919328A46E778F7D3AF2515FF04A37079B86D770A0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by fews2.riseup.net (Postfix) with ESMTPSA id 4FznKz59xcz1y6h for ; Tue, 8 Jun 2021 03:59:03 -0700 (PDT) From: pillule Date: Tue, 08 Jun 2021 12:31:58 +0200 Message-ID: <875yyozkpj.fsf@riseup.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=198.252.153.129; envelope-from=pillule@riseup.net; helo=mx1.riseup.net X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.4 (-) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) --=-=-= Content-Type: text/plain; format=flowed 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. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-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 cf9007ce6fdba60a1c27b0952833139731c9fe8c 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 --- 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 --=-=-= Content-Type: text/plain; format=flowed 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. --=-=-= Content-Type: application/gzip Content-Disposition: attachment; filename=dired-side-window.tar.gz Content-Transfer-Encoding: base64 Content-Description: moirai early stage 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 /p8YvP9TpNZWRxacCPmnOv/h2L8Nk0Wv/3rnPwUuwP+OlL8pkVc12ikEPAz/zwXvf3UK+StKUeM/ UpkQnfc/yPv/gfw7g/x5KcEjXqIVRVIZBgkUHxcYnAOzcUHESbIgM4LCMQeTP9fa+X+KzpU/w9J0 EP8VpdV3GVh+wfgp1NrZFEdRLH3J2K0VF4z/XezVcVV/iL328oVbB7114Stw8ZJZU854+rlHU1/t qHgDLThq3/V7tqa7hkI7esIghPox2z8tFxH/eU7gBdHZ/xfZYP+/k8hfFKCkxGVGleIcI/N8PAEl VhFkGgk0p3AqyRYlpT3wPyt/hmUFLsD/DsH/aBPkH+/4Aoz/y5aITw7bt3PGG+++esUe8dXuV39/ D7+vT6jPzl7DAgj9Mdt/u/wdkEPP/wWW5QL87wTyZ+ii+n+RohjKqf8wQf7fSeTftvMQR+L//fNf WfmTgxyB/y+S/79r+StLV1A9Xrjiq0kv05dceNTRRz0w5Q+rHv7V3hN6sxet7r3inZFjtz8jr5v+ GZwwbMBJX+39nr70qn4nDV9RNysKttzz1CLj2Cn7MlPXr9I+eeqTVWve/OziOaunnPXSyMsHnnrz iR9/XbrqodX7mdsyMyb/LHXWS6se/cn08tVfzone+OSnS57pkX5oSffP++4aS5Vuuqbf8C0flHzx 9QvK6rtiB8Jn7xj6Wb/fT4guRdP6r1ijfzB35q4nL/7ltC3fb17/3r1XPrv4N68fc9+mAeO6mFf8 a93Cq7bdubl+qrX4+SEDZj777Eb26KpeB4afcVr/NWDRyvdCQ7v23PkfH/AXL6tM//yWVx8+7/7+ Pbjd3ww5/Z1ZidP/2p3aqcz7aNvv6Sf79tg7n7qgZOiC4+74+Iz5z75/Xf1u+s3Uoq5/qsn0vtn+ yzMTytclQ09cSc97vO+95+9YVzvi26VzJ+7cner//inMmft7lE+7efaws95e+JdPqDHxbtec2G9C Ztmmiic/f+KtPvO+3V468IGfHNczMvCtO5e/cvurz5QkXr31xN3HMGVj1jbAKTvXzO2399OuDyDz ouUf8p+f8NFvX5z/wvT/XLHy0hFn7eq54btRCz684dvlJ6VuqoePbf6y2wGl7rcbar6p6bVm8STl 5xv3oH3d5nz5fOnV5854+b4+1BVLd1y6uLuxfm30QJfpXUv+fIT2TxWz/scLNM25+C9SQf2/M+A/ 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 --=-=-=-- From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 08 Jun 2021 11:51: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: To: pillule Cc: 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162315302317423 (code B ref 48917); Tue, 08 Jun 2021 11:51:02 +0000 Received: (at 48917) by debbugs.gnu.org; 8 Jun 2021 11:50:23 +0000 Received: from localhost ([127.0.0.1]:57580 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqaFT-0004Ww-3i for submit@debbugs.gnu.org; Tue, 08 Jun 2021 07:50:23 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56734) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqaFR-0004Wk-9X for 48917@debbugs.gnu.org; Tue, 08 Jun 2021 07:50:21 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:59018) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lqaFM-00077X-17; Tue, 08 Jun 2021 07:50:16 -0400 Received: from 84.94.185.95.cable.012.net.il ([84.94.185.95]:4452 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lqaFL-00057W-Kd; Tue, 08 Jun 2021 07:50:15 -0400 Date: Tue, 08 Jun 2021 14:49:59 +0300 Message-Id: <83a6o0fue0.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <875yyozkpj.fsf@riseup.net> (message from pillule on Tue, 08 Jun 2021 12:31:58 +0200) References: <875yyozkpj.fsf@riseup.net> X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: pillule > Date: Tue, 08 Jun 2021 12:31:58 +0200 > > (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. The first line of a doc string should be a single complete sentence. (The reason for this is that some Emacs commands, like "M-x apropos", show only the first line of the doc string.) > 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") The :version tag should be updated, because the defcustom was changed. From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: pillule Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 08 Jun 2021 14:16: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: To: Eli Zaretskii Cc: pillule , 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.16231617551173 (code B ref 48917); Tue, 08 Jun 2021 14:16:02 +0000 Received: (at 48917) by debbugs.gnu.org; 8 Jun 2021 14:15:55 +0000 Received: from localhost ([127.0.0.1]:59414 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqcWI-0000Ir-KY for submit@debbugs.gnu.org; Tue, 08 Jun 2021 10:15:54 -0400 Received: from mx1.riseup.net ([198.252.153.129]:51664) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqcWG-0000Ic-R6 for 48917@debbugs.gnu.org; Tue, 08 Jun 2021 10:15:53 -0400 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 4Fzshz3Y2FzDv6W; Tue, 8 Jun 2021 07:15:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1623161747; bh=dPSbv4rqgBJup7+y3WCxNFIl+8hq+69TUt00TNaHYps=; h=References:From:To:Cc:Subject:Date:In-reply-to:From; b=PczJjNayoSNvd0qT3Y76qS228v3PXBJVxeFCz3gOMWzH2ugZE0ySxIG1o9wX/Q+79 ntRVm65SLa6dhoB6VKGtwZqfTblS6MsyUo7CZ5lNjOwMpHuVAARaizsvj+VEBX92ms BP8nBxbuAZHM7baQSdq3s3WQ3qKX4HSihQSmWQwI= X-Riseup-User-ID: 9928475AF052E345BC3DB32161351BD02E932C83B71CFFDBB837D291F36C3699 Received: from [127.0.0.1] (localhost [127.0.0.1]) by fews1.riseup.net (Postfix) with ESMTPSA id 4Fzshy108dz5vSN; Tue, 8 Jun 2021 07:15:45 -0700 (PDT) References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> From: pillule Date: Tue, 08 Jun 2021 16:12:56 +0200 In-reply-to: <83a6o0fue0.fsf@gnu.org> Message-ID: <87tum8xx0z.fsf@riseup.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=-=-= Content-Type: text/plain; format=flowed Eli Zaretskii writes: >> From: pillule >> Date: Tue, 08 Jun 2021 12:31:58 +0200 >> >> (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. > > The first line of a doc string should be a single complete > sentence. > (The reason for this is that some Emacs commands, like "M-x > apropos", > show only the first line of the doc string.) > >> 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") > > The :version tag should be updated, because the defcustom was > changed. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-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 6438107565875ff69f533c244a9601192218e7c9 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. --- lisp/windmove.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lisp/windmove.el b/lisp/windmove.el index f558903681..d410e387d4 100644 --- a/lisp/windmove.el +++ b/lisp/windmove.el @@ -142,13 +142,16 @@ 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 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. +The variable may also be a function to be called in this circumstance, +the function should accept as agument a DIRECTION, and the selected WINDOW." + :type '(choice (const :tag "Don't create new windows" nil) + (const :tag "Create new windows" t) + (function :tag "Provide a function")) + :version "28.0.50") ;; If your Emacs sometimes places an empty column between two adjacent ;; windows, you may wish to set this delta to 2. @@ -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 --=-=-= Content-Type: text/plain; format=flowed -- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Jun 09 06:33:34 2021 Received: (at control) by debbugs.gnu.org; 9 Jun 2021 10:33:35 +0000 Received: from localhost ([127.0.0.1]:60592 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqvWg-0001t7-Ob for submit@debbugs.gnu.org; Wed, 09 Jun 2021 06:33:34 -0400 Received: from quimby.gnus.org ([95.216.78.240]:36294) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lqvWf-0001sm-PF for control@debbugs.gnu.org; Wed, 09 Jun 2021 06:33:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Subject:From:To:Message-Id:Date:Sender:Reply-To:Cc: MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=zNkE7OdaHWlGupUE5lkVWYYBfHZ6fnIV93Syz+Bz8qU=; b=E3gLVfEZYAKhrF2+0KiucK2XjL 3yA5jHcOuGc1oBR3uSLn4RnSouYkcaR4gk6XBuo44w7xqgsDzLBErAJ7zjUrgOxog8os+Mnja8Lv6 6ZCc3HBaZQQY4GvAWwpGGY9DIQRyNGTx3ihPW9k40iTEpVolKSPR81XoAOV96ftUcNus=; Received: from cm-84.212.220.105.getinternet.no ([84.212.220.105] helo=xo) by quimby.gnus.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lqvWY-0002uh-Bm for control@debbugs.gnu.org; Wed, 09 Jun 2021 12:33:28 +0200 Date: Wed, 09 Jun 2021 12:33:25 +0200 Message-Id: <875yynl43u.fsf@gnus.org> To: control@debbugs.gnu.org From: Lars Ingebrigtsen Subject: control message for bug #48917 X-Spam-Report: Spam detection software, running on the system "quimby.gnus.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: tags 48917 + patch quit Content analysis details: (-2.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) tags 48917 + patch quit From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 12 Jun 2021 22:13: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 To: pillule Cc: Eli Zaretskii , 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.16235359474697 (code B ref 48917); Sat, 12 Jun 2021 22:13:02 +0000 Received: (at 48917) by debbugs.gnu.org; 12 Jun 2021 22:12:27 +0000 Received: from localhost ([127.0.0.1]:42304 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lsBrf-0001Dg-6v for submit@debbugs.gnu.org; Sat, 12 Jun 2021 18:12:27 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:48171) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lsBrd-0001DT-O3 for 48917@debbugs.gnu.org; Sat, 12 Jun 2021 18:12:26 -0400 Received: (Authenticated sender: juri@linkov.net) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 7CDD4100004; Sat, 12 Jun 2021 22:12:17 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> Date: Sun, 13 Jun 2021 01:09:25 +0300 In-Reply-To: <87tum8xx0z.fsf@riseup.net> (pillule@riseup.net's message of "Tue, 08 Jun 2021 16:12:56 +0200") Message-ID: <871r96envu.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >>> :version "27.1") >> >> The :version tag should be updated, because the defcustom was changed. > > - :version "27.1") > + :version "28.0.50") 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". From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window 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 To: Juri Linkov Cc: pillule , Eli Zaretskii , 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162379522019951 (code B ref 48917); Tue, 15 Jun 2021 22:14:02 +0000 Received: (at 48917) by debbugs.gnu.org; 15 Jun 2021 22:13:40 +0000 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 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 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 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) References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.net> From: pillule Date: Wed, 16 Jun 2021 00:04:12 +0200 In-reply-to: <871r96envu.fsf@mail.linkov.net> Message-ID: <87lf7a4vzx.fsf@riseup.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=-=-= 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 -- --=-=-=-- From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window 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 To: pillule Cc: Eli Zaretskii , 48917@debbugs.gnu.org, Juri Linkov Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162379572820746 (code B ref 48917); Tue, 15 Jun 2021 22:23:02 +0000 Received: (at 48917) by debbugs.gnu.org; 15 Jun 2021 22:22:08 +0000 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 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 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 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) References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.net> <87lf7a4vzx.fsf@riseup.net> From: pillule Date: Wed, 16 Jun 2021 00:20:31 +0200 In-reply-to: <87lf7a4vzx.fsf@riseup.net> Message-ID: <87im2e4vlt.fsf@riseup.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=-=-= 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 -- --=-=-=-- From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 15 Jun 2021 23:34: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 To: pillule Cc: Eli Zaretskii , 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162380002827468 (code B ref 48917); Tue, 15 Jun 2021 23:34:02 +0000 Received: (at 48917) by debbugs.gnu.org; 15 Jun 2021 23:33:48 +0000 Received: from localhost ([127.0.0.1]:51057 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltIZ1-00078x-UU for submit@debbugs.gnu.org; Tue, 15 Jun 2021 19:33:48 -0400 Received: from relay6-d.mail.gandi.net ([217.70.183.198]:42339) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltIYz-00078F-HM; Tue, 15 Jun 2021 19:33:45 -0400 Received: (Authenticated sender: juri@linkov.net) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 68EF9C0004; Tue, 15 Jun 2021 23:33:36 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.net> <87lf7a4vzx.fsf@riseup.net> Date: Wed, 16 Jun 2021 02:32:46 +0300 In-Reply-To: <87lf7a4vzx.fsf@riseup.net> (pillule@riseup.net's message of "Wed, 16 Jun 2021 00:04:12 +0200") Message-ID: <87r1h2k8kh.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) tags 48917 fixed close 48917 28.0.50 thanks >> 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/ Good news. So now your patch is pushed. Thanks for this useful feature. > 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. It doesn't look like a suitable place to document its possible uses. So pushed without commentary. > Also I added the parent function ARG to be passed, it is an universal-argument. This is a good change. From unknown Sat Aug 16 21:19:25 2025 X-Loop: help-debbugs@gnu.org Subject: bug#48917: 28.0.50; allow user to choose what function is used when windmove create a window Resent-From: pillule Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 16 Jun 2021 01:28: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: fixed patch To: Juri Linkov Cc: pillule , Eli Zaretskii , 48917@debbugs.gnu.org Received: via spool by 48917-submit@debbugs.gnu.org id=B48917.162380682415299 (code B ref 48917); Wed, 16 Jun 2021 01:28:02 +0000 Received: (at 48917) by debbugs.gnu.org; 16 Jun 2021 01:27:04 +0000 Received: from localhost ([127.0.0.1]:51111 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltKKe-0003yg-9M for submit@debbugs.gnu.org; Tue, 15 Jun 2021 21:27:04 -0400 Received: from mx1.riseup.net ([198.252.153.129]:41656) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ltKKc-0003yB-9D for 48917@debbugs.gnu.org; Tue, 15 Jun 2021 21:27:02 -0400 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 4G4SG84xYszDqBh; Tue, 15 Jun 2021 18:26:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=riseup.net; s=squak; t=1623806816; bh=tJyvBg9yxJt0zqOw8WgwdvkwFOcnrqY0iZQRtg++6Yk=; h=References:From:To:Cc:Subject:Date:In-reply-to:From; b=ECE8InFOf4Zhs9fTeuDnAVC7jnW1e2Bhj+NfMAo+Riva9sMLWU5P4iAmMbkCkNd1y jqtYiUbJner8smIsGoU1b6zwu9fg7saK6f1b2taXlTLnMkn+g3uVS4tQoTFUez3jS1 F8iRRObfcRYVTfSlMhxcihKV9xUnerBaZCtDPtnQ= X-Riseup-User-ID: 2456FAED36C0FC432184AA7869770A04B3C1C9FC44E17C48E5BD8953E3DD64BC Received: from [127.0.0.1] (localhost [127.0.0.1]) by fews1.riseup.net (Postfix) with ESMTPSA id 4G4SG66z4pz5vjg; Tue, 15 Jun 2021 18:26:54 -0700 (PDT) References: <875yyozkpj.fsf@riseup.net> <83a6o0fue0.fsf@gnu.org> <87tum8xx0z.fsf@riseup.net> <871r96envu.fsf@mail.linkov.net> <87lf7a4vzx.fsf@riseup.net> <87r1h2k8kh.fsf@mail.linkov.net> From: pillule Date: Wed, 16 Jun 2021 03:26:08 +0200 In-reply-to: <87r1h2k8kh.fsf@mail.linkov.net> Message-ID: <87fsxi4n1l.fsf@riseup.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: > tags 48917 fixed > close 48917 28.0.50 > thanks > >>> 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/ > > Good news. So now your patch is pushed. Thanks for this useful feature. > >> 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. > > It doesn't look like a suitable place to document its possible uses. > So pushed without commentary. > >> Also I added the parent function ARG to be passed, it is an universal-argument. > > This is a good change. thanks ! --