Keyboard layout switching

Keyboard layout maps scancodes from a keyboard into characters sent to application. Keyboard layout can also do more complex transformations via so called dead keys which do not output characters on their own but modify output of subsequent keys. An appropriate keyboard layout is required to support both non-QWERTY keyboards as well as QWERTY keyboards used to enter characters outside of ASCII set.

OpenRC
Edit which is documented but not very understandable. It appears that one should choose appropriate keyboard map likely from as the value for keymap and then optionally also pick files from appropriate include directory such as  other locations might or might not work as values for the   variable.

Lastly add to the boot run level.

Custom Keymap
To make your own keymap just look at the provided keymaps in /usr/share/keymaps for examples.

Here is an example custom keymap which is the same as the U.S. qwerty keymap except the forward slash and apostrophe keys are swapped:

To find the keycodes mapped to keys you can view the output of:

or if you can't find your key run:

Just press the key and its keycode will be shown. When you're done wait a few seconds, and showkey will close.

systemd
systemd uses and includes both tty font and keyboard layout settings but lacks advanced settings found in OpenRC. Valid values should match what OpenRC supports for the corresponding variable.

X11
Modern X11 applications usually use libXklavier (das Klavier being German for keyboard so it has nothing to do with a certain K DE) and can be configured by using setxkbmap. Furthermore X11 supports much broader set of keyboard layouts than virtual terminal. It should be kept in mind that proper desktop environment will do its own keyboard layout management and there's no need to directly use aforementioned application but it can come in handy when dealing with broken or lacking keyboard layout management.

KDE4
Open System Settings and navigate to Input Devices module.

Generic desktop environment
Edit and call setxkbmap from there.

lxpanel's Keyboard Layout Handler
provides a keyboard layout handler as panel item.

Generic X11
Querying existing configuration:

Setting a keyboard layout:

Setting a keyboard layout and its variant:

Finding the supported layouts and variants or values of other xkb properties does not appear to be possible with this application and the only generic way to determine supported values is by examining. For sake of sanity use of a proper desktop environment with its own keyboard layout management is advised.

Editing file
This method is recommended for configuration without desktop environments, in other words just X11 with a window manager. Create the file and configure it with relative keyboard settings.

Enhancing an X keyboard layout
This is necessary if you want to make more far-reaching changes to your keyboard layout, such as adding key assignments, or adding actions to function keys.

The fundamentals
The relevant Gentoo package is x11-misc/xkeyboard-config. Configuring a keyboard under X is more complicated than the doing the same for a virtual console. The pertinent configuration files can be found in /usr/share/X11/xkb in these subdirectories:


 * keycodes
 * These files associate key codes with symbolic names - you're unlikely to want to change this.


 * geometry
 * This is the physical shape of the keyboard, used by some software for drawing diagrams of it - you'll not want to change this either.


 * types
 * The files here create "types". Used in a key declaration, a type specifies which combinations of shift keys can be used with the key.


 * symbols
 * These files specify the actual key assignments.


 * compat
 * The files here specify "actions" (such as switching to a virtual terminal), giving them names, which can be assigned to keys.


 * rules
 * These files, given parameters such as the keyboard type, and a language, activate the appropriate specifications in the other directories.

Xkb gives keys names like "" which means "key in the Alphanumeric area, in row C (i.e. third row from the bottom, the row CapsLock is on), and key number 01, the first key at the left of the row. This key is A in an English layout.  Keys in other areas have other names, such as "" for F5, or "" for the left control key.  The keys we want to enhance are A (), O () and U ().

A fuller description of the files in these directories can be found at An Unreliable Guide to XKB Configuration by Doug Palmer. It's a lot better than its name suggests. Further documentation can be found at xkeyboard-config's home page at freedesktop.org.

Adding key assignments
As an example, we wish to enhance the British English keyboard layout such that typing a, o, or u with AltGr will generate the German umlaut letters ä, ö, and ü. It should also do the Right Thing for the upper case versions.

The names of the umlauted letters in xkb are "adiaeresis" and so on. These names can be found in the file /usr/include/X11/keysymdef.h, though you have to remove the leading "XK_" to get the name.

Identify the pertinent file in the symbols directory. Most of these files are named as two letter country codes, e.g. "gb" for Great Britain, so guess the one which matches the keyboard layout you've selected in X. Here, we enhance symbols/gb.

With the information above, we can now create our new entries by copying the existing scheme in symbols/gb. We guess that these entries should be added into the section called "basic". We can also easily guess that the four items in the braces and brackets within the entry for each key:

key 	{ [        2,   quotedbl,  twosuperior,    oneeighth]	};

are for unshifted, shift, AltGr, and shift-AltGr respectively.

After making the additions, the section looks like this:

Having saved this file, restart your X Windows. A typical desktop environment, XFCE, re-reads the above configuration files each time it starts. Should there be errors, error messages will be written to the normal stderr - if you start your X Windows from the command line, stderr will be the virtual tty you started it from.