[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or
From: |
Philip K. |
Subject: |
Re: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers |
Date: |
Fri, 22 May 2020 20:26:07 +0200 |
Juri Linkov <address@hidden> writes:
>> Another question I'd like to ask before trying it out: Would there be
>> any interest in adding user options for the "default" modifiers that
>> windmove should use? If yes, one could add a :set function that
>> automatically calls the apropriate bindings function, when it's value
>> is non-nil. I have a very customize-centric configuration, where something
>> this would fit in very well.
>
> I think that adding defcustoms (including a new const `none')
> would be the most natural way to customize windmove modifiers
> (provided that the existing functions should remain).
I made a first concept, but it doesn't work unless windmove is explicity
required (see below). As far as I know, autoloading variables isn't good
style, so is there any other way to invoke the :set property of a user
option?
--
Philip K.
>From b35173936e681e170172eb3d4548a2f91f70dad3 Mon Sep 17 00:00:00 2001
From: Philip K <address@hidden>
Date: Fri, 22 May 2020 20:21:59 +0200
Subject: [PATCH] Implement user options for windmove modifiers and prefixes
---
lisp/windmove.el | 103 +++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 95 insertions(+), 8 deletions(-)
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 3d7f86b9af..95f74bfb81 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -162,6 +162,19 @@ windmove-window-distance-delta
(make-obsolete-variable 'windmove-window-distance-delta
"no longer used." "27.1")
+(defconst windmove-modifier-type
+ '(choice (set :tag "Modifier Symbols"
+ :greedy t
+ ;; See `(elisp) Keyboard Events'
+ (const :tag "Meta" meta)
+ (const :tag "Control" control)
+ (const :tag "Shift" shift)
+ (const :tag "Hyper" hyper)
+ (const :tag "Super" super)
+ (const :tag "Alt" alt))
+ (const :tag "No modifier" none))
+ "Customisation type for windmove modifiers")
+
;; Note:
;;
@@ -419,6 +432,7 @@ windmove-down
(interactive "P")
(windmove-do-window-select 'down (and arg (prefix-numeric-value arg))))
+(defvar windmove-modifiers)
;;; set up keybindings
;; Idea for this function is from iswitchb.el, by Stephen Eglen
@@ -433,9 +447,10 @@ windmove-default-keybindings
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'."
+Default value of MODIFIERS is stored in `windmove-modifiers'."
(interactive)
- (unless modifiers (setq modifiers 'shift))
+ (unless modifiers
+ (setq modifiers windmove-modifiers))
(when (eq modifiers 'none) (setq modifiers nil))
(unless (listp modifiers) (setq modifiers (list modifiers)))
(global-set-key (vector (append modifiers '(left))) 'windmove-left)
@@ -443,6 +458,25 @@ windmove-default-keybindings
(global-set-key (vector (append modifiers '(up))) 'windmove-up)
(global-set-key (vector (append modifiers '(down))) 'windmove-down))
+;; has to be declared AFTER windmove-default-keybindings, or else
+;; windmove is recursivly loaded
+;;;###autoload
+(defcustom windmove-modifiers '(shift super)
+ "Modifiers for `windmove-default-keybindings'.
+Can either be a symbol or list of modifier symbols,
+i.e. `meta',`control', `shift', `hyper', `super', or `alt'
+representing modifier keys to use with the arrow keys.
+
+If the value is just `none', the arrow keys will be directly
+bound to the windmove functions."
+ :type windmove-modifier-type
+ :require 'windmove
+ :initialize #'custom-initialize-changed
+ :set (lambda (sym val)
+ (when val
+ (windmove-swap-states-default-keybindings val))
+ (set-default sym val)))
+
;;; Directional window display and selection
@@ -565,6 +599,8 @@ windmove-display-new-tab
(interactive "P")
(windmove-display-in-direction 'new-tab arg))
+(defvar windmove-display-modifiers)
+
;;;###autoload
(defun windmove-display-default-keybindings (&optional modifiers)
"Set up keybindings for directional buffer display.
@@ -573,7 +609,7 @@ windmove-display-default-keybindings
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'."
+Default value of MODIFIERS is stored in `windmove-display-modifiers'."
(interactive)
(unless modifiers (setq modifiers '(shift meta)))
(when (eq modifiers 'none) (setq modifiers nil))
@@ -586,6 +622,17 @@ windmove-display-default-keybindings
(global-set-key (vector (append modifiers '(?f)))
'windmove-display-new-frame)
(global-set-key (vector (append modifiers '(?t)))
'windmove-display-new-tab))
+(defcustom windmove-display-modifiers '(shift meta)
+ "Modifiers for `windmove-display-default-keybindings'.
+Analogous to `windmove-modifiers'."
+ :type windmove-modifier-type
+ :require 'windmove
+ :initialize #'custom-initialize-changed
+ :set (lambda (sym val)
+ (when val
+ (windmove-display-default-keybindings val))
+ (set-default sym val)))
+
;;; Directional window deletion
@@ -640,6 +687,9 @@ windmove-delete-down
(interactive "P")
(windmove-delete-in-direction 'down arg))
+(defvar windmove-delete-prefix)
+(defvar windmove-delete-modifiers)
+
;;;###autoload
(defun windmove-delete-default-keybindings (&optional prefix modifiers)
"Set up keybindings for directional window deletion.
@@ -649,12 +699,13 @@ windmove-delete-default-keybindings
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'."
+The default values for PREFIX and MODIFIERS are stored in
`windmove-delete-prefix'
+and `windmove-delete-modifiers' respectively."
(interactive)
- (unless prefix (setq prefix '(?\C-x)))
+ (unless prefix (setq prefix (list windmove-delete-prefix)))
(when (eq prefix 'none) (setq prefix nil))
(unless (listp prefix) (setq prefix (list prefix)))
- (unless modifiers (setq modifiers '(shift)))
+ (unless modifiers (setq modifiers windmove-delete-modifiers))
(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)
@@ -662,6 +713,28 @@ windmove-delete-default-keybindings
(global-set-key (vector prefix (append modifiers '(up)))
'windmove-delete-up)
(global-set-key (vector prefix (append modifiers '(down)))
'windmove-delete-down))
+(defcustom windmove-delete-prefix (kbd "C-x")
+ "Prefix for `windmove-delete-default-keybindings'."
+ :type 'key-sequence
+ :require 'windmove
+ :initialize #'custom-initialize-changed
+ :set (lambda (sym val)
+ (windmove-delete-default-keybindings
+ val windmove-delete-modifiers)
+ (set-default sym val)))
+
+(defcustom windmove-delete-modifiers '(shift)
+ "Modifiers for `windmove-delete-default-keybindings'.
+See `windmove-modifiers' for more details"
+ :type windmove-modifier-type
+ :require 'windmove
+ :initialize #'custom-initialize-changed
+ :set (lambda (sym val)
+ (when val
+ (windmove-delete-default-keybindings
+ windmove-delete-prefix val))
+ (set-default sym val)))
+
;;; Directional window swap states
@@ -700,6 +773,8 @@ windmove-swap-states-right
(interactive)
(windmove-swap-states-in-direction 'right))
+(defvar windmove-swap-states-modifiers)
+
;;;###autoload
(defun windmove-swap-states-default-keybindings (&optional modifiers)
"Set up keybindings for directional window swap states.
@@ -709,9 +784,10 @@ windmove-swap-states-default-keybindings
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'."
+Default value of MODIFIERS is stored in `windmove-swap-states-modifiers'."
(interactive)
- (unless modifiers (setq modifiers '(shift super)))
+ (unless modifiers
+ (setq modifiers windmove-swap-states-modifiers))
(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)
@@ -719,6 +795,17 @@ windmove-swap-states-default-keybindings
(global-set-key (vector (append modifiers '(up)))
'windmove-swap-states-up)
(global-set-key (vector (append modifiers '(down)))
'windmove-swap-states-down))
+(defcustom windmove-swap-states-modifiers
+ '(shift super)
+ "Modifiers for `windmove-swap-states-default-keybindings'.
+Analogous to `windmove-modifiers'."
+ :type windmove-modifier-type
+ :require 'windmove
+ :initialize #'custom-initialize-changed
+ :set (lambda (sym val)
+ (windmove-swap-states-default-keybindings val)
+ (set-default sym val)))
+
(provide 'windmove)
--
2.20.1
- Re: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers,
Philip K. <=