From: Arthur Miller <arthur.miller@live.com>
To: Philip Kaludercic <philipk@posteo.net>
Cc: 41438@debbugs.gnu.org, Lars Ingebrigtsen <larsi@gnus.org>,
Juri Linkov <juri@linkov.net>
Subject: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
Date: Tue, 25 May 2021 13:36:22 +0200 [thread overview]
Message-ID: <AM9PR09MB4977C5430B63ABDFDB54131F96259@AM9PR09MB4977.eurprd09.prod.outlook.com> (raw)
In-Reply-To: <87im37p2b4.fsf@icterid> (Philip Kaludercic's message of "Tue, 25 May 2021 09:53:19 +0000")
Philip Kaludercic <philipk@posteo.net> writes:
If you are already patching windmove.el, can you consider adding
bindings for these funcitions too (defined in window.el):
enlarge-window-horizontally
shrink-window-horizontally
As well as add these two wrappers for vertical operations:
#+begin_src emacs-lisp
;;;###autoload
(defun enlarge-window-vertically (delta)
"Make selected window DELTA columns wider.
Interactively, if no argument is given, make selected window one
column wider."
(interactive "p")
(enlarge-window delta nil))
;;;###autoload
(defun shrink-window-vertically (delta)
"Make selected window DELTA columns narrower.
Interactively, if no argument is given, make selected window one
column narrower."
(interactive "p")
(shrink-window delta nil))
#+end_src
I have been using those for long time myself since I prefer to do
everything from the keyboard. Maybe someone else finds them useful too;
they have been in my config on GH for long time.
> Lars Ingebrigtsen <larsi@gnus.org> writes:
>
>> Philip Kaludercic <philipk@posteo.net> 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 <philipk@posteo.net>
> 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'.")
> +
> +(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))))
>
> \f
> ;;; 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))))
>
> \f
> ;;; 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))))
>
> \f
> ;;; 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))))
>
> \f
> (provide 'windmove)
next prev parent reply other threads:[~2021-05-25 11:36 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-21 16:56 bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers Philip K.
2020-05-21 22:18 ` Juri Linkov
2020-05-22 18:26 ` Philip K.
[not found] ` <(message>
[not found] ` <from>
[not found] ` <Juri>
[not found] ` <Linkov>
[not found] ` <on>
[not found] ` <Fri>
[not found] ` <22>
[not found] ` <May>
[not found] ` <2020>
[not found] ` <04:01:05>
[not found] ` <01:18:18>
[not found] ` <+0300)>
[not found] ` <87v9kn7rnk.fsf@bulbul>
2020-05-22 19:15 ` Drew Adams
2020-05-23 22:12 ` Juri Linkov
2020-06-26 19:46 ` Philip K.
2020-06-27 23:53 ` Juri Linkov
2020-06-28 8:30 ` Philip K.
2020-06-28 23:37 ` Juri Linkov
2020-08-05 18:05 ` Lars Ingebrigtsen
2020-08-05 23:40 ` Juri Linkov
2020-08-06 9:28 ` Philip K.
2020-08-06 23:43 ` Juri Linkov
2020-08-07 10:53 ` Philip K.
2020-08-08 23:54 ` Juri Linkov
2021-05-12 20:38 ` Lars Ingebrigtsen
2021-05-12 21:27 ` Philip Kaludercic
2021-05-22 20:29 ` Philip Kaludercic
2021-05-22 21:09 ` Philip Kaludercic
2021-05-23 6:49 ` Eli Zaretskii
2021-05-23 12:36 ` Philip Kaludercic
2021-05-25 5:12 ` Lars Ingebrigtsen
2021-05-25 7:25 ` Philip Kaludercic
2021-05-25 9:53 ` Philip Kaludercic
2021-05-25 11:16 ` Arthur Miller
2021-05-25 11:42 ` Philip Kaludercic
2021-05-25 13:31 ` Arthur Miller
2021-05-25 14:39 ` Philip Kaludercic
2021-05-25 11:36 ` Arthur Miller [this message]
2021-05-25 11:46 ` Philip Kaludercic
2021-05-25 13:58 ` Arthur Miller
2021-05-25 19:13 ` Lars Ingebrigtsen
2021-05-25 19:16 ` Lars Ingebrigtsen
2021-05-25 19:25 ` Philip Kaludercic
2021-05-25 20:18 ` Juri Linkov
2021-05-25 21:45 ` Philip Kaludercic
2021-05-26 21:35 ` Juri Linkov
2021-05-27 11:09 ` Philip Kaludercic
2021-05-30 22:11 ` Juri Linkov
2021-05-31 8:50 ` Philip Kaludercic
2021-05-31 20:15 ` Juri Linkov
2021-05-31 21:27 ` Philip Kaludercic
2021-06-03 20:36 ` Juri Linkov
-- strict thread matches above, loose matches on Subject: below --
2020-07-30 4:01 bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work Brett Randall
[not found] ` <handler.42611.B.159608273314264.ack@debbugs.gnu.org>
[not found] ` <(Brett>
2020-10-17 8:41 ` Lars Ingebrigtsen
2020-10-27 10:36 ` brett.randall
[not found] ` <(brett>
[not found] ` <randall's>
[not found] ` <"Tue,>
[not found] ` <27>
[not found] ` <Oct>
2020-10-27 10:43 ` Lars Ingebrigtsen
2020-10-27 10:49 ` Brett Randall
2020-10-27 11:08 ` Lars Ingebrigtsen
[not found] ` <(Lars>
[not found] ` <Ingebrigtsen's>
[not found] ` <12:08:50>
2020-10-27 11:19 ` bug#42611: (no subject) Lars Ingebrigtsen
[not found] ` <877drbhq6c.fsf@gnus.org>
[not found] ` <handler.42611.C.160379757411378.notifdonectrl.0@debbugs.gnu.org>
2020-10-27 22:22 ` bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work Brett Randall
2019-04-21 19:30 bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files' Drew Adams
2019-07-09 14:21 ` Lars Ingebrigtsen
2019-07-11 5:51 ` Mike Kupfer
2019-07-11 14:04 ` Lars Ingebrigtsen
2019-07-11 14:18 ` Drew Adams
2019-07-12 3:20 ` Mike Kupfer
2019-07-12 3:33 ` Drew Adams
2022-01-22 14:43 ` Lars Ingebrigtsen
[not found] <Your>
[not found] ` <message>
[not found] ` <of>
[not found] ` <"Tue>
[not found] ` <09>
[not found] ` <Jul>
[not found] ` <2019>
[not found] ` <07:18:26>
[not found] ` <16:21:24>
[not found] ` <"Thu>
[not found] ` <"Thu,>
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=AM9PR09MB4977C5430B63ABDFDB54131F96259@AM9PR09MB4977.eurprd09.prod.outlook.com \
--to=arthur.miller@live.com \
--cc=41438@debbugs.gnu.org \
--cc=juri@linkov.net \
--cc=larsi@gnus.org \
--cc=philipk@posteo.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).