Swap bindings between key pairs
This allows the easy toggling of bindings by turning off and on keyswap-mode.
Install from MELPA (recommended) or download keyswap.el, add to emacs
load-path with
(add-to-list 'load-path "/path/to/directory/containing/this/file/")
then require the package.
Turn on keyswap-mode with
(keyswap-mode)
keyswap is a minor mode that allows swapping the commands of two keys. It comes with a default set of keys to swap of the number keys and their shifted counterparts along with the ‘-’ and ‘_’ key. This is different to the function `keyboard-translate’ as swaps may be done on a per-major-mode basis. This is generally useful in programming languages where symbols are more often used than numbers.
To use keyswap-mode, make sure this file is in the Emacs load-path:
(add-to-list 'load-path "/path/to/directory/or/file")
Then require keyswap:
(require 'keyswap)
To toggle between swapped and not-swapped sets of keys, use the command
(keyswap-mode) or M-x keyswap-mode
Keys are swapped on a major-mode basis. If you change the swapped keys in one buffer these changes are propagated to all other major modes.
The set of keys to swap is stored in the buffer local keyswap-pairs
variable.
This variable is an alist of vectors ready for passing to define-key that
should be swapped when keyswap-mode is turned on.
Its default is to swap all number keys and their shifted alternatives, along
with the - and _ keys.
In order to change the current swapped keys one should modify this list with
keyswap-add-pairs or keyswap-remove-pairs, and then run
keyswap-update-keys like so
(keyswap-add-pairs ?\: ?\;) (keyswap-remove-pairs ?\- ?\_) (keyswap-update-keys)
Without running keyswap-update-keys the changes in keyswap-pairs will not
be propagated into the action of keyswap-mode.
There are some provided hooks for common modifications of keyswap-pairs
that modify the pairs to swap and call keyswap-update-keys accordingly.
These are keyswap-include-braces to swap [ and ] with { and },
keyswap-include-quotes to swap ’ with “, keyswap-tac-underscore-exception
to not swap - and _, and finally keyswap-colon-semicolon to swap : and ;.
It is recommended to turn on keyswap-mode by default in programming buffers
with
(add-hook 'prog-mode-hook 'keyswap-mode)
and then add modifications for each major-mode you desire accordingly, e.g.
(with-eval-after-load 'cc-vars (add-hook 'c-mode-common-hook 'keyswap-include-quotes)) (with-eval-after-load 'lisp-mode (add-hook 'emacs-lisp-mode-hook 'keyswap-tac-underscore-exception) (add-hook 'lisp-mode-hook 'keyswap-tac-underscore-exception))
To toggle between having keys swapped and not, just turn on and off
keyswap-mode.
Some common packages like paredit change bindings on some keys.
In order to keep the keyswap-mode mappings in sync it is recommended you
add keyswap-update-keys to the relevant hook.
(add-hook 'paredit-mode-hook 'keyswap-update-keys)
One package that requires more than the normal amount of configuration is the
wrap-region package.
Because this changes the bindings on certain keys, it requires
keyswap-update-keys to be in its hook.
(add-hook 'wrap-region-mode-hook 'keyswap-update-keys)
Due to the way that it falls back to inserting a single character when the
region is not active, you need an advice around wrap-region-fallback that
ensures keyswap-mode is not on at the time it is called.
(defadvice wrap-region-fallback (around keyswap-negate protect activate)
"Ensure that `keyswap-mode' is not active when
`wrap-region-fallback' is getting called."
(let ((currently-on keyswap-mode))
(when currently-on (keyswap-mode 0))
ad-do-it
(when currently-on (keyswap-mode 1))))Though the conveniance functions don’t account for key chords (e.g. C-x j r),
the utility functions work well with them.
Hence you can manually swap these with code similar to the below.
(push (cons [?\� ?r ?j] [?\� ?r ?\ ]) keyswap-pairs) (keyswap-update-keys)
In order to have the same swapped keys in `isearch-mode’ as in the buffer you’re currently editing, you can add
(add-hook 'isearch-mode-hook 'keyswap-isearch-start-hook)
into your config.
To have swapped keys when using `avy’, you can have
(with-eval-after-load 'avy (keyswap-avy-integrate))
in your config.