Caps Lock を Backspace に再マッピングしました。
/etc/default/キーボード
XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
BACKSPACE="guess"
XKBOPTIONS="caps:backspace"
これは非常にうまく機能しますが、一部の特定のツールでは機能しません。xev
何が起こっているのか調べるのに使用しました。
バックスペースが押されました
KeyPress event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749),
state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
XLookupString gives 1 bytes: (08) "
XmbLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749),
state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
XLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
CapsLockが押されました
KeyPress event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 859789, (391,558), root:(508,672),
state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
XKeysymToKeycode returns keycode: 22
XLookupString gives 1 bytes: (08) "
XmbLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x2400001,
root 0x159, subw 0x0, time 859875, (391,558), root:(508,672),
state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
XKeysymToKeycode returns keycode: 22
XLookupString gives 1 bytes: (08) "
XFilterEvent returns: False
ブラウザでも試してみました
addEventListener('keyup', event => {
console.log(event.keyCode, event.key, event.code)
})
バックスペースとキャップスロックを押すと、次のログが記録されます。
8 "Backspace" "Backspace"
8 "Backspace" "CapsLock"
つまり、基本的に Caps Lock は Backspace に再マップされますが、これはツールと Web サイトが適切なチェックを使用している場合にのみ機能します。これを誤って実装している、使用するすべてのツールまたは Web サイトに対してバグ レポートを提出したくはありません。
再マップされた Caps Lock のように動作するのではなく、バックスペースを完全にエミュレートするように Caps Lock をマップすることは可能ですか?
答え1
まず、キーの押下がどのように処理されるかを見てみましょう(この答え):
/キーボード/ → scancode
→ /入力ドライバ/ → keycode
→ /XサーバーXKB/ →keysym
はscancode
、特定のキーにバインドされたデバイス固有のコードであり、ベンダー/製品によって異なる場合があります。keycode
と はkeysym
アプリケーションに伝播されます。keycode
は、デバイスやロケールに依存しないため、抽象化レイヤーとして機能します。 は、ロケールと修飾キーの状態に応じて、keycode
異なる を生成する可能性があります。これが、一部のアプリケーションが、特にキーボード ショートカットを扱うときにkeysym
のみを検索する理由です。keycode
scancode
したがって、私たちの目標は、CapsLock キーの をkeycode
BackSpace キーの にマッピングすることです。アプリケーションは、BackSpace キーと CapsLock キーのどちらを押してもkeycode
、同じものを認識するようになります。keysym
このマッピングはユーデブ使用してhアードわはdアタb/lib/udev/hwdb.d/
ase ファイル (hwdb.bin) は、との両方で .hwdb ファイルからコンパイルされます/etc/udev/hwdb.d/
。
変更方法scancode
->keycode
マッピング
必要な情報を収集する
まず、入力デバイス (キーボード) の、 、をbustype
決定する必要があります。また、再マッピングするキーの と、マッピング先の を決定する必要があります。vendor
product
version
scancode
key code identifier
を実行しevtest
(最初にインストールする必要がある場合があります)、デバイスの一覧でキーボードを特定します。再生/一時停止、WWW などの追加キーがあるキーボードでは、これらのキーは別の入力デバイスとして公開されることがよくあります。キーを押しても出力が得られない場合は、Control+を押してC別のデバイスを試してください。キーボードを特定したら、最初の列 ( ) を覚えておき/dev/input/eventX
、再マップするキーを押します。その後の値(MSC_SCAN)
が ですscancode
。私のキーボードでは:
$ evtest
Available devices:
/dev/input/event0: Power Button
/dev/input/event1: Power Button
/dev/input/event2: G19 Gaming Keyboard
/dev/input/event3: G19 Gaming Keyboard
...
Select the device event number [0-18]:2
...
Event: time 1522111203.117945, -------------- SYN_REPORT ------------
Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039
Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1
...scancode
は70039。
次に、次のコマンドを実行します。ここでは、eventX
前に選択したものになります。
$ grep "" /sys/class/input/eventX/device/id/*
私のキーボードの出力は
/sys/class/input/event2/device/id/bustype:0003
/sys/class/input/event2/device/id/product:c228
/sys/class/input/event2/device/id/vendor:046d
/sys/class/input/event2/device/id/version:0110
を取得するにはkey code identifier
、の出力を使用するかevtest
、キーとボタン完全なリストについては、のセクションを参照してください。識別子は小文字に変換された/usr/include/linux/input-event-codes.h
部分です。たとえば、KEY_
KEY_BACKSPACE
バックスペース。
udevを設定する
を見てください/lib/udev/hwdb.d/
。テキストファイルを作成します。/etc/udev/hwdb.d/
ファイル名は、デバイスの種類に対応するファイルより大きい数字で始まります。キーボードの場合、これは 60 より大きい任意の数字にすることができますが、ポインティングスティックの場合は 70 より大きい必要があります65-keyboard-custom.hwdb
。たとえば、 です。お気に入りのテキストエディタを使用してください。ただし、 として開始する必要があることに注意してくださいroot
。例:
$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb
次のコンテンツを追加します
evdev:input:b[bustype]v[vendor]p[product]e[version]*
KEYBOARD_KEY_[scancode]=[key code identifier]
...どこ
- [バスタイプ]、[ベンダー]、[製品]、[バージョン]は4文字(必要な場合はゼロで埋める)で、文字は大文字
- [スキャンコード]はパディングを必要としませんが、文字は小文字
- この
evdev:...
ラインは前にスペースなし - この
KEYBOARD_KEY...
ラインは直前のスペースは1つだけ
私の例では、ファイルは次のようになります。
evdev:input:b0003v046DpC228e0110*
KEYBOARD_KEY_70039=backspace # map CapsLock to BackSpace
最初の行はデバイスに一致します。追加のevdev:
行を指定したり、ワイルドカード ( ) を複数使用して*
追加のデバイスに一致させたりできますが、スキャンコードはデバイス固有であることに留意してください。また、複数のスキャンコードマッピングを追加することもできます。 を参照してください。/lib/udev/hwdb.d/60-keyboard.hwdb
このファイルのより詳細で最新のバージョンは、オンラインリポジトリ。
新しい設定を適用する
新しい構成をハードウェア データベースにコンパイルします。
$ sudo systemd-hwdb update
変更をすぐに適用したい場合は、udev に通知します。
$ sudo udevadm trigger
設定値は、システムの実行中にのみ追加または変更できることに注意してください。設定 (スキャンコード マッピングなど) を削除した場合、変更を有効にするには再起動する必要があります。
以前行った再マッピングも ( を使用/etc/default/keyboard
) 元に戻すことを忘れないでください。これは、すべてのキーボードに引き続き適用されるためです。