From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Arthur Miller Newsgroups: gmane.emacs.bugs Subject: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers Date: Tue, 25 May 2021 13:16:24 +0200 Message-ID: References: <87imgpw7k3.fsf@warpmail.net> <87mu36enhl.fsf@posteo.net> <8735uru1py.fsf@gnus.org> <871r9yjyv5.fsf@posteo.net> <87h7irqtvf.fsf@gnus.org> <87im37p2b4.fsf@icterid> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16568"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (windows-nt) Cc: 41438@debbugs.gnu.org, Lars Ingebrigtsen , Juri Linkov To: Philip Kaludercic Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue May 25 13:17:12 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 1llV3f-00045w-O5 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 25 May 2021 13:17:11 +0200 Original-Received: from localhost ([::1]:41870 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1llV3e-0000a4-97 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 25 May 2021 07:17:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:58192) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1llV3W-0000Zf-LN for bug-gnu-emacs@gnu.org; Tue, 25 May 2021 07:17:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:33287) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1llV3W-0006IM-E2 for bug-gnu-emacs@gnu.org; Tue, 25 May 2021 07:17:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1llV3W-00078q-9Z for bug-gnu-emacs@gnu.org; Tue, 25 May 2021 07:17:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Arthur Miller Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 25 May 2021 11:17:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41438 X-GNU-PR-Package: emacs Original-Received: via spool by 41438-submit@debbugs.gnu.org id=B41438.162194139827411 (code B ref 41438); Tue, 25 May 2021 11:17:02 +0000 Original-Received: (at 41438) by debbugs.gnu.org; 25 May 2021 11:16:38 +0000 Original-Received: from localhost ([127.0.0.1]:44832 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llV37-000783-RX for submit@debbugs.gnu.org; Tue, 25 May 2021 07:16:38 -0400 Original-Received: from mail-am7eur06olkn2024.outbound.protection.outlook.com ([40.92.16.24]:50483 helo=EUR06-AM7-obe.outbound.protection.outlook.com) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1llV32-00077l-Mx for 41438@debbugs.gnu.org; Tue, 25 May 2021 07:16:36 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Wfb+gKw8dHBixP3VOYjq5149iF17WZuWwczX3dKxbWM1Dibx+s0zpbQ+DJYqRytb5RMlc/SsoIkssDSt30vzl1PcBqflgc22v59FJOsP97G/Rj4cqWfQXMgMXcYaK6UK22yQRYk5lxlDTOUyT/jXs4XFcK8iuf/VBI4c5z/VyYSC42zZKd1l8sUqHnYdMJ4D0yfyv6g3BVLvjIP/e1sHIOW5Mx6K5j4qEpdGU1xAG/sjMl+TH0lsaMkRCDKfJYgWC0UCe8ZMf+XCRY3OiwmZRaU7DIUDInd3dwEwMLUviIop5fFCWK5RO0dcBQUCIJF51O9gHhx0c5jYdt/bvslBXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0j+q66QyRhwWCVv8+IoTSJgZbfN25htBLxDpR71A4kw=; b=i3ghvAYQWvDJaQCAtWiw9wRYxtCb940zxKekFkq/jjfoe6PekpWBgbyPfNLWMBsVLvv2NN4WMdFWI7Pn0lZ3GdKQWyRhO9vC2hGdDdN71mpmhJgBT6kYuKHENG4PeN9tI52XK3Sk0FY9t48QW+ZmqglwgOnSxW5kqjVocV3I/YoN1S0/S5naFsdhVOIFCD/36yPhzaxTlo9XfAXmjNSv15cYeleIJq3Kc9wzBSDDZNIOF1qguQB7qcSDrKsOyLAJALUfs1dfYUYQoWtzsdUcCIRQ15HHcw9a2GXdPTf1lyrV9wAIjNOAEM2cABDMNbsS4/2daY7px2BlY6GEoD8NEw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=live.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0j+q66QyRhwWCVv8+IoTSJgZbfN25htBLxDpR71A4kw=; b=noi12zrxno+tAN9cy315BegGJFH69bhTP+CM3gN82Ke6xUxVCsSt2zUDe0GzZ+32+chem+bmNuNUJkn4m2hwgtYPHfrvQDxyH+EhP2LTUbTcmOH6S7pPppQHeaAQIRc7b4F5MyF108LXfhoNxvYSWwBp4vBOZL9GUKjy0Srz5WC+RgzkatAxHJ7LpnZ51P3GZr0F1XmM+tAmmUJkSdU9dc54P3PcqcJiqmv9De99d4PzbOEGisxnCtXmcpubZGTI9PY37aIj2oaXoAhXlodDniFIE5Z11A9ixVbxq93UkYSHsGlXFZmFoiNE6vNnxMsLaWkgf19gfjg5Z+c3/B+kQQ== Original-Received: from DB8EUR06FT046.eop-eur06.prod.protection.outlook.com (2a01:111:e400:fc35::4a) by DB8EUR06HT191.eop-eur06.prod.protection.outlook.com (2a01:111:e400:fc35::276) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25; Tue, 25 May 2021 11:16:25 +0000 Original-Received: from AM9PR09MB4977.eurprd09.prod.outlook.com (2a01:111:e400:fc35::40) by DB8EUR06FT046.mail.protection.outlook.com (2a01:111:e400:fc35::122) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25 via Frontend Transport; Tue, 25 May 2021 11:16:25 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:F1C573E1F81094F6B3745700D42220FC752662275D0B606CEE8282180FE33D4D; UpperCasedChecksum:F4A1EAF488D3641F07CF29B63880487FE308B0C23D2A2C1E42D56D769E6D9887; SizeAsReceived:7646; Count:46 Original-Received: from AM9PR09MB4977.eurprd09.prod.outlook.com ([fe80::d1c1:2a0d:3b2b:4591]) by AM9PR09MB4977.eurprd09.prod.outlook.com ([fe80::d1c1:2a0d:3b2b:4591%7]) with mapi id 15.20.4173.020; Tue, 25 May 2021 11:16:25 +0000 In-Reply-To: <87im37p2b4.fsf@icterid> (Philip Kaludercic's message of "Tue, 25 May 2021 09:53:19 +0000") X-TMN: [XwJF/sVTRxa5Ph01hXAaNPqBQydUqMRM] X-ClientProxiedBy: AS8PR04CA0107.eurprd04.prod.outlook.com (2603:10a6:20b:31e::22) To AM9PR09MB4977.eurprd09.prod.outlook.com (2603:10a6:20b:304::20) X-Microsoft-Original-Message-ID: <82tumrnjw7.fsf@live.com> X-MS-Exchange-MessageSentRepresentingType: 1 Original-Received: from HP-Laptop.homepc (81.232.177.30) by AS8PR04CA0107.eurprd04.prod.outlook.com (2603:10a6:20b:31e::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4150.23 via Frontend Transport; Tue, 25 May 2021 11:16:25 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 46 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 8ec10266-e156-49be-6e11-08d91f6e88c8 X-MS-TrafficTypeDiagnostic: DB8EUR06HT191: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3T6GXinqHYPrlYU5DcxYnd2aDStaguWNTAzy6G/wt3CFGMVKE2TlkuprdOdvF4ac72u5415Qs4CbWgtJSrw9z/x52nePnkZO5v0FAl/HHg3uGb3CCwiTbpr4Sz2BG7qJq1BdZtt55szhVzz6rrRzqX9YuiHV89LyeiOLfySpQ8tEEowiETtO+VzMKYGBOYyh2NsZ3ZN+2YQhcYtIZFq9SYujVTYZip+veNg3vrS4ttJJpNnwo9k9uOwrSV8sODmjX6HjNrA4MR1MAM2GcKVdlpDiz10DmMjLwSpCv+YrIkcjXrxvRr6OIGiltFE9R/h/SVJHeMVlI+4qgJ2T0tsrUGTO4RoOqtYikwAAuzG9l5LncWcKVvLLN8oN4yqWZO/7rVuQ/ac67/Kz8VK8Yk3dqA== X-MS-Exchange-AntiSpam-MessageData: isvcmW9LEFpr9bbG3gN+Z4YdZheRj+fSB9fxJYnNeSKlxK1rKDEcFq3yAAIbZ8j84EKMJrAvyQSeSK0nUIvgUcbDrPKLwq+nP6LF9YdZICTEeRJgQhA45SuWqi+YIGdDGZKCnXmxwLAcfuE1lIZvaw== X-OriginatorOrg: live.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8ec10266-e156-49be-6e11-08d91f6e88c8 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 May 2021 11:16:25.5975 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: DB8EUR06FT046.eop-eur06.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8EUR06HT191 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:207191 Archived-At: Philip Kaludercic writes: > Lars Ingebrigtsen writes: > >> Philip Kaludercic writes: >> >>> The code should probably be refactored, moving more of the common >>> functionality into it's own function, but I am primarily wondering if >>> using emulation-mode-map-alists the way I am proposing it here is ok. Or >>> should I prefer minor-mode-map-alist? >> >> Making windmove into a regular (global) minor mode would be less >> surprising, I think, but I'm not really familiar with windmove, and >> whether that would be an easy rewrite? > > I have tried this out, and it seems somewhat elegant. From my testing, > it seems to behave the same way as the previous approach. > > -- > Philip K. > > From 2f7a8d89cdb5835cf875bc1f2bcfcb6755a0e0c0 Mon Sep 17 00:00:00 2001 > From: Philip Kaludercic > Date: Tue, 25 May 2021 11:47:51 +0200 > Subject: [PATCH] Improve windmove-*-default-keybindings fuctions > > * windmove.el (windmove-default-map): Add special map for windmove > commands > (windmove-mode): Add minor mode for activating windmove-default-map > (windmove-install-defaults): Add general function for manipulating > windmove-default-map > (windmove-default-keybindings): Use windmove-install-defaults > (windmove-display-default-keybindings): Use windmove-install-defaults > (windmove-delete-default-keybindings): Use windmove-install-defaults > (windmove-swap-states-default-keybindings): Use > windmove-install-defaults > --- > lisp/windmove.el | 84 ++++++++++++++++++++++++++++++++++++------------ > 1 file changed, 63 insertions(+), 21 deletions(-) > > diff --git a/lisp/windmove.el b/lisp/windmove.el > index e4ea8e0f69..5a81893bf9 100644 > --- a/lisp/windmove.el > +++ b/lisp/windmove.el > @@ -426,19 +426,46 @@ windmove-down > ;; I don't think these bindings will work on non-X terminals; you > ;; probably want to use different bindings in that case. > > +(defvar windmove-default-map (make-sparse-keymap) > + "Map used by `windmove-install-defaults'.") Sorry if I ask, but wouldn't ordinary windmove-mode-map do here? Since it is a convention to have mode maps called modename-mode-maps, if people would like to change, or add a binding in the windmove mode they would probably automatically try to alter windmove-mode-map instead of windmove-default-map. > +(define-minor-mode windmove-mode > + "Global minor mode for default windmove commands." > + :keymap windmove-default-map > + :init-value t > + :global t) > + > +(defun windmove-install-defaults (modifiers alist) > + "Install keys as specified by ALIST. > +Every element of ALIST has the form (FN KEY), where KEY is > +appended to MODIFIERS, before installing the key. Previous > +bindings of FN are unbound." > + (dolist (bind alist) > + (when (or (memq (cadr bind) '(left right up down)) > + (not (null modifiers))) > + (dolist (old (where-is-internal (car bind) windmove-default-map)) > + (define-key windmove-default-map old nil)) > + (define-key windmove-default-map > + (vector (append modifiers (cdr bind))) > + (car bind))))) > + > ;;;###autoload > (defun windmove-default-keybindingsq (&optional modifiers) > "Set up keybindings for `windmove'. > Keybindings are of the form MODIFIERS-{left,right,up,down}, > where MODIFIERS is either a list of modifiers or a single modifier. > +If MODIFIERS is `none', the keybindings will be directly bound to > +the arrow keys. > Default value of MODIFIERS is `shift'." > (interactive) > (unless modifiers (setq modifiers 'shift)) > + (when (eq modifiers 'none) (setq modifiers nil)) > (unless (listp modifiers) (setq modifiers (list modifiers))) > - (global-set-key (vector (append modifiers '(left))) 'windmove-left) > - (global-set-key (vector (append modifiers '(right))) 'windmove-right) > - (global-set-key (vector (append modifiers '(up))) 'windmove-up) > - (global-set-key (vector (append modifiers '(down))) 'windmove-down)) > + (windmove-install-defaults modifiers > + '((windmove-left left) > + (windmove-right right) > + (windmove-up up) > + (windmove-down down)))) > > > ;;; Directional window display and selection > @@ -546,17 +573,21 @@ windmove-display-default-keybindings > Keys are bound to commands that display the next buffer in the specified > direction. Keybindings are of the form MODIFIERS-{left,right,up,down}, > where MODIFIERS is either a list of modifiers or a single modifier. > +If MODIFIERS is `none', the keybindings will be directly bound to > +the arrow keys. > Default value of MODIFIERS is `shift-meta'." > (interactive) > (unless modifiers (setq modifiers '(shift meta))) > + (when (eq modifiers 'none) (setq modifiers nil)) > (unless (listp modifiers) (setq modifiers (list modifiers))) > - (global-set-key (vector (append modifiers '(left))) 'windmove-display-left) > - (global-set-key (vector (append modifiers '(right))) 'windmove-display-right) > - (global-set-key (vector (append modifiers '(up))) 'windmove-display-up) > - (global-set-key (vector (append modifiers '(down))) 'windmove-display-down) > - (global-set-key (vector (append modifiers '(?0))) 'windmove-display-same-window) > - (global-set-key (vector (append modifiers '(?f))) 'windmove-display-new-frame) > - (global-set-key (vector (append modifiers '(?t))) 'windmove-display-new-tab)) > + (windmove-install-defaults modifiers > + '((windmove-display-left left) > + (windmove-display-right right) > + (windmove-display-up up) > + (windmove-display-down down) > + (windmove-display-same-window ?0) > + (windmove-display-new-frame ?f) > + (windmove-display-new-tab ?t)))) > > > ;;; Directional window deletion > @@ -618,16 +649,22 @@ windmove-delete-default-keybindings > Keys are bound to commands that delete windows in the specified > direction. Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down}, > where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or > -a single modifier. Default value of PREFIX is `C-x' and MODIFIERS is `shift'." > +a single modifier. > +If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings > +are directly bound to the arrow keys. > +Default value of PREFIX is `C-x' and MODIFIERS is `shift'." > (interactive) > (unless prefix (setq prefix '(?\C-x))) > + (when (eq prefix 'none) (setq prefix nil)) > (unless (listp prefix) (setq prefix (list prefix))) > (unless modifiers (setq modifiers '(shift))) > + (when (eq modifiers 'none) (setq modifiers nil)) > (unless (listp modifiers) (setq modifiers (list modifiers))) > - (global-set-key (vector prefix (append modifiers '(left))) 'windmove-delete-left) > - (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right) > - (global-set-key (vector prefix (append modifiers '(up))) 'windmove-delete-up) > - (global-set-key (vector prefix (append modifiers '(down))) 'windmove-delete-down)) > + (windmove-install-defaults modifiers > + '((windmove-delete-left left) > + (windmove-delete-right right) > + (windmove-delete-up up) > + (windmove-delete-down down)))) > > > ;;; Directional window swap states > @@ -673,14 +710,19 @@ windmove-swap-states-default-keybindings > Keys are bound to commands that swap the states of the selected window > with the window in the specified direction. Keybindings are of the form > MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers > -or a single modifier. Default value of MODIFIERS is `shift-super'." > +or a single modifier. > +If MODIFIERS is `none', the keybindings will be directly bound to the > +arrow keys. > +Default value of MODIFIERS is `shift-super'." > (interactive) > (unless modifiers (setq modifiers '(shift super))) > + (when (eq modifiers 'none) (setq modifiers nil)) > (unless (listp modifiers) (setq modifiers (list modifiers))) > - (global-set-key (vector (append modifiers '(left))) 'windmove-swap-states-left) > - (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right) > - (global-set-key (vector (append modifiers '(up))) 'windmove-swap-states-up) > - (global-set-key (vector (append modifiers '(down))) 'windmove-swap-states-down)) > + (windmove-install-defaults modifiers > + '((windmove-swap-states-left left) > + (windmove-swap-states-right right) > + (windmove-swap-states-up up) > + (windmove-swap-states-down down)))) > > > (provide 'windmove)