Portál AbcLinuxu, 27. dubna 2024 02:50

Úprava map kláves X.org

2.12.2021 17:58 | Přečteno: 6135× | Výběrový blog | poslední úprava: 2.12.2021 17:58

Často je praktické mít možnost změnit funkci vybranách kláves, ať už z důvodu nepohodlného ovládání software nebo používání klávesnice, na kterou si uživatel nemůže zvyknout. Dlouhou dobu k tomu byl na X.org systémech používán nástroj xmodmap, který má své limity a také bývá označován za zastaralý, a tak je někdy třeba zasáhnout přímo do souboru s rozvržením klávesnice.

Soubory s informacemi o rozvrženích klávesnic se zpravidla nachází v /usr/share/X11/xkb. Nás bude zajímat zejména podadresář symbols, ve kterém jsou uloženy jednotlivé mapy kláves jako textové soubory. Nejspíše nás bude zajímat soubor cz nebo us, který obsahuje českou, resp. americkou mapu kláves.

Je možné zasahovat přímo do těchto souborů. To má několik nevýhod: upravené mapy kláves mohou být přepsány při aktualizaci operačního systému, změny se projeví u všech uživatelů (to někdy může být žádoucí) a je nutné k těmto souborům přistupovat s právy roota.

Je možné také vlastní mapu kláves k těmto přidat. Další možností je vytvořit si mapu kláves mimo tuto adresářovou stukturu a zvolit ji připraveným skriptem (viz níže). Touto možností se tento zápisek zabývá.

Příprava adresářové struktury

Naše mapa kláves bude vyžadovat několik souborů, vytvoříme si pro ně tedy adresář, dejme tomu ~/kbd. V něm si vytvoříme adresář symbols, který odpovídá celosystémovému /usr/share/X11/xkb/symbols.

Hlavní soubor

Pro zavedení mapy kláves bude nutný také soubor ~/kbd/main.mkb. Jeho obsah může být následující:
default partial alphanumeric_keys modifier_keys

xkb_keymap {
  xkb_keycodes {
    include "evdev+aliases(qwerty)"
  };

  xkb_types {
    include "complete"
  };

  xkb_compat {
    include "complete"
  };

  xkb_symbols {
    include "pc+us(cz_sk_de)+inet(evdev)+custom"
  };
};
Na posledním řádku s include je uveden seznam map kláves, které se budou nastavovat. Později uvedená přepisuje předchozí. Zde upravuji variantu cz_sk_de rozvržení us. Pokud chcete upravovat například českou klávesnici, napište místo us(cz_sk_de) toto: cz

Poslední uvedenou mapou kláves je custom, kterou si nyní vytvoříme.

Soubor symbolů

Soubor ~/kbd/symbols/custom bude obsahovat úpravy mapy kláves.

Napišme do něj toto:
partial xkb_symbols {
  // …
}
Syntaxe je nápadně podobná programovacímu jazyku C. Komentáře zajsou uzavřeny v /**/ nebo, jsou-li na konci řádku, jsou uvozenu //.

Předtím, než začneme vyjmenovávat klávesy a jejich význam, určíme typ kláves. Ten se vztahuje vždy jen na klávesy uvedené po něm a to až do nastavení jiného typu. Typ se určí pomocí:
key.type = "ONE_LEVEL";
ONE_LEVEL znamená, že klávesa není ovlivněna modifikátory (Shift, Alt Gr). Další možnou hodnotou je FOUR_LEVEL (pro klávesy s různými významy podle toho, jestli jsou stisknuty klávesy Shift a Alt Gr). Také nás může zajímat typ FOUR_LEVEL_MIXED_KEYMAP, který funguhe podobně jako FOUR_LEVEL, ale pokud je zapnutý Num Lock, obrátí se výžnam klávesy Shift. Potom, co jsme určili typ kláves, můžeme zapisovat jednotlivé klávesy. Formát je následující (pro klávesu typu FOUR_LEVEL:
key <AC05> { [ a, b, c, d ] };
Tento řádek nám určí to, že klávesa s kódem AC05 (klávesa „g“) bude psát „a“, se shiftem „b“, s Alt Gr „c“ a se Shiftem a Alt Gr „d“. Namísto „a“, „b“, „c“ a „d“ můžete psát jiné názvy symbolů. Jejich výčet naleznete v souboru /usr/include/X11/keysymdef.h na řádcích #define (v souboru custom ale bez XK_). Pro určení znaku Unicode použijte zápis Uxxxx, kde xxxx je kód znaku šestnáčtkově. U kláves typu ONE_LEVEL pište jen jeden symbol:
key <AC05> { [ a ] };
Pokud chcete například zaměnit Escape a Caps Lock, napište:
key.type = "ONE_LEVEL";
key <CAPS> { [ Escape ] };
key <ESC>  { [ Caps_Lock ] };

Nastavení mapy kláves

Vstupte do adresáře ~/kbd a spusťte xkbcomp -I ~/kbd main.kbd "$DISPLAY". Dávejte si pozor na to, že si mužete změnou mapy kláves znemožnit další práci s počítačem (do změny mapy nebo ukončení X serveru). Doporučuji Vám připravit si další počítač s SSH spojením nebo v menu pro změnu mapy kláves v desktopovém prostředí. Změny vrátíte například pomocí setxkbmap:
setxkbmap cz
Pokud se připojujete po SSH, budete nejspíše muset nastavit proměnnou DISPLAY. Např.:
DISPLAY=:0 setxkbmap cz
Pro trvalé nastavení z příkazu vytvořte skript a nastavte jeho spuštení po přihlášení.
Při tvorbě map kláves se můžete inspirovat už existujícími mapami. Zde je mapa kláves podobná us(cz_sk_de) rozšířená o klávesu compose, trojtečku, české uvozovky na Alt Gr+vg, anglické na Alt Gr+gh a numerickou klávesnicí pro psaní šestnáctkových čísel a zadávání do tabulkového procesoru volené pomocí Alt Gr. Klávesa Print Screen (krátkým stiskem) přepne numerickou klávesnici do režimu pro kreslení rámečků.
partial xkb_symbols {
  name[Group1] = "US/CZ keyboard extension";
  name[Group2] = "Typography and graphics";

  // Swap Escape and Caps Lock
  key.type = "ONE_LEVEL";
  key <CAPS> { [ Escape ] };
  key <ESC> { [ Caps_Lock ] };

  // Group switching
  key.type = "FOUR_LEVEL";
  key <PRSC> { [ ISO_Next_Group, ISO_Prev_Group ] };

  // NBSP
  key.type = "FOUR_LEVEL";
  key <SPCE> { [ space, nobreakspace, nobreakspace, nobreakspace ] };

  //// Group 1 ////

  // Alphabetic key mappings
  key.type = "FOUR_LEVEL";
  key <AC05> { [ g, G, leftdoublequotemark, leftsinglequotemark ] };
  key <AC06> { [ h, H, rightdoublequotemark, rightsinglequotemark ] };
  key <AB04> { [ v, V, doublelowquotemark, singlelowquotemark ] };
  key <AC10> { [ semicolon, colon, uring, Uring ] };
  key <AD11> { [ bracketleft, braceleft, uacute, Uacute ] };
  key <AC11> { [ apostrophe, quotedbl, U2026, section ] }; // U2026 — Hor. ellipsis
  key <AC07> { [ j, J, U2193, U21D3 ] }; // U2193 — down arrow; U21D3 — double down arrow
  key <AC08> { [ k, K, U2191, U21D1 ] }; // U2191 — up arrow; U21D1 — double up arrow
  // ↓↓↓ Empty level below ↓↓↓
  key <AC09> { [ l, L, U22EE ] }; // U22EE — vertical ellipsis
  // ↓↓↓ Empty level below ↓↓↓
  key <AD10> { [ p, P, U03C0 ] }; // U03C0 — greek small pi

  // Compose key
  key.type = "ONE_LEVEL";
  key <LSGT> { [ Multi_key ] };

  // Hex numpad   │
  //            ╭─╯
  // ┏━┳┳━━━━━━━┻━━━━━━━━┓
  // ┣━┻┻━┯━━━━┯━━━━┯━━━━┫  Modifiers:
  // ┃    │    │    │    ┃  
  // ┃   ⇩│÷  /│✕  *│   -┃  ┏━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━┓
  // ┠────┼────┼────┼────┨  ┃ AltGr + Shift │ Shift         ┃
  // ┃A   │B   │C   │    ┃  ┠───────────────┼───────────────┨
  // ┃a  7│b  8│c  9│    ┃  ┃ AltGr         │ (none)        ┃
  // ┠────┼────┼────┤T   ┃  ┗━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━┛
  // ┃D   │E   │F   │A   ┃
  // ┃d  4│e  5│f  6│B  +┃
  // ┠────┼────┼────┼────┨
  // ┃;   │    │NB  │    ┃
  // ┃:  1│x  2│SP 3│    ┃
  // ┠────┴────┼────┤   R┃
  // ┃         │,   │   E┃
  // ┃        0│.  .│=  T┃
  // ┗━━━━━━━━━┷━━━━┷━━━━┛
  key.type = "FOUR_LEVEL_MIXED_KEYPAD";
  key <KP1> { [ KP_End, KP_1, colon, semicolon ] };
  key <KP2> { [ KP_Down, KP_2, x ] };
  key <KP3> { [ KP_Next, KP_3, space, nobreakspace ] };

  key <KP4> { [ KP_Left, KP_4, d, D ] };
  key <KP5> { [ NoSymbol, KP_5, e, E ] };
  key <KP6> { [ KP_Right, KP_6, f, F ] };

  key <KP7> { [ KP_Home, KP_7, a, A ] };
  key <KP8> { [ KP_Up, KP_8, b, B ] };
  key <KP9> { [ KP_Prior, KP_9, c, C ] };

  key <KPEN> { [ KP_Enter, KP_Enter, KP_Equal ] };
  key <KPDL> { [ period, period, comma ] };
  key <KPDV> { [ KP_Divide, KP_Divide, U00f7 ] };
  key <KPMU> { [ KP_Multiply, KP_Multiply, U2715 ] };
  key <KPAD> { [ KP_Add, KP_Add, Tab ] };

  //// Group 2 ////

  // Box drawing keypad
  //
  // ⇩  /│ *  -- (minus becomes horizontal line)
  // 7┌ 8┬ 9┐ SP (plus becomes space)
  // 4├ 5┼ 6┤
  // 1└ 2┴ 3┘ 
  //
  // No modifiers      Thin lines     ├┼┤
  // Shift/NumLockOff  Thicker lines  ┣╋┫
  // AltGr             Double lines   ╠╬╣
  // AltGr+Shift       Special lines  ╭╮╰╯┠┨┯┷
  key <KP1> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2517,
      U2514,
      U255A,
      U2570
    ]
  };
  key <KP2> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U253B,
      U2534,
      U2569,
      U2537
    ]
  };
  key <KP3> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U251b,
      U2518,
      U255d,
      U256f
    ]
  };
  key <KP4> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2523,
      U251c,
      U2560,
      U2520
    ]
  };
  key <KP5> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U254b,
      U253c,
      U256c
    ]
  };
  key <KP6> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U252b,
      U2524,
      U2563,
      U2528
    ]
  };
  key <KP7> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U250f,
      U250c,
      U2554,
      U256d
    ]
  };
  key <KP8> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2533,
      U252c,
      U2566,
      U252f
    ]
  };
  key <KP9> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2513,
      U2510,
      U2557,
      U256e
    ]
  };
  key <KPDV> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2503,
      U2502,
      U2551
    ]
  };
  key <KPSU> {
    type[Group2] = "FOUR_LEVEL_MIXED_KEYPAD",
    symbols[Group2] = [
      U2501,
      U2500,
      U2550
    ]
  };
  key <KPAD> {
    type[Group2] = "ONE_LEVEL",
    symbols[Group2] = [ space ]
  };

  include "level3(ralt_switch)"
};
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

2.12.2021 18:07 Miriam | blog: RychlovarnaKonvice
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin
skrytý komentář Náš administrátor shledal tento komentář závadným.

Toto není příspěvek hodný AbcL

Zobrazit komentář
3.12.2021 11:07 Sahan
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Za trest budeš muset pít ze sperma hrnečku
3.12.2021 15:37 _
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
2.12.2021 18:55 Miriam | blog: RychlovarnaKonvice
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin
Omlouvám se, mělo to být: Díky za zajímavý zápisek!
Gréta avatar 2.12.2021 22:44 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin

vubec nevim co to jakoby je tamten režim kreslení rámečků :O :O

supr blogísek jinak :D ;D

oslavná píseň na pana soudruha generalisima prezidentčíka Petra Pavla Pávka 🎶🫡🦚🎶
3.12.2021 17:20 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Viz „box drawing keypad“ v konfiguraci – namísto čísel numerická klávesnice píše rámečky. Takto: ├┴ ┣┻ ╠╩ ┠┷
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Gréta avatar 5.12.2021 18:40 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Úprava map kláves X.org

nj ale nevim k čemu to je jakože dobrý :D

7.12.2021 17:44 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
╭────┬─────────╮
│ č. │  slovo  │
├────┼─────────┤
│ 01 │ Pro     │
│ 02 │ tabulky │
│ 03 │ v       │
│ 04 │ prostém │
│ 05 │ textu   │
└────┴─────────┘
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Gréta avatar 7.12.2021 21:56 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Úprava map kláves X.org

to mě nenapadlo :D :D

xkucf03 avatar 14.12.2021 11:09 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Úprava map kláves X.org

A kdybys to nechtěla vyťukávat na klávesnici, tak můžeš jedním příkazem:

relpipe-in-cli --relation 'textová_tabulka' --attribute 'č.' string --attribute 'slovo' string --records 01 Pro 02 tabulky 03 v 04 prostém 05 textu | relpipe-out-tabular --write-types false --write-record-count false --write-relation-name false

získat přesně stejný výstup.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
4.12.2021 14:07 drnest | skóre: 13 | blog: Dřinu nechte strojům
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin
Pěkný. K tomu se někdy vrátím. Já si upravuju mapu, ale přímo v těch systémových adresářích. Že to jde i někde mimo mě nenapadlo. Dík.
Blaazen avatar 5.12.2021 19:19 Blaazen | skóre: 24 | blog: BL
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Já si jen edituju /home/$USER/.Xmodmap
! -*- coding: utf-8 -*-
! print semicolon instead of section {;, §}

! keycode  48 = section exclam section exclam apostrophe ssharp apostrophe

keycode  48 = semicolon exclam semicolon exclam apostrophe ssharp apostrophe
Tohle píše středník místo paragrafu.
Petr Tomášek avatar 6.12.2021 11:25 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin
No, a teď mi poraď, jak přidat novou kl. mapu, tak aby sis ji mohl vybrat pěkně v GUI a nemusel používat setxkbmap (protože normálně např. přidání USB zařízení načte zase tu starou kl. mapu...)
multicult.fm | monokultura je zlo | welcome refugees!
6.12.2021 11:47 plostenka | blog: plstnk
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Na to jsou udev pravidla v /etc/udev/rules.d/nejlepsejsiklavesnice.rules, GUI netreba. Neco jako:

ACTION=="add",KERNEL=="kb*",RUN=="/bin/true"
Petr Tomášek avatar 6.12.2021 22:35 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Co to dělá normálně? Kudy to co spouští?
multicult.fm | monokultura je zlo | welcome refugees!
7.12.2021 10:40 plostenka | blog: plstnk
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Udev je systemovy demon ktery slouzi k tomu, aby se stalo "neco" po fyzickem pripojeni/odpojeni/... nejakeho hardwaru, v tvem pripade pripojeni klavesnice. Da se to specifikovat obecne (libovolna klavesnice) nebo konkretne (s timhle ID). Vic "man udev" nebo internety.

Jako uzivatel to nijak nespoustis, funguje automaticky. Normalne treba pripoji flashku kdyz ji strcis do USB portu.
Fluttershy, yay! avatar 6.12.2021 11:57 Fluttershy, yay! | skóre: 92 | blog:
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
GUI to načítá podle výčtů v /usr/share/X11/xkb/rules/. Nemám vyzkoušeno, jestli si jde přidat vlastní do domovského adresáře.
🇵🇸Touch grass🇺🇦 ✊ no gods, no masters
6.12.2021 16:10 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Volítka klávesnice v DE (prinejmenším v KDE) s mapou v home nepočítají.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Petr Tomášek avatar 6.12.2021 22:32 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
No, já si asi před 12 lety vytvořil vlastní kl. mapy a udělal skript, který se to snažil do onoho adresáře přidat. Pak něco převorali v X11 a už se mi to nepodařilo upravit tak, aby to fungovalo. Pravda, moc času a energie jsem tím trávit nechtěl. Pravdou je, že tenhle systém vůbec nepočítá s tím, že by někdo chtěl přidávat vlastní klávesové mapy, což je dost na palici...
multicult.fm | monokultura je zlo | welcome refugees!
7.12.2021 17:25 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Ono to nějak jde. Přinejmenším to na jednom systému mám nastavené.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
7.12.2021 17:27 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Abych byl přesnější, setxkbmpu postačí jen mapa v …/symbols/, volítka v desktopových prostředí hledají informace jinde.

Jak je na tom Wayland? Je možné na něm upravit klávesovou mapu?
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
7.12.2021 17:39 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Takže u mě to vypadá takto (cesty relativně k /usr/share/X11/xkb/, layout se jmenuje custom):

rules/base, ř. 46:
! $threelevellayouts = al az custom be br bt ca ch cs cz de
// atd.

// ---snip--- ř. 213

! model layout variant = symbols
 * custom basic = pc+custom
// atd.
rules/xorg něco podobného.

rules/xorg.lst, kolem ř. 195:
! layout
 custom Custom
 us English (US)
atd.
rules/xorg.xml:
<xkbConfigRegistry version="1.1">
  <!-- … -->
  <layoutList>
    <layout>
      <configItem>
        <name>custom</name>
        <shortDescription>custom</shortDescription>
        <description>Custom</description>
        <languageList>
          <iso639Id>cst</iso639Id>
        </languageList>
      </configItem>
      <configItem>
        <name>us</name>
        <shortDescription>en</shortDescription>
        <description>English (US)</description>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <!-- … -->
    </layout>
    <!-- … -->
  </layoutList>
<!-- … -->
</xkbConfigRegistry>
V rules/base.xml obdobně.

Nevím, jestli je to správně, ale v KDE to funguje.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
6.12.2021 14:27 drnest | skóre: 13 | blog: Dřinu nechte strojům
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
No já jsem použil takovou nepěknou věc, že jsem si svoji mapu vrazil místo Dvorak - tu vím ze nepoužiju. No pak jde v GUI vybrat "české rozložení Dvorak" a natáhne se to co jsem mu tam podstrčil já.
6.12.2021 16:09 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
To jsem také řešil, ale moc si na to nevzpomínám (podívám se). Musela být v systémovém adresáři s mapami a upravil se tam i nějaký soubor s výčtem map.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Petr Fiedler avatar 7.12.2021 21:31 Petr Fiedler | skóre: 35 | blog: Poradna | Brno
Rozbalit Rozbalit vše Re: Úprava map kláves X.org
Odpovědět | Sbalit | Link | Blokovat | Admin

Super. Díky.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.