在 Debian 中,如何更改單個 USER-SPECIFIC 文件中的鍵盤映射以供 X(通過 setxkbmap)和(核心)虛擬控制台(TTY)使用?
這不是以與 X/控制台無關的方式更改控制台 (tty) 和 X 上的鍵盤佈局/映射的副本嗎?,其中討論了系統範圍
/etc/default/keyboard
。我正在尋找一個使用者特定的文件,
~/.keyboard
,它的xkb
設置被 X(例如,+ LXDE)以及(核心)虛擬控制台(VT/TTY)使用。從 中可以看出,如果在執行時保留了使用者的環境
cat $(which setupcon)
,則虛擬控制台可以獲取使用者特定的~/.keyboard
文件(或其中的一個) :VARIANT``setupcon
sudo -E setupcon
將
setupcon
(或多或少)將基於 xkb 的~/.keyboard
設置(XKBMODEL
、、、XKBLAYOUT
等XKBOPTIONS
)轉換為控制台鍵盤映射類型(通過ckbcomp
)並將loadkeys
結果轉換為控制台。如果不保留使用者的環境,sudo setupcon
然後
/etc/default/keyboard
被撿起來。但是,據我所知,在 X 中
setxkbmap
只獲取系統範圍的/etc/default/keyboard
文件。使用者特定~/.keyboard
的不被 拾取setxkbmap
。但這就是我需要的。換句話說,我正在嘗試~/.keyboard
餵給setxkbmap
. 我希望能夠在 X 登錄時完成此操作(例如,在 中使用一行~/.xsessionrc
),以及能夠~/.keyboard
在 X 中進行更改並通過setxkbmap
(不使用sudo
)應用它們,就像setxkbmap -option
提供的那樣。請注意,我並不是要手動創建使用者特定的 xkb 目錄層次結構並將其與
xkbcomp -I
. 但是,如果有一種自動化的方法可以將其~/.keyboard
作為輸入,那麼這可能是一種可接受的解決方法。到目前為止,我看到的唯一方法是 hack:手動 parse
~/.keyboard
,提取XKBOPTIONS
然後setxkbmap -option
為每個編寫一個等價物。我不敢相信這種黑客攻擊是唯一的方法,儘管看到https://who-t.blogspot.com/2020/02/user-specific-xkb-configuration-part-1.html讓我質疑這種信念。到目前為止,我正在使用帶有 X (+ LXDE) 的 Debian。我認為這對 Wayland 沒有影響,但如果有,請解釋一下。
如果它對其他人有用,這是我上面提到的我現在最終使用的 hack。
~/bin/setxkbmap.sh
解析~/.keyboard
、提取 xkb 設置並在 X 中執行等效的 setxkbmap 命令。~/bin/setxkbmap.sh
可以手動呼叫,也可以在 X 啟動時通過例如 中的一行自動呼叫~/.xsessionrc
。
~/bin/setxkbmap.sh
:#!/bin/bash # Parse ~/.keyboard, extracting the xkb settings, and run equivalent # setxkbmap command(s) in X. source ~/.keyboard setxkbmap_cmd=(setxkbmap -model "${XKBMODEL}") setxkbmap_cmd+=(-layout "${XKBLAYOUT}") # Clear previously-set options first; otherwise, these will be # appended to whatever is already there. setxkbmap_cmd+=(-option) # -r : do not allow backslashes to escape any characters # -a array: assign the words read to sequential indices of the array # variable ARRAY, starting at zero IFS=',' read -r -a xkbopts <<< "${XKBOPTIONS}" for opt in "${xkbopts[@]}"; do setxkbmap_cmd+=(-option "${opt}") done "${setxkbmap_cmd[@]}"
~/.keyboard
:XKBMODEL="pc105" XKBLAYOUT="us" # ctrl: specifies options coming from /usr/share/X11/xkb/symbols/ctrl # file. XKBOPTIONS="ctrl:menu_rctrl,ctrl:nocaps,ctrl:swap_rwin_rctl,terminate:ctrl_alt_bksp"
~/.xsessionrc
:# ~/.xsessionrc is sourced by Xsession (a sh script), everytime an X # session is started. See 'man xsession' for details. # Explicitly use bash, as ~/.xsessionrc is called by sh (dash in # Debian 9 GNU/Linux). bash ~/bin/setxkbmap.sh