[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#41438: [PATCH] Allow windmove keys to be bound without prefix or mod
From: |
Arthur Miller |
Subject: |
bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers |
Date: |
Tue, 25 May 2021 13:36:22 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (windows-nt) |
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))))
>
>
> ;;; 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)
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, (continued)
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Lars Ingebrigtsen, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Arthur Miller, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Arthur Miller, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers,
Arthur Miller <=
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Arthur Miller, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Lars Ingebrigtsen, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Lars Ingebrigtsen, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Juri Linkov, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/25
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Juri Linkov, 2021/05/26
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Philip Kaludercic, 2021/05/27
- bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers, Juri Linkov, 2021/05/30