I'd like to exchange Esc and CapsLock in console (not in X, and use xev
), how can I do it?
My OS is Ubuntu.
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityThe tools to manipulate the keyboard layout on the virtual consoles are loadkeys
, dumpkeys
and showkey
. Read their manpages and inform yourself about their intricacies.
Note that these tools only work in a virtual console, not in a terminal emulator in a graphical environment like gnome. The learn about the difference read this question and answers.
Here is a short guide to do what you want:
Save your current keyboard layout:
$ dumpkeys > backup.kmap
In case something goes wrong you might be able restore your keymap using the command:
$ sudo loadkeys backup.kmap
If the keyboard is so messed up that you can't even do this then your only option not involving ancient kernel magic is to reboot.
Check which keycodes are assigned to your keys:
$ showkey
Now press the ESC key and the CAPSLOCK key. The keycodes should show up on the screen. Note the keycodes. On my system the ESC has the keycode 1 and CAPSLOCK has the keycode 58. showkey
will terminate after 10 seconds of inactivity (at least it does on my ubuntu 10.04).
Note the names of the ESC and CAPSLOCK keys from dumpkeys:
$ dumpkeys | grep 1
...
keycode 1 = Escape
...
$ dumpkeys | grep 58
...
keycode 58 = CtrlL_Lock
...
Note the keymap line from dumpkeys:
$ dumpkeys | head -1
keymaps 0-127
Create a keymap file which switches ESC and CAPSLOCK:
keymaps 0-127
keycode 1 = CtrlL_Lock
keycode 58 = Escape
Load the keymap:
$ sudo loadkeys swap_esc_capslock.kmap
Test: Testing the CAPSLOCK key is obvious. Just press they CAPSLOCK key and check whether other keys come out capitalized. To test the ESC key you can use CTRL+V followed by ESC. It should print ^[
. CTRL+V makes the shell print the next key verbatim instead of interpreting it.
To have this modification load on every reboot, put the following line in your /etc/rc.local
file:
/usr/bin/loadkeys /path/to/swap_esc_capslock.kmap
Information gathered from various pages, including, but not limited to:
sudo setupcon --save
to make changes permanent, rather than editing rc.local. That's essentially the same as dumpkeys < /dev/tty1 | gzip > /etc/console-setup/cached.kmap.gz
/usr/bin/loadkeys
in /etc/rc.local
since the path environment variable is not guaranteed to be set at this stage. And sudo
is not needed in rc.local
.
May 7, 2013 at 20:04
rc.local
executes every time the system boots. @bukzor's sudo setupcon
is not in rc.local
, it's a one-time setup command, which replaces the system default keymap, without adding any runtime startup code. Adding loadkeys
to rc.local
, adds extra start up code and duplicates what was already done by the system default loadkeys. The rc.local
method could actually be less safe because it depends on a non-standard path to the keymap.
setupcon
. It appears that August made the assumption that the sudo setupcon --save
would go into rc.local
which I don't think is true, but if it does, you don't need sudo
in rc.local
. I think we need more info before updating your answer. The main question is "How to install the modified keymap so that it gets loaded automatically during the boot process?" I really don't know which is a better way, rc.local
or installing a keymap, or even if installing a keymap will work. I have been researching this lately and I'll check back here.
showkey
command isn't working for me as described. when I run it, I get a warning: "[ if you are trying this under X, it might not work since the X server is also reading /dev/console ]". It still gives me the prompt to "press any key" but no key codes show up, just the character itself (i.e. 'a' appears if I press the 'a' key, and nothing happens at all if I press "Caps Lock"). help!!
Sep 27, 2016 at 15:01
Use ctrl:nocaps
instead of ctrl:swapcaps
if you just want to have two capslocks key (capslock by another name is still super useless).
X11: (see also: /usr/share/X11/xkb/rules/base.lst
)
sudo vim /etc/default/keyboard
XKBOPTIONS="ctrl:swapcaps"
udevadm trigger --subsystem-match=input --action=change
sudo restart lightdm
Text console: (stolen from setupcon)
#!/bin/sh
. /etc/default/console-setup
. /etc/default/keyboard
ckbcomp $acm_option $rules_option -model "$XKBMODEL" \
"$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" \
| gzip -9 2>/dev/null >/etc/console-setup/cached.kmap.gz
loadkeys /etc/console-setup/cached.kmap.gz
setupcon
is not known on my system, do you have any info about source?