# coding: utf-8 // // + I overwrite `/usr/share/X11/xkb/symbols/ru` with this file // + my `~/.config/sway/config` contains the following // // ``` // # Keyboard layout // input "1:1:AT_Translated_Set_2_keyboard" { // xkb_layout ru,us // xkb_options grp:shifts_toggle,lv5:ralt_switch_lock // } // ``` // // For XKB options, refer to: // https://www.mankier.com/7/xkeyboard-config#Options-Key_to_choose_5th_level //////////////////////////////////////////////////////////////////////////////// // References: // A) https://medium.com/@damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450 // B) https://www.charvolant.org/doug/xkb/html/index.html // HOW A KEY PRESS BECOMES INTERPRETED INPUT: // // key-codes -> key-symbols -> interpreted input // (`evdev` file) (kbd layout) // ↑ // You are here // // e.g. // "38" -> -> "a" // // 1) // // "Key-codes" (numeric values sent by hardware with "keyup" and "keydown" // signals) are mapped to "Key-symbols" via: // // /usr/share/X11/xkb/keycodes/evdev // or another file in the same directory, as dictated by `/etc/default/keyboard` // (if present) // // e.g. "38" -> // // NOT ALL KEYS BEHAVE THE SAME AS SEEN BY THE OPERATING SYSTEM // * Most keys will repeatedly send signals while being depressed. // * "Modifier keys" (e.g. ctrl, alt) do not. // NOT ALL KEYS CAN BE USED AS MODIFIERS FOR THIS REASON // * Some keys are hardware only (OS does not see them), such as "Fn" // // This step in the chain may be debugged with the `showkey` command // (may need sudo) // 2) // // Keyboard layouts (such as this file) map key-symbols to user input // // List of valid input symbols: // http://wiki.linuxquestions.org/wiki/List_of_Keysyms_Recognised_by_Xmodmap // https://en.wikipedia.org/wiki/List_of_Unicode_characters // // e.g. -> "a" // // The mapping between key-symbols and keysyms (confusing names much ??) // can be "modified" with modifier keys, essentially yielding 2^N potential // available interpretations for N ≤ 3 modifier keys // // prefer using (Shift, ISO_Level_3, and ISO_Level_5) // // The "levels" are enumerated ala binary (+1 offset) // // 1: - NO MODIFIER - // 2: SHIFT // 3: LVL3 // 4: LVL3 SHIFT // 5: LVL5 // 6: LVL5 SHIFT // 7: LVL5 LVL3 // 8: LVL5 LVL3 SHIFT // // //////////////////////////////////////////////////////////////////////////////// // Layout // // _ _ _ ____ // | | _____ _____| | / | |___ \ // | | / _ \ \ / / _ \ | | | __) | // | |__| __/\ V / __/ | | |_ / __/ // |_____\___| \_/ \___|_| |_( ) |_____| // |/ // ┌───────┐ // Level 2 │ Shift │ // Level 1 │ Key │ █ = key removed (maps to nothing) // └───────┘ // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬────────┐ // │ ~ █ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + █ │ │ // │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Bksp │ // ├─────┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬─────┤ // │ │ Q │ W │ F │ P │ G │ J │ L │ U │ Y │ : │ ~ │ } █ │ | │ // │ Tab │ q │ w │ f │ p │ g │ j │ l │ u │ y │ ; │ | │ ] │ \ │ // ┢━━━━━━━━┷┱────┴┬────┴┬────┴┲════╧┱────┴┬────┴┲════╧┱────┴┬────┴┬────┴┬────┴┬────┴─────┤ // ┃ ┃ A │ R │ S │ T │ D │ H │ N │ E │ I │ O │ ! │ │ // ┃ Lvl3 ┃ a │ r │ s │ t │ d │ h │ n │ e │ i │ o │ ? │ Return │ // ┣━━━━━━━━━┻━━━┱─┴───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┴───┬─┴───┲━┷━━━━━━━━━━┪ // ┃ ┃ Z │ X │ C │ V │ B │ K │ M │ < │ > │ \ ┃ ┃ // ┃ Shift ┃ z │ x │ c │ v │ b │ k │ m │ , │ . │ / ┃ Shift ┃ // ┣━━━━━━━┳━━━━━╋━━━━━╈━━━━━╅─────┴─────┴─────┴─────┴─────╆━━━━━╈━━━━━╅─────┺━━━━━━━━━━━━┛ // ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ↑ // ┃ Ctrl ┃ ┃ Win ┃ Alt ┃ Space ┃ Lvl5┃ Ctrl┃ ← ↓ → // ┗━━━━━━━┛ ┗━━━━━┻━━━━━┹─────────────────────────────┺━━━━━┻━━━━━┛ // // _ _ _____ _ _ // | | _____ _____| | |___ / | || | // | | / _ \ \ / / _ \ | |_ \ | || |_ // | |__| __/\ V / __/ | ___) | |__ _| // |_____\___| \_/ \___|_| |____( ) |_| // |/ // ┌──────────────┐ // Level 4 │ Lvl3 + Shift │ // Level 3 │ Lvl3 │ < Page navigation and punctuation > // └──────────────┘ // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬────────┐ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // ├─────┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬─────┤ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ { │ } │ " │ │ PgDn│ PgUp│ Esc │ Del │ │ │ │ // ┢━━━━━━━━┷┱────┴┬────┴┬────┴┲════╧┱────┴┬────┴┲════╧┱────┴┬────┴┬────┴┬────┴┬────┴─────┤ // ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ │ // ┃ Lvl3 ┃ │ │ ( │ ) │ ' │ ← │ ↓ │ ↑ │ → │ BkSp│ Ret │ │ // ┣━━━━━━━━━┻━━━┱─┴───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┴───┬─┴───┲━┷━━━━━━━━━━┪ // ┃ ┃ │ │ │ │ │ │ │ │ │ ┃ ┃ // ┃ Shift ┃ │ │ [ │ ] │ ` │ │ Home│ End │ │ ┃ Shift ┃ // ┣━━━━━━━┳━━━━━╋━━━━━╈━━━━━╅─────┴─────┴─────┴─────┴─────╆━━━━━╈━━━━━╅─────┺━━━━━━━━━━━━┛ // ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ↑ // ┃ ┃ ┃ ┃ ┃ Space ┃ ┃ ┃ ← ↓ → // ┗━━━━━━━┛ ┗━━━━━┻━━━━━┹─────────────────────────────┺━━━━━┻━━━━━┛ // // _ _ ____ __ // | | _____ _____| | | ___| / /_ // | | / _ \ \ / / _ \ | |___ \ | '_ \ // | |__| __/\ V / __/ | ___) | | (_) | // |_____\___| \_/ \___|_| |____( ) \___/ // |/ // ┌──────────────┐ // Level 6 │ Lvl5 + Shift │ // Level 5 │ Lvl5 │ // └──────────────┘ // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬────────┐ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // ├─────┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬─────┤ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ │ │ │ │ - │ + │ * │ = │ & │ │ │ // ┢━━━━━━━━┷┱────┴┬────┴┬────┴┲════╧┱────┴┬────┴┲════╧┱────┴┬────┴┬────┴┬────┴┬────┴─────┤ // ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ │ // ┃ ┃ │ │ │ _ │ │ │ $ │ < │ > │ │ Ret │ │ // ┣━━━━━━━━━┻━━━┱─┴───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┴───┬─┴───┲━┷━━━━━━━━━━┪ // ┃ ┃ │ │ │ │ │ │ │ │ │ ┃ ┃ // ┃ Shift ┃ │ │ │ │ │ │ │ % │ │ ┃ Shift ┃ // ┣━━━━━━━┳━━━━━╋━━━━━╈━━━━━╅─────┴─────┴─────┴─────┴─────╆━━━━━╈━━━━━╅─────┺━━━━━━━━━━━━┛ // ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ↑ // ┃ ┃ ┃ ┃ ┃ Space ┃ Lvl5┃ ┃ ← ↓ → // ┗━━━━━━━┛ ┗━━━━━┻━━━━━┹─────────────────────────────┺━━━━━┻━━━━━┛ // // // _ _ _____ ___ // | | _____ _____| | |___ | ( _ ) // | | / _ \ \ / / _ \ | / / / _ \ // | |__| __/\ V / __/ | / /_ | (_) | // |_____\___| \_/ \___|_| /_/( ) \___/ // |/ // ┌─────────────────────┐ // Level 8 │ Lvl5 + Lvl3 + Shift │ // Level 7 │ Lvl5 + Lvl3 │ // └─────────────────────┘ // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬────────┐ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // ├─────┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬─────┤ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ // ┢━━━━━━━━┷┱────┴┬────┴┬────┴┲════╧┱────┴┬────┴┲════╧┱────┴┬────┴┬────┴┬────┴┬────┴─────┤ // ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ │ // ┃ Lvl3 ┃ │ │ │ │ │ │ │ │ │ │ │ │ // ┣━━━━━━━━━┻━━━┱─┴───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┺═══╤═┹───┬─┴───┬─┴───┬─┴───┲━┷━━━━━━━━━━┪ // ┃ ┃ │ │ │ │ │ │ │ │ │ ┃ ┃ // ┃ Shift ┃ │ │ │ │ │ │ │ │ │ ┃ Shift ┃ // ┣━━━━━━━┳━━━━━╋━━━━━╈━━━━━╅─────┴─────┴─────┴─────┴─────╆━━━━━╈━━━━━╅─────┺━━━━━━━━━━━━┛ // ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ↑ // ┃ ┃ ┃ ┃ ┃ ┃ Lvl5┃ ┃ ← ↓ → // ┗━━━━━━━┛ ┗━━━━━┻━━━━━┹─────────────────────────────┺━━━━━┻━━━━━┛ // //////////////////////////////////////////////////////////////////////////////// // partial, because we're ignoring special function keys, F-## keys, Key Pad, etc. // specifically, we claim that we're only addressing the alphanumeric_keys and modifier_keys default partial alphanumeric_keys modifier_keys xkb_symbols "basic" { name[Group1]= "Custom"; key.type[Group1] = "EIGHT_LEVEL"; // First Row // Level: 1 2 3 4 5 6 7 8 key {[ NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // ` ~ key {[ 1, exclam, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 1 ! key {[ 2, at, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 2 @ key {[ 3, numbersign, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 3 # key {[ 4, dollar, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 4 $ key {[ 5, percent, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 5 % key {[ 6, asciicircum, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 6 ^ key {[ 7, ampersand, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 7 & key {[ 8, asterisk, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 8 * key {[ 9, parenleft, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 9 ( key {[ 0, parenright, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // 0 ) key {[ minus, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // - _ key {[ NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // = + // Second Row // Level: 1 2 3 4 5 6 7 8 key {[ q, Q, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // Q key {[ w, W, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // W key {[ f, F, braceleft, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // E key {[ p, P, braceright, NoSymbol, asciicircum, NoSymbol, NoSymbol, NoSymbol ]}; // R key {[ g, G, quotedbl, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // T key {[ j, J, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // Y key {[ l, L, Next, NoSymbol, minus, NoSymbol, NoSymbol, NoSymbol ]}; // U key {[ u, U, Prior, NoSymbol, plus, NoSymbol, NoSymbol, NoSymbol ]}; // I key {[ y, Y, Escape, NoSymbol, asterisk, NoSymbol, NoSymbol, NoSymbol ]}; // O key {[ semicolon, colon, Delete, NoSymbol, equal, NoSymbol, NoSymbol, NoSymbol ]}; // P key {[ bar, asciitilde, NoSymbol, NoSymbol, ampersand, NoSymbol, NoSymbol, NoSymbol ]}; // [ { key {[ NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // ] } key {[ NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // \ | // Third (Home) Row // Level: 1 2 3 4 5 6 7 8 key {[ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Shift ]}; // TAB key {[ a, A, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // A key {[ r, R, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // S key {[ s, S, parenleft, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // D key {[ t, T, parenright, NoSymbol, underscore, NoSymbol, NoSymbol, NoSymbol ]}; // F key {[ d, D, apostrophe, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // G key {[ h, H, Left, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // H key {[ n, N, Down, NoSymbol, dollar, NoSymbol, NoSymbol, NoSymbol ]}; // J key {[ e, E, Up, NoSymbol, less, NoSymbol, NoSymbol, NoSymbol ]}; // K key {[ i, I, Right, NoSymbol, greater, NoSymbol, NoSymbol, NoSymbol ]}; // L key {[ o, O, BackSpace, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // ; : key {[ question, exclam, Return, NoSymbol, Return, NoSymbol, NoSymbol, NoSymbol ]}; // ' " // key // Fourth Row // Level: 1 2 3 4 5 6 7 8 key {[ z, Z, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // Z key {[ x, X, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // X key {[ c, C, bracketleft, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // C key {[ v, V, bracketright, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // V key {[ b, B, grave, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // B key {[ k, K, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // N key {[ m, M, Home, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // M key {[ comma, less, End, NoSymbol, percent, NoSymbol, NoSymbol, NoSymbol ]}; // , < key {[ period, greater, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // . > key {[ slash, backslash, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]}; // / ? // Fifth Row // Level: 1 2 3 4 5 6 7 8 key {[ Control_L, Control_L, Control_L, Control_L, Control_L, Control_L, Control_L, Control_L ]}; key {[ Super_L, Super_L, Super_L, Super_L, Super_L, Super_L, Super_L, Super_L ]}; key {[ Alt_L, Alt_L, Alt_L, Alt_L, Alt_L, Alt_L, Alt_L, Alt_L ]}; key {[ space, space, space, space, space, space, space, space ]}; key {[ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift ]}; key {[ Control_R, Control_R, Control_R, Control_R, Control_R, Control_R, Control_R, Control_R ]}; };