
鍵映射與 OSI 模型具有類似的流程,儘管定義不那麼明確。我目前正在以比我想要的更高的級別重新映射。顯然,第 1 層對應於實體鍵盤,第 7 層對應於應用程序,但我不確定還有多少其他層或它們的排列位置。
如果這是一台帶有專用可編程實體鍵盤的桌上型電腦,我就可以了,但可惜,這是一台筆記型電腦,我需要在使用內建鍵盤時維護重新映射。
FWIW,我正在交換以下鍵對:[Tilde/Esc]、[Caps/LCtrl]、[Back{space,slash}]。我也使用 Dvorak,但它是在作業系統中以標準方式配置的。
目前,我正在修改 /usr/share/X11/xkb/keycodes/evdev 以在 X 中進行更改(並為控制台建立自訂佈局文件,但這與此處無關)。我不確定它在“層堆疊”中的位置。
問題:我的鍵盤對映不會轉換為 Proxmox 控制台會話,它使用 Web VNC 用戶端。 (佈局也不適用,但這是預期的。)問題顯然是 VNC 用戶端將鍵盤掛接到尚未應用 evdev 重新映射的較低層。
在 Windows 中,我使用一個名為 KeyTweak 的實用程式來產生註冊表的掃描碼映射,這似乎基本上是「第 3 層」。我玩過的遊戲顯然將鍵盤掛在“第 2 層”,但這幾乎不成問題,因為大多數遊戲中的輸入很少。
綜上所述,我不確定 evdev 在我想像的 OSI 鍵盤模型中的位置,但如何在較低層重新映射?我不需要出於任何原因換出重新映射,因此這種更改基本上可以是永久性的。如果我能在 BIOS 中做到這一點,我會的。
答案1
答案竟然是udev。我基本上是跟著這個帖子,但要點是:
- 安裝
evtest
- 運行
evtest
並按下要重新映射的鍵即可查看兩個都掃描碼和鍵碼。 /etc/udev/hwdb.d/
建立一個名為類似70-keyremap.hwdb
以下內容的 新文件- 我假設這個數字是文件的順序,但我沒有任何現有文件作為其基礎,所以我不確定它的先決條件是什麼,它可能需要比它更高的數字。事實上,
hwdb.d
Tumbleweed 上的目錄對我來說並不存在,所以我必須創建它,但它仍然有效。
- 我假設這個數字是文件的順序,但我沒有任何現有文件作為其基礎,所以我不確定它的先決條件是什麼,它可能需要比它更高的數字。事實上,
- 跑步
systemd-hwdb update
。 - 重啟
_
# This is from the brokkr.net post I linked above
# Format can be found on [https://wiki.archlinux.org/title/Map_scancodes_to_keycodes].
$ cat 70-keymap.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_01=41 # Remap Tilde to Esc
KEYBOARD_KEY_29=01 # Remap Esc to Tilde (evtest showed "1" but when I put that without the leading zero, it was interpreted as the literal [1] key.)
KEYBOARD_KEY_3A=29 # Remap Caps to LCtrl
KEYBOARD_KEY_1D=58 # Remap LCtrl to Caps
KEYBOARD_KEY_0E=43 # Remap Backspace to Backslash
KEYBOARD_KEY_2B=14 # Remap Backslash to Backspace
更新:
上述方法在我的筆記型電腦上效果很好,但是當我連接它時,外部鍵盤仍然使用預設的鍵盤映射。事實證明,這是因為內部鍵盤使用 PS/2 進行通信,PS/2 仍然使用 AT 掃描碼(atkbd
在裝置字串中),但 USB 完全不同。我最終不得不再次運行 evtest 以從 USB 板上獲取掃描碼並編寫另一張地圖。這是我產生的文件:
evdev:atkbd:dmi:*
KEYBOARD_KEY_01=41
KEYBOARD_KEY_29=01
KEYBOARD_KEY_3A=29
KEYBOARD_KEY_1D=58
KEYBOARD_KEY_0E=43
KEYBOARD_KEY_2B=14
evdev:input:b0003v*
KEYBOARD_KEY_70029=41
KEYBOARD_KEY_70035=01
KEYBOARD_KEY_70039=29
KEYBOARD_KEY_700e0=58
KEYBOARD_KEY_7002a=43
KEYBOARD_KEY_70031=14