How to change console keymap in Linux?
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.
The 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: https://askubuntu.com/questions/14284/why-is-a-virtual-terminal-virtual-and-what-why-where-is-the-real-terminal.
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:
- http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html
- http://www.mail-archive.com/[email protected]/msg01407.html
- http://ubuntuforums.org/showthread.php?p=4591324#post4591324
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