bug-gnu-emacs
[Top][All Lists]
Advanced

[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)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]