GNU/Linux >> Znalost Linux >  >> Linux

Jak přemapovat klíče pod Linuxem pouze pro konkrétní klávesnici

Ano, je to možné pomocí XKB. Na rozdíl od xmodmap může XKB přemapovat vaše klíče pro jednotlivá zařízení.

Poznámka:Ujistěte se, že máte xkbcomp> 1.2.0

Nejprve uveďte svá zařízení pomocí:

xinput list

Dostanete něco takového:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Identifikujte řetězec svého zařízení a upravte následující skript shellu, přičemž změňte řádek sed na řádek, který odpovídá názvu vašeho zařízení. Poté změňte klíče, které potřebujete přemapovat.

Příklad:Načíst xev a stiskněte klávesu, kterou chcete přemapovat. Předpokládejme, že zjistíte, že je to kód klíče 84. Vyhledejte 84 na https://gist.github.com/zoqaeski/3880640. Název klíče je <KP5> . Poté vyhledejte klíč, kterým ho chcete nahradit (ve stejném odkazu, dále níže) a zkopírujte, co je v závorkách. Opakujte postup pro všechny požadované klíče.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Poté jej vytvořte jako zdroj (můžete jej přidat do svého .xinitrc). Vše hotovo! Nyní stisknutím kláves by se měl generovat požadovaný výstup pouze pro zařízení, které jste zadali.

Upravit :Nedávno jsem si všiml, že z nějakého důvodu se nová konfigurace nepoužije okamžitě. Nejprve musíte stisknout klávesu na druhém klávesnici a poté otestujte nakonfigurované klávesy na upravené klávesnici. Nevím, proč se to děje, možná nějaká mezipaměť.


Pro kohokoli jiného, ​​kdo sem přichází z Googlu a chce odpověď více v souladu s tím, v co tazatel původně doufal, jsem si vědom dvou způsobů, jak přemapovat události na evdev úroveň, aby se změna týkala všech aplikací:

  1. udev poskytuje API pro úpravu záznamů hardwarové databáze, které řídí mapování mezi scancodes a keycodes. Tato stránka ArchiWiki, která obsahuje instrukce, výslovně říká, že bude fungovat jak pro X11, tak pro vstup z konzole.

    Podstatou je, že vytvoříte vlastní položku v /etc/udev/hwdb.d/ který se skládá ze vzoru shody zařízení a některých definic přemapování skenovacího kódu na klíčový kód, poté spusťte systemd-hwdb update znovu sestavit databázi a udevadm trigger použijte jej bez restartu.

  2. Vzhledem k tomu, že Wayland nepoužívá klávesnicový subsystém X11 a hlavní skladatelé Wayland jako GNOME Shell a Weston neimplementují uživatelská rozhraní pro konfiguraci příslušných aspektů libinput, někdo napsal démona s názvem evdevremapkeys, který řeší problém podobně jako ovladač uživatelského prostoru G15Daemon pro Logitech. Herní klávesnice G15.

    (Spolkne události, které má v úmyslu přemapovat, takže je nemůže vidět nic jiného, ​​co na zařízení poslouchá, a poté odešle opravené události pomocí uinput API pro vytváření vstupních zařízení na úrovni jádra z uživatelského prostoru.)


Linux
  1. Linux – Hard Remap Keys?

  2. Linux – Jak šáhnout po konkrétním slovu a uchopit text?

  3. Jak odlišíte adresář pouze pro soubory určitého typu?

  1. Linux – Jak používat swapovací prostor pouze v případě nouze?

  2. Jak nastavit klíče SSH pro přihlášení k ssh „bez hesla“ v systému Linux

  3. Jak mapovat klávesy myši jako klávesy klávesnice bez ztráty „numerické klávesnice“ pro Linux?

  1. Jak používat rozšíření shellu pro generování tokenů shellu pod Linuxem

  2. Jak zakázat konkrétní příkaz pro konkrétního uživatele v Linuxu

  3. Jak nastavit klíče SSH pro přihlášení pomocí „veřejného/soukromého klíče“ SSH v systému Linux