每當我插入 USB 鍵盤時,所有鍵盤的佈局都會重設為某些系統預設值(美國佈局,沒有我想要的修飾符和其他按鍵)。我在許多 Debian 和 Ubuntu 系統上都觀察到了這一點,包括 Ubuntu 16.04 和 18.04。這種行為已經存在很長時間了。
我在沒有桌面環境的情況下使用 X11(儘管一些 Gnome 惡魔往往會開始使用)。… | xkbcomp - "$DISPLAY"
當我登入時,我使用 XKB (特別是)設定鍵盤佈局。
當我插入 USB 鍵盤時,我希望它具有我的佈局,而不是系統佈局。事實上,我希望系統繼續對已經存在的鍵盤(如果有)和新插入的鍵盤使用我目前的佈局。如果這是不可能的,我會決定重新套用一個佈局我選擇了。
同樣,兩個鍵盤上的重複率設定為登入時預設值,而不是我使用 設定的速率xset r
。
如何防止鍵盤熱插拔重置鍵盤佈局和重複率?或者如果失敗了,我怎麼能至少將其重置為我選擇的佈局?
有一個相當笨拙的方法是使用 udev 規則。它很笨拙,因為它假設只有一個 X 伺服器,最有問題的是,它假設用戶具有 root 權限。我沒有root權限,因此任何涉及設定 udev 規則或編輯的方法Xorg.conf
在這裡都不適用。
答案1
xkbcomp - "$DISPLAY"
當我登入時,我使用 XKB 設定鍵盤佈局(特別是… | )。如何防止鍵盤熱插拔重置鍵盤佈局和重複率?
並不是說它重置了它。如果您已插入鍵盤,並且要新增第二個鍵盤,則舊鍵盤將繼續使用相同的設定。
問題在於,載入 xkb 配置的客戶端方式(使用xkbcomp
)或伺服器端(使用setxkbmap
)只會將佈局應用於現有的實際設備,而不是「核心鍵盤」抽象。當設備被拔掉時,其設定就會遺失。
解決方案是在添加鍵盤時監控您自己,並使用您的首選設定調用xkbcomp
/setxkbmap
和。xset r rate
為此,你做不是需要任何 udev 規則或任何 root 權限;任何X11 用戶端程式可以透過 X11 輸入擴展監視輸入裝置的變更並對其進行操作。
可以從 shell 中使用該程序,並且可以在apt-get
Debian 和類似發行版上輕鬆安裝inputplug
。
例子:
$ cat ./on-new-kbd
#! /bin/sh
keymap=/path/to/your/keymap
echo >&2 "$@"
event=$1 id=$2 type=$3
case "$event $type" in
'XIDeviceEnabled XISlaveKeyboard')
xset r rate 200 50
xkbcomp -i "$id" "$keymap" "$DISPLAY"
esac
$ chmod 755 ./on-new-kbd
$ inputplug -d -c ./on-new-kbd
<plug keyboard>
XIDeviceEnabled 13 XISlavePointer GASIA USB KB V11
XISlaveAdded 13 XIFloatingSlave GASIA USB KB V11
XISlaveAdded 14 XIFloatingSlave GASIA USB KB V11
XIDeviceEnabled 14 XISlaveKeyboard GASIA USB KB V11
請注意-i
選項xkbcomp
—您可以為每個鍵盤使用不同的設定。該協議還允許在每個設備的基礎上設置重複率,但我不知道如何使用xset
.
當然,您的視窗管理器/桌面環境本身可能會偵聽這些事件並覆寫您的設定。
答案2
我剛剛使用 USB 開關在兩個系統之間共用鍵盤時遇到了相同的問題。當我切換回 Pop!_OS 20.04 LTS 系統(Debian/Ubuntu 衍生系統)時,設定消失了。我一直使用gnome-tweak
設定Caps Lock來表現得像一個Ctrl.
這就是對我來說一直起作用的設定。我找到了這種命令列方式將其設定為我想要的,這樣我就不必繼續運行gnome-tweak
來解決問題。
dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']"
的手冊頁xkeyboard-config
有一個允許值的清單xkb-options
以及簡要說明。
我不知道如何防止該問題發生,但現在我可以從命令列修復它,這不再那麼煩人。