System -> Preferences -> Keyboard -> Layouts -> Add… Right? It is all good and clean only in case if layouts, that come with Ubuntu (or other Linux), are exactly what you need. But what if you’d like to create your own layout? Or, most of the time, what if layout is ok, but you would like to change a couple of keys around, because you are used to it “that certain way”? Here is how to approach these “what if”s.
The “guy” to talk to is XKB (X KeyBoard), which is responsible for everything that is going on with keyboard(s) under X (GUI Environment).
First, let us find the layout to change/modify/customize. For that we will go to “/usr/share/X11/xkb/symbols”:
user@host:/usr/share/X11/xkb/symbols$ ls ad by epo hr kh mk pl th af ca es hu kr mm pt tj al capslock eurosign ie kz mn ro tr altwin cd fi il la mt ru ua am ch fo in latam mv ru_backup us ara compose fr inet latin nbsp se uz az cs fujitsu_vndr/ iq level3 nec_vndr/ sgi_vndr/ vn ba ctrl gb ir level5 ng si xfree68_vndr/ bd cz ge is lk nl sk za be de gh it lt no sony_vndr/ bg digital_vndr/ gr jp lv np srvr_ctrl br dk group keypad macintosh_vndr/ pc sun_vndr/ bt ee hp_vndr/ kg mao pk sy |
This is home for all layouts that XKB reads in and follows. That means that if a layout needs to be changed all the changes are written here.
Now let’s change a Russian Phonetic (for example) layout to change a couple of keys around. For that, first, make a backup of the existing Russian layout (that has all Russian Layouts):
sudo cp ru ru_backup |
then let’s get to breaking through and customizing it (use your favorite text editor, “vi” here is used as an example):
sudo vi ru // $XKeyboardConfig: xkbdesc/symbols/ru,v 1.11 2006/09/04 20:25:10 svu Exp $ // based on // russian standard keyboard // AEN aen@logic.ru // 2001/12/23 by Leon Kanter leon@blackcatlinux.com // 2005/12/09 Valery Inozemtsev shrek@altlinux.ru // // $XFree86: xc/programs/xkbcomp/symbols/ru,v 1.3 2003/02/15 22:27:05 dawes Exp $ partial default alphanumeric_keys xkb_symbols "basic" { name[Group1]= "Russia"; key AE01 { [ 1, exclam ] }; key AE02 { [ 2, quotedbl ] }; key AE03 { [ 3, numbersign ] }; key AE04 { [ 4, asterisk ] }; key AE05 { [ 5, colon ] }; key AE06 { [ 6, comma ] }; key AE07 { [ 7, period ] }; key AE08 { [ 8, semicolon ] }; key AE09 { [ 9, parenleft ] }; key AE10 { [ 0, parenright ] }; key AE11 { [ minus, underscore ] }; key AE12 { [ equal, plus ] }; key BKSL { [ backslash, bar ] }; key AB10 { [ slash, question ] }; key LSGT { [ slash, bar ] }; key TLDE { [ Cyrillic_io, Cyrillic_IO ] }; key AD01 { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key AD02 { [ Cyrillic_tse, Cyrillic_TSE ] }; key AD03 { [ Cyrillic_u, Cyrillic_U ] }; key AD04 { [ Cyrillic_ka, Cyrillic_KA ] }; key AD05 { [ Cyrillic_ie, Cyrillic_IE ] }; key AD06 { [ Cyrillic_en, Cyrillic_EN ] }; key AD07 { [ Cyrillic_ghe, Cyrillic_GHE ] }; key AD08 { [ Cyrillic_sha, Cyrillic_SHA ] }; key AD09 { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key AD10 { [ Cyrillic_ze, Cyrillic_ZE ] }; key AD11 { [ Cyrillic_ha, Cyrillic_HA ] }; key AD12 { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] }; key AC01 { [ Cyrillic_ef, Cyrillic_EF ] }; key AC02 { [ Cyrillic_yeru, Cyrillic_YERU ] }; key AC03 { [ Cyrillic_ve, Cyrillic_VE ] }; key AC04 { [ Cyrillic_a, Cyrillic_A ] }; key AC05 { [ Cyrillic_pe, Cyrillic_PE ] }; key AC06 { [ Cyrillic_er, Cyrillic_ER ] }; key AC07 { [ Cyrillic_o, Cyrillic_O ] }; key AC08 { [ Cyrillic_el, Cyrillic_EL ] }; key AC09 { [ Cyrillic_de, Cyrillic_DE ] }; key AC10 { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key AC11 { [ Cyrillic_e, Cyrillic_E ] }; key AB01 { [ Cyrillic_ya, Cyrillic_YA ] }; key AB02 { [ Cyrillic_che, Cyrillic_CHE ] }; key AB03 { [ Cyrillic_es, Cyrillic_ES ] }; key AB04 { [ Cyrillic_em, Cyrillic_EM ] }; key AB05 { [ Cyrillic_i, Cyrillic_I ] }; key AB06 { [ Cyrillic_te, Cyrillic_TE ] }; key AB07 { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key AB08 { [ Cyrillic_be, Cyrillic_BE ] }; key AB09 { [ Cyrillic_yu, Cyrillic_YU ] }; key.type[group1]="TWO_LEVEL"; include "keypad(comma)" }; partial alphanumeric_keys xkb_symbols "winkeys" { include "ru(basic)" name[Group1]= "Russia - Winkeys"; key AE03 { [ 3, numerosign ] }; key AE04 { [ 4, semicolon ] }; key AE05 { [ 5, percent ] }; key AE06 { [ 6, colon ] }; key AE07 { [ 7, question ] }; key AE08 { [ 8, asterisk ] }; key AB10 { [ period, comma ] }; key BKSL { [ backslash, slash ] }; }; partial alphanumeric_keys xkb_symbols "typewriter" { include "ru(basic)" name[Group1]= "Russia - Typewriter"; key TLDE { [ apostrophe, quotedbl ] }; key AE01 { [ exclam, 1 ] }; key AE02 { [ numerosign, 2 ] }; key AE03 { [ slash, 3 ] }; key AE04 { [ semicolon, 4 ] }; key AE05 { [ colon, 5 ] }; key AE06 { [ comma, 6 ] }; key AE07 { [ period, 7 ] }; key AE08 { [ underscore, 8 ] }; key AE09 { [ question, 9 ] }; key AE10 { [ percent, 0 ] }; key BKSL { [ parenleft, parenright ] }; key AD12 { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] }; key AB10 { [ Cyrillic_io, Cyrillic_IO ] }; }; partial alphanumeric_keys xkb_symbols "phonetic" { name[Group1]= "Russia - Phonetic"; key AE01 { [ 1, exclam ] }; key AE02 { [ 2, at ] }; key AE03 { [ 3, Cyrillic_io ] }; key AE04 { [ 4, Cyrillic_IO ] }; key AE05 { [ 5, Cyrillic_hardsign ] }; key AE06 { [ 6, Cyrillic_HARDSIGN ] }; key AE07 { [ 7, ampersand ] }; key AE08 { [ 8, asterisk ] }; key AE09 { [ 9, parenleft ] }; key AE10 { [ 0, parenright ] }; key AB09 { [ period, greater ] }; key AB10 { [ slash, question ] }; key AB08 { [ comma, less ] }; key AC10 { [ semicolon, colon ] }; key AC11 { [ apostrophe, quotedbl ] }; key LSGT { [ bar, brokenbar ] }; key TLDE { [ Cyrillic_yu, Cyrillic_YU ] }; key LatQ { [ Cyrillic_ya, Cyrillic_YA ] }; key LatZ { [ Cyrillic_ze, Cyrillic_ZE ] }; key LatS { [ Cyrillic_es, Cyrillic_ES ] }; key LatA { [ Cyrillic_a, Cyrillic_A ] }; key LatW { [ Cyrillic_ve, Cyrillic_VE ] }; key LatC { [ Cyrillic_tse, Cyrillic_TSE ] }; key LatX { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key LatD { [ Cyrillic_de, Cyrillic_DE ] }; key LatE { [ Cyrillic_ie, Cyrillic_IE ] }; key LatV { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key LatF { [ Cyrillic_ef, Cyrillic_EF ] }; key LatT { [ Cyrillic_te, Cyrillic_TE ] }; key LatR { [ Cyrillic_er, Cyrillic_ER ] }; key LatN { [ Cyrillic_en, Cyrillic_EN ] }; key LatB { [ Cyrillic_be, Cyrillic_BE ] }; key LatH { [ Cyrillic_ha, Cyrillic_HA ] }; ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... }; |
inside the file we’ll find the layout we are after, which is specified by the following line:
xkb_symbols "phonetic" |
after this line all the mapping is done.
Now let’s look at the letters we would like to change keys for:
key LatX { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key LatH { [ Cyrillic_ha, Cyrillic_HA ] }; key AE12 { [ Cyrillic_che, Cyrillic_CHE ] }; |
A single line above means that the “key <such and such> will map to [ small, and capital ] Russian letter”. So to change this all that needs to be done is to re-map them. For example, if we want <LatX> (just a latin X, or ‘X’ key) to map to “Cyrillic_ha, Cyrillic_HA” instead of “Cyrillic_softsign,Cyrillic_SOFTSIGN”, we just need to change it:
key LatX { [ Cyrillic_ha, Cyrillic_HA ] }; |
Here is how these three letters were changed, so they are more convinient to use as a part of the Russian Phonetic layout from the past:
key AE12 { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key LatX { [ Cyrillic_ha, Cyrillic_HA ] }; key LatH { [ Cyrillic_che, Cyrillic_CHE ] }; |
Now just save the file and exit out from it (in vi it is “:wq”), and restart X (press “Ctrl + Alt + backspace”).
You’ve got yourself a new customized layout now that you can use – enjoy!