You know how cursor behaves in practically any text field / text area / command line, where arrow keys move cursor by single character, but holding down Ctrl while pressing arrow keys moves cursor by whole word.
What kind of wizardry would one do in order to switch this around?
As in, make the move-by-word the default behaviour, but make holding down Ctrl move cursor by just a single character?
Some keyboard input binding, where ⬅ is an alias for Ctrl+⬅ ? But no idea how to make the opposite of this. Make Ctrl+⬅ an keyboard shortcut for xdotool key Left
or something?
Does a setting like this already exist?
Also not sure if /c/linux is the most appropriate community for this question. Feel free to suggest more appropriate one or even cross-post to there.
Thank you
I’m pretty sure both are possible in xkb. But you’ll have to learn how to get a custom xkb_keymap into your DE of choice. I only learned enough to do one mapping:
xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" key { type= "TWO_LEVEL", symbols[Group1] = [ Multi_key, Caps_Lock ], actions[Group1] = [ NoAction(), LockMods(modifiers=Lock) ] }; key {[ Escape ]}; }; xkb_geometry { include "pc(pc105)" }; };
This remaps Capslock to Escape, Escape to Compose, and Shift+Escape to Capslock. Not what you want, but hopefully this will give you a starting point to playing/breaking xkb.
Another benefit of doing this with xkb: it’s now a separate codebase from X.org, and is used in every Wayland compositor I know of.
For shells (and other programs) using GNU readline for interactions and line-edits (like bash), some of this can be achieved with an
~/.inputrc
configuration file, e.g., mapping the correct key sequence for your terminal emulator to thebackward-word
move command. You can look up these sequences usinginfocmp -L1
or interactively usingsed -n l
.Most other shells use their own command line handling routines and configuration though, so this won’t work for e.g., zsh or fish.
For Zsh, this might work:
bindkey '^[[1;2C' forward-word bindkey '^[[1;2D' backward-word
If these don’t work for you, try this:
read -rsk1 s while read -rsk1 -t 0.1; do s+=$REPLY; done printf '%s\n' ${s//$'\e'/'^['}
And type the chord/key you want to check.
If your concern is about the comfort using the Control key frequently, another option is to solve this at the keyboard hardware or firmware level.
For example, I use a Corne keyboard with a control key on a convenient thumb key. I also don’t have to hold it. I can tap it and tap the next key.
Also, by holding down another thumb key on the other hand, arrow keys are available for the home row. With this, using arrow keys and modifier keys via comfortable across all apps.
https://mark.stosberg.com/markstos-corne-3x5-1-keyboard-layout/
This all depends on what “level” you want the feature to take effect.
You might have some success, for example, by generating your own keyboard table (
man keyboard
to start down that particular rabbit hole) that swaps the functionality of arrow and ctrl+arrow to the point that most software will think you have pressed ctrl+arrow when pressing the arrow and vice versa.At the other end of the scale, a window manager might be able to override one or the other, or possibly both, depending on available features.
For example, in Cinnamon (and possibly other GNOME variants) it’s possible to set up triggers for most keypress combinations (occasionally single keys too), capturing and processing before being passed to any software that might be running. Triggers can call commands like
xdotool
or anything else really. You may need to throw asleep 0.5
before the call toxdotool
in the script / command-line to allow control to switch back to the running software. YMMV.(If you’re really clever, you could assign a keypress that shuffles some symbolic links around, modifies a configuration, or some such, effectively allowing a feature to be toggled without having to modify the keypresses. Exercise for the reader, etc.)